Leetcode-18. 4Sum

前言:为了后续的实习面试,开始疯狂刷题,非常欢迎志同道合的朋友一起交流。因为时间比较紧张,目前的规划是先过一遍,写出能想到的最优算法,第二遍再考虑最优或者较优的方法。如有错误欢迎指正。博主首发CSDN,mcf171专栏。

博客链接:mcf171的博客

——————————————————————————————

Given an array  S of  n integers, are there elements  abc, and  d in  S such that  a +  b +  c +  d = target? Find all unique quadruplets in the array which gives the sum of target.

Note: The solution set must not contain duplicate quadruplets.

For example, given array S = [1, 0, -1, 0, -2, 2], and target = 0.

A solution set is:
[
  [-1,  0, 0, 1],
  [-2, -1, 1, 2],
  [-2,  0, 0, 2]
]
这个题目基本就是3Sum的进一步泛化,简单修改了之后时间效率为O(n^3),两层循环加一个两端逼近。 Your runtime beats 3.95% of java submissions.

public class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        Arrays.sort(nums);
        List<List<Integer>> results = new ArrayList<List<Integer>>();
        if(nums.length < 4 ) return new ArrayList();
        if(nums.length == 4 && (nums[0] + nums[1] + nums[2] + nums[3]) == target){
            List<Integer> result = new ArrayList<Integer>();
            result.add(nums[0]);
            result.add(nums[1]);
            result.add(nums[2]);
            result.add(nums[3]);
            results.add(result);
            return results;
        }

        for(int i = 0 ; i < nums.length -3; i ++){
            if (i == 0 || (i > 0 && nums[i] != nums[i-1])) {
                for(int j = i + 1; j < nums.length-2; j ++) {
                    if (j == i+1 ||  nums[j] != nums[j-1]) {
                        int l = j + 1, r = nums.length - 1;

                        while (l < r) {
                            List<Integer> result = new ArrayList<Integer>();
                            if ((nums[l] + nums[r] + nums[j] + nums[i]) > target ) r--;
                            else if ((nums[l] + nums[r] + nums[j] + nums[i]) < target) l++;
                            else {
                                result.add(nums[l]);
                                result.add(nums[r]);
                                result.add(nums[i]);
                                result.add(nums[j]);
                                while (l < r && nums[l] == nums[l + 1]) l++;
                                while (l < r && nums[r] == nums[r - 1]) r--;
                                l++;
                                r--;
                            }
                            if (result.size() != 0)
                                results.add(result);
                        }
                    }
                }
            }
        }
        return results;
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值