Leetcode18: 四数之和

class Solution {
    //主函数调用
    public List<List<Integer>> fourSum(int[] nums, int target) {
        Arrays.sort(nums);
        List<List<Integer>> result = kSum(nums,target,4,0);
        return result;
    }
    //k数之和
    public List<List<Integer>> kSum(int[] nums, int target, int k, int start){
        List<List<Integer>> res = new ArrayList<>();
        if(start >= nums.length) return res;
        //先把两数之和写好
        if(k == 2){
            int n = nums.length, i = start, j = n - 1;
            while(i < j){
                if(nums[i] + nums[j] == target){
                    List<Integer> elem = new ArrayList<>();
                    elem.add(nums[i]);
                    elem.add(nums[j]);
                    res.add(elem);
                    while(i < j && nums[i] == nums[i+1]) ++i;
                    while(j > i && nums[j] == nums[j-1]) --j;
                    i++;
                    j--;
                }else if(nums[i]+ nums[j] < target) i++;
                else j--;
            }
            return res;
        }
        //之后就是递归的过程了
        if(k > 2){
            for(int i = start; i < nums.length - k + 1; i++){
                List<List<Integer>> temp = kSum(nums,target - nums[i], k-1,i+1);
                if(temp!=null){
                    for(List<Integer> l : temp){
                        l.add(0,nums[i]);
                    }
                    res.addAll(temp);
                }
                while(i < nums.length -1 && nums[i] == nums[i+1]) ++i;
            }
            return res;
        }
        return res;
    }
 }
全部评论

相关推荐

04-18 15:58
已编辑
门头沟学院 设计
kaoyu:这一看就不是计算机的,怎么还有个排斥洗碗?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务