春招打卡d5n08-leetcode刷题18四数之和

127 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

leetcode18四数之和

前文

本文为leetcode遍历相关题目,题目需要为18,主要考察遍历时对于效率的优化。

题目信息

给你一个由 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 你可以按 任意顺序 返回答案 。

解题思路

根据题目内容,本题需要在给定的数组中,找到四个数字加和为目标值。由于有四个元素一一对应会被认为是相同的一组数,因此在寻找过程中还要增加校验。处理时首先将目标数组排序,这样降低了处理重复数据时的复杂程度。而在遍历过程中,很容易想到的直接循环复杂度过高,因此这里采用双指针+双循环的方式降低复杂度。只要两个指针分别从左右两侧移动,在过程中计算是否满足目标值即可。

解题代码

public List<List<Integer>> fourSum(int[] nums, int target) {
    nums = Arrays.stream(nums).sorted().toArray();
    List<List<Integer>> result = new ArrayList<>();
    if(nums.length < 4){
        return result;
    }
    for (int i = 0; i < nums.length - 3; i++) {
        if(i - 1 >= 0 && nums[i - 1] == nums[i]){
            continue;
        }
        for (int j = i + 1; j < nums.length - 2; j++) {
            if(j - 1 >= i + 1 && nums[j - 1] == nums[j]){
                continue;
            }
            int p = j + 1;
            int q = nums.length - 1;
            while (p < q){
                if(p-1>=j + 1 && nums[p - 1] == nums[p]){
                    p++;
                    continue;
                }
                if(q+1<=nums.length-1 && nums[q + 1] == nums[q]){
                    q--;
                    continue;
                }

                if(nums[i] + nums[j] + nums[p] + nums[q] == target){
                    List<Integer> item = new ArrayList<>();
                    item.add(nums[i]);
                    item.add(nums[j]);
                    item.add(nums[p]);
                    item.add(nums[q]);
                    result.add(item);
                    p++;
                }else if(nums[i] + nums[j] + nums[p] + nums[q] == target){
                    p++;
                }else{
                    q--;
                }
            }
        }
    }
    return result;
}

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。