Q15 三数之和

锦通  金牌会员 | 2024-7-29 12:49:42 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 981|帖子 981|积分 2943

思绪

我的思绪,先排序,循环确定前两个值,末了一个值二分
看了题解:
末了两个值可以使用双指针,因为是有序的,而且是求和
注意重复值:
  1. public List<List<Integer>> threeSum(int[] nums) {
  2.         Arrays.sort(nums);
  3.         List<List<Integer>> resultList = new ArrayList<>();
  4.         for (int i = 0; i < nums.length-2; i++) {
  5.             if (i!=0 && nums[i] == nums[i-1]){
  6.                 continue;
  7.             }
  8.             resultList.addAll(twoSum(i+1, nums[i],nums));
  9.         }
  10.         return resultList;
  11.     }
  12.     private List<List<Integer>> twoSum(int index, int first, int[] nums) {
  13.         List<List<Integer>> resultList = new ArrayList<>();
  14.         int left = index;
  15.         int right = nums.length-1;
  16.         while (left<right){
  17.             if (nums[left] + nums[right] + first == 0){
  18.                 List<Integer> list = new ArrayList<>(3);
  19.                 list.add(first);
  20.                 list.add(nums[left]);
  21.                 list.add(nums[right]);
  22.                 resultList.add(list);
  23.                 left = findNext(left,nums);
  24.             } else if (nums[left] + nums[right] +  first >0) {
  25.                 right--;
  26.             }else {
  27.                 left++;
  28.             }
  29.         }
  30.         return resultList;
  31.     }
  32.     //避免出现重复,如果右移和右边一样
  33.     private int findNext(int left, int[] nums) {
  34.         int index = left+1;
  35.         while (index < nums.length &&nums[index] == nums[left]){
  36.             index++;
  37.         }
  38.         return index;
  39.     }
  40.     ```
  41.    
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

锦通

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表