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;
    }
}
posted on 2021-09-21 16:55  溪水静幽  阅读(84)  评论(0)    收藏  举报