目录
题目链接:三数之和
思路分析:排序+双指针
- 排序
- 依次固定一个数a
- 在该数后面的区间内,利用“双指针算法”快速找到两个数的和等于-a即可
细节处理
1.去重
找到一个符合的结果后,left和right指针要跳过重复的元素
当使用完一次双指针算法后,a也需要跳过重复的元素
2.不漏
找到一种结果后,不要“停”,要缩小区间,继续往下寻找
3.小改进
如果a大于0,那么之后的数相加不可能为0(因为前面已经排序了),所以如果a大于0就可以直接break
画图解析
代码
public List<List<Integer>> threeSum(int[] nums) { Arrays.sort(nums); List<List<Integer>> ret=new ArrayList<>(); int n= nums.length; for (int i = 0; i < n; ) { //小改进 if(nums[i]>0){ break; } int left=i+1,right=n-1,flag=-nums[i]; while (left<right){ int sum=nums[left]+nums[right]; if (sum>flag){ right--; } else if (sum<flag) { left++; }else { ret.add(new ArrayList<>(Arrays.asList(nums[i],nums[left],nums[right]))); //不漏 left++; right--; //去重 while (left<right&&nums[left]==nums[left-1]){ left++; } //left<right:防止越界 while (left<right&&nums[right]==nums[right+1]){ right--; } } } //去重 i++; while (i<n&&nums[i]==nums[i-1]){ i++; } } return ret; }
题目链接:四数之和
思路分析: 排序+双指针
- 排序
- 依次固定一个数a
- 在a后面的区间内,利用“三数之和”找到三个数,使这三个数的和等于target-a即可
- 依次固定一个数b
- 在b后面的区间内,利用“双指针”找到两个数,使这两个数的和等于target-a-b即可
细节处理
1.去重
找到一个符合的结果后,left和right指针要跳过重复的元素
当使用完一次双指针算法后,a也需要跳过重复的元素
当使用完一次双指针算法后,b也需要跳过重复的元素
2.不漏
找到一种结果后,不要“停”,要缩小区间,继续往下寻找
画图解析
代码
public List<List<Integer>> fourSum(int[] nums, int target) { Arrays.sort(nums); List<List<Integer>> ret=new ArrayList<>(); int n= nums.length; for (int i = 0; i <n ; ) { for (int j = i+1; j < n; ) { int left=j+1,right=n-1; long flag=(long)target-nums[i]-nums[j]; while (left<right){ int sum=nums[left]+nums[right]; if(sum>flag){ right--; } else if (sum<flag) { left++; }else { ret.add(new ArrayList<>(Arrays.asList(nums[i],nums[j],nums[left],nums[right]))); //不漏 left++; right--; //去重 while (left<right&&nums[left]==nums[left-1]) left++; while (left<right&&nums[right]==nums[right+1]) right--; } } //去重 j++; while (j<n&&nums[j]==nums[j-1]) j++; } //去重 i++; while (i<n&&nums[i]==nums[i-1]) i++; } return ret; }
本文内容到此结束了,
如有收获欢迎点赞收藏💖关注✔️,您的鼓励是我最大的动力。
如有错误疑问💬欢迎各位指出。
主页:发呆的百香果子_spring,软件测试-CSDN博客求同存异,与光同尘🏃🏃