18.四数之和

简介: 18.四数之和

四数之和,类似三数之和

 

排序后,双层循环+ 双指针 ,中间进行一些剪枝操作。

时间复杂度O(n^3).

    public List<List<Integer>> fourSum(int[] nums, int target) {
        List<List<Integer>>  results = new ArrayList<List<Integer>>();
        //异常处理
        if (nums == null || nums.length < 4){
            return results;
        }
        //排序
        Arrays.sort(nums);
        int length = nums.length;
        //a
        for (int i = 0; i < length-3; i++) {
            if (i > 0 && nums[i] == nums[i-1]) {
                continue;
            }
            //a+其余3个的最小值 > target,当前a无解,后面的更大,所以跳过后面所有的。
            if (nums[i] + nums[i+1] + nums[i+2] + nums[i+3] >target){
                break;
            }
            //a+其余3个的最大值 < target,当前a无解,后面a变大时可能有解
            if (nums[i] + nums[length-3]+ nums[length-2] + nums[length-1] <target){
                continue;
            }
            //b
            for (int j = i+1; j < length - 2 ; j++) {
                //和a类似
                if (j > i+1 && nums[j] == nums[j-1]) {
                    continue;
                }
                if (nums[i]+nums[j] + nums[j+1] + nums[j+2] > target) {
                    break;
                }
                if (nums[i] + nums[j] + nums[length-2] + nums[length-1] < target) {
                    continue;
                }
                //双指针c,d
                int left = j+1 , right = length - 1;
                while (left < right) {
                    int sum = nums[i] + nums[j] + nums[left] + nums[right];
                    if (sum == target) {
                        results.add(Arrays.asList(nums[i],nums[j], nums[left], nums[right]));
                        while (left < right && nums[left] == nums[left+1]) {
                            left++;
                        }
                        left++;
                        while (left <right && nums[right] == nums[right-1]) {
                            right--;
                        }
                        right--;
                    } else if (sum < target) {
                        left++;
                    }else {
                        right--;
                    }
 
                }//end c,d
 
            }// end b
 
        }// end a
 
 
        return  results;
    }
相关文章
|
1月前
18. 四数之和
18. 四数之和
25 2
|
1月前
18.四数之和
18.四数之和
16 0
|
1月前
[leetcode] 四数之和 M
[leetcode] 四数之和 M
|
1月前
|
人工智能 Java C++
leetcode-454:四数相加 II
leetcode-454:四数相加 II
24 1
|
1月前
|
Java 测试技术 C++
leetcode-18:四数之和
leetcode-18:四数之和
30 0
|
1月前
|
Java
leetcode-53:最大子序和
leetcode-53:最大子序和
23 0
|
算法 安全 Swift
LeetCode - #18 四数之和
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
Leecode 18. 四数之和
Leecode 18. 四数之和
38 0
leetcode:18.四数之和
这题和前面的一道三数之和类似,解题的思路都一样,这里直接选取两个基准就可以了,然后循环出所有的组合进行判断,如果正好相等那么就加入Set集合中。
45 0
|
算法
LeetCode:454. 四数相加 II
题目描述:给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 <= i, j, k, l < n nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0