赞
踩
- public List<List<Integer>> threeSum(int[] nums) {
- List<List<Integer>> res = new ArrayList<>();
- Arrays.sort(nums);
-
- for (int i = 0; i < nums.length; i++) {
- if (nums[i] > 0) {
- return res;
- }
-
- // 防止i重复:
- // 如果nums[i] == nums[i - 1],则说明该数字重复,会导致结果重复,所以应该跳过
- // i > 0 防止数组越界
- // [-4,-1,-1,0,1,2],不去重,就会有重复的三元组:[[-1,-1,2],[-1,0,1],[-1,0,1]]
- if (i > 0 && nums[i] == nums[i - 1]) {
- continue;
- }
-
- int left = i + 1;
- int right = nums.length - 1;
- while (left < right) {
- int sum = nums[i] + nums[left] + nums[right];
- if (sum > 0) {
- right--;
- } else if (sum < 0) {
- left++;
- } else {
- // 找到一个三元组
- res.add(Arrays.asList(nums[i], nums[left], nums[right]));
- // [-2,0,0,2,2], left:1、right:4,此时如果不去重,就会有重复的三元组[-2,0,2]
- // 防止left重复:
- // 如果sum = 0时,nums[left] == nums[left + 1],则会导致结果重复,应该跳过
- while (left < right && nums[left] == nums[left + 1]) {
- left++;
- }
-
- // 防止right重复:
- // 如果sum = 0时,nums[right] == nums[right -1],则会导致结果重复,应该跳过
- while (left < right && nums[right] == nums[right -1]) {
- right--;
- }
- // 继续寻找是否有其他三元组
- left++;
- right--;
- }
- }
- }
- return res;
- }
- public List<List<Integer>> fourSum(int[] nums, int target) {
- List<List<Integer>> result = new ArrayList<>();
- Arrays.sort(nums);
-
- for (int i = 0; i < nums.length; i++) {
-
- // nums[i] > target 直接返回, 剪枝操作
- if (nums[i] > 0 && nums[i] > target) {
- return result;
- }
-
- if (i > 0 && nums[i - 1] == nums[i]) { // 对nums[i]去重
- continue;
- }
-
- for (int j = i + 1; j < nums.length; j++) {
-
- if (j > i + 1 && nums[j - 1] == nums[j]) { // 对nums[j]去重
- continue;
- }
-
- // 以下与“三数之和”相同
- int left = j + 1;
- int right = nums.length - 1;
- while (right > left) {
- // nums[k] + nums[i] + nums[left] + nums[right] > target int会溢出
- long sum = (long) nums[i] + nums[j] + nums[left] + nums[right];
- if (sum > target) {
- right--;
- } else if (sum < target) {
- left++;
- } else {
- result.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right]));
- // 对nums[left]和nums[right]去重
- while (right > left && nums[right] == nums[right - 1]) {
- right--;
- }
- while (right > left && nums[left] == nums[left + 1]) {
- left++;
- }
-
- left++;
- right--;
- }
- }
- }
- }
- return result;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。