H-三数之和
+class Solution { public List<List<Integer>> threeSum(int[] nums) { Arrays.sort(nums); List<List<Integer>> result = new ArrayList<List<Integer>>(); for( int i = 0; i < nums.length; i++){ if(nums[i] > 0){ break; } //当nums[i] == nums[i - 1]时,i和L和R都组合过了 if(i > 0 && nums[i] == nums[i - 1]){ continue; } int L = i + 1; int R = nums.length - 1; while(L < R){ int sum = nums[i]+nums[L]+nums[R]; if (sum == 0){ List<Integer> tem = new ArrayList<Integer>(); tem.add(nums[i]); tem.add(nums[L]); tem.add(nums[R]); result.add(tem); //去重(这//一部分要放在if语句里面,不然有的案例不满足) while(L/<R && nums[L] == nums[L+1]){ L++; } while(L<R && nums[R] == nums[R-1]){
R--; } L++; R--; }else if(sum < 0){ L++; }else { R--; } // if(nums[L+1] == nums[L]){ // L++; } } //用Set去重会导致超出内存限制的问题 // Set<List<Integer>> ok = new HashSet<>(); // for(List i : result){ // ok.add(i); // } return new ArrayList<List<Integer>>(result); } }
思路
标签:数组遍历
首先对数组进行排序,排序后固定一个数 nums[i],再使用左右指针指向 nums[i]后面的两端,数字分别为 nums[L]和 nums[R],计算三个数的和 sum判断是否满足为 0,满足则添加进结果集
如果 nums[i]大于 0,则三数之和必然无法等于 0,结束循环
如果 nums[i] == nums[i−1],则说明该数字重复,会导致结果重复,所以应该跳过
当 sum == 0 时,nums[L]nums[L]nums[L] == nums[L+1]则会导致结果重复,应该跳过,L++
当 sum== 0 时,nums[R] == nums[R−1 则会导致结果重复,应该跳过,R−−
时间复杂度:O(n^2) ,n为数组长度

浙公网安备 33010602011771号