三数之和
- 先对传过来的数组排序
- 定格1个元素,其余两个元素用左右两个指针控制
- 相加为0则赋值,大于0则右边指针左移,小于左指针右移(因为排过序,大了左移,小了右移动),这样可以查出某个定格元素对应其他元素的值
- 外层定格元素变值循环
代码
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> list = new ArrayList<>();
Arrays.sort(nums);//排序
for(int i=0;i<nums.length-2;i++){
if (i>0 && nums[i] == nums[i - 1]) {//避免重复
continue;
}
int l = i+1;
int r = nums.length-1;//定义左右
while(l<r){
if(nums[i]+nums[l]+nums[r]==0){
List<Integer> in = new ArrayList<>();
in.add(nums[i]);
in.add(nums[l]);
in.add(nums[r]);
list.add(in);
while (l<r && nums[l+1] == nums[l]){// 判断重复
l++;
}
while (l<r && nums[r-1] == nums[r]){
r--;
}
l++;
r--;
}else if(nums[i]+nums[l]+nums[r]>0){//说明大了,网小的地方走,故右边向左移
r--;
}else{ //小了,网大移动,l++
l++;
}
}
} //一次循环找出a[i]跟后面所以数据为0的可能性
return list;
}
}