3Sum & 4Sum
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
输入:nums = [-1,0,1,2,-1,-4] 输出:[[-1,-1,2],[-1,0,1]] 输入:nums = [] 输出:[] 输入:nums = [0] 输出:[]
题解
class Solution { public List<List<Integer>> threeSum(int[] nums) { if (null == nums || nums.length < 3) { return new ArrayList<>(); } Set<List<Integer>> res = new HashSet<>(); Arrays.sort(nums); for (int i = 0; i < nums.length; i++) { int target = -nums[i]; int startIdx = i + 1; int endIdx = nums.length - 1; while (startIdx < endIdx) { int result = nums[startIdx] + nums[endIdx]; if (target == result) { res.add(Arrays.asList(nums[i], nums[startIdx], nums[endIdx])); startIdx++; endIdx--; } else if (target < result) { endIdx--; } else { startIdx++; } } } return new ArrayList<>(res); } }
给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] :
0 <= a, b, c, d < n
a、b、c 和 d 互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target
输入:nums = [1,0,-1,0,-2,2], target = 0
输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]
public static List<List<Integer>> fourSum(int[] nums, int target) { if (null == nums || nums.length < 4) { return new ArrayList<>(); } Set<List<Integer>> res = new HashSet<>(); Arrays.sort(nums); for (int i = 0; i < nums.length-3; i++) { int remainTarget = target - nums[i]; for (int j = i + 1; j < nums.length-2; j++) { int LeftTarget = remainTarget - nums[j]; int startIdx = j + 1; int endIdx = nums.length - 1; while (startIdx < endIdx) { int result = nums[startIdx] + nums[endIdx]; if (LeftTarget == result) { res.add(Arrays.asList(nums[i], nums[j], nums[startIdx], nums[endIdx])); startIdx++; endIdx--; } else if (LeftTarget < result) { endIdx--; } else { startIdx++; } } } } return new ArrayList<>(res); }
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
输入:nums = [-1,2,1,-4], target = 1 输出:2 解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
class Solution { public int threeSumClosest(int[] nums, int target) { if (null == nums || nums.length < 3) { return 0; } int best = 10000000; Arrays.sort(nums); for (int i = 0; i < nums.length; i++) { int startIdx = i + 1; int endIdx = nums.length - 1; while (startIdx < endIdx) { int result = nums[i] + nums[startIdx] + nums[endIdx]; int nearestValue = Math.abs(result-target); if (nearestValue <= Math.abs(best - target)) { best = result; } if (target < result) { endIdx--; } else { startIdx++; } } } return best; } }
立志如山 静心求实
浙公网安备 33010602011771号