. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/3sum/
这个题相较于前几个题来说比较难,思想是前面一个题目的延伸。
题目要求三个数的和,按照前面一个题目求两个数的和的思想,我们只需要把其中的一个数固定起来,另外两个数再按照之前的方法来做出两数相加的和,这个sum 和固定起来的那个数字加起来为0。
例如此时,i等于-4,于是我们只需要找到 left + right为 4 的时候的值,
乍一听是不是很简单?但其实有一些不容易被察觉到的点,比如:
- 图中left右边仍然是-1,就需要让left连续向右移动两位
- 等到left和right加起来是我们需要的值的时候,我们仍然需要让left和right继续向左向右移动,因为还有可能会有别的组合也能达到这个值
- left 和 right 走完这一趟后,i需要向右移动,如果 i 碰到的和之前是一样的,则需要向右移动两位;i必须小于等于0,这样才能做到left + right的值为i的相反数
用两个循环,一个是固定i的循环,一个是让left+right找值的循环:
class Solution {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> ret = new ArrayList<>();Arrays.sort(nums);int n = nums.length;for(int i = 0 ; i < n ;){if(nums[i] > 0){break;}int left = i + 1;int right = n-1;int target = -nums[i];while(left < right){int sum = nums[left] + nums[right];if(sum > target){right--;}else if(sum < target){left++;}else{ret.add(new ArrayList<Integer>(Arrays.asList(nums[i],nums[left],nums[right])));left++;right--;while(left < right && nums[left] == nums[left-1]){left++;}while(left < right && nums[right] == nums[right+1]){right--;}}}i++;while(i < n && nums[i] == nums[i-1]){i++;}}return ret;}
}