LeetCode 15
https://leetcode-cn.com/problems/3sum/
我做这个题的感觉正如讨论区中第一赞说的那样。。因为以前做过2sum的题,所以下意识考虑使用两个循环,把问题转变成2sum的类型,但是发现做出来很有问题。所以就去看了讨论区的说法。
class Solution { public List<List<Integer>> threeSum(int[] nums) { List<List<Integer>> result = new ArrayList<>(); Arrays.sort(nums); for(int i = 0;i<nums.length-2;i++){ if(i == 0 || (i>0 && nums[i] != nums[i-1])){ int l = i+1; int r = nums.length-1; int sum = 0-nums[i]; while(l<r){ if(nums[l]+nums[r] == sum){ result.add(Arrays.asList(nums[i],nums[l],nums[r])); while(l<r && nums[l] == nums[l+1]){ l++; } while(l<r && nums[r] == nums[r-1]){ r--; } l++; r--; }else if(nums[l]+nums[r]<sum){ while(l < r &&nums[l] == nums[l+1]){ l++; } l++; }else{ while(l < r &&nums[r] == nums[r-1]){ r--; } r--; } } } } return result; } }
首先先对原数组进行排序,这是基本操作。
然后使用一个指针,来访问开始的位置。
这里使用到了一个技巧以避免出现T的问题
if(i == 0 || (i>0 && nums[i] != nums[i-1]))
这个是为了防止第一个元素就出现相同的情况。
下面如果找到l r满足nums[i]+nums[l]+nums[r] == 0的情况,就直接加入result这个list中,然后让l r分别寻找到下一个不同的元素然后再来作比较。这个思想有点像之前做的那个最大的盛水容器的题。