//三数和为0的问题。要求去重,并且输出数字有序。public List<List<Integer>> threeSum(int[] nums) { Arrays.sort(nums); List<List<Integer>> lists = new ArrayList<List<Integer>>(); //对于i去重,因为p在i后面,所以不能往后去重,可能会把p的值去掉,所以要往前去重。 for(int i = 0; i < nums.length; i ++) { if(i>0&&nums[i] == nums[i-1]) { continue; } int p = i+1, q = nums.length - 1; while(p < q) { int sum = nums[i]+nums[p]+nums[q]; if(sum == 0) { List<Integer> list = new ArrayList<>(); list.add(nums[i]); list.add(nums[p]); list.add(nums[q]); lists.add(list); //p去重很巧妙,先自加,然后判断之前p的值和自加后的值是不是相等,如果相等,再次自加,同时也避免的去重时和q重叠。 while(++p < q && nums[p] == nums[p-1]) { } while(--q > p && nums[q] == nums[q+1]) { } } if(sum < 0) { p++; } if(sum > 0) { q--; } } } return lists; }
//三数和最接近某个值public int threeSumClosest(int[] nums, int target) { Arrays.sort(nums); int temp = 0; int dist = Integer.MAX_VALUE; for(int i = 0; i < nums.length; i ++) { if(i > 0 && nums[i]==nums[i-1]) { continue; } int p = i + 1, q = nums.length-1; while(p < q) { int sum = nums[i] + nums[p] + nums[q]; if(sum > target) { if((sum - target) < dist) { dist = sum - target; temp = sum; } q--; } else if(sum < target) { if((target - sum) < dist) { dist = target - sum; temp = sum; } p++; } else { return sum; } } } return temp; }
时间: 2024-10-07 21:50:00