zoukankan      html  css  js  c++  java
  • LeetCode: 18. 4Sum

    递归调用的例子,参考网上的实现https://discuss.leetcode.com/topic/46339/my-solution-generalized-for-ksums-in-java/5

    class Solution {
           int len =0;
        public List<List<Integer>> fourSum(int[] nums, int target) {
            len = nums.length;
            Arrays.sort(nums);
            return kSum(nums, target, 4,0);
        }
        
        private ArrayList<List<Integer>> kSum(int[] nums,int target,int k,int index ){
            ArrayList<List<Integer>> list = new ArrayList<>();
            if(index>=nums.length){
                return list;
            }
            if(k==2){
                int left = index;
                int right = nums.length-1;
                while(left<right){
                    if(nums[left]+nums[right]==target){
                            //list.add(Arrays.asList(nums[left],target-nums[left]));
                           List<Integer> temp = new ArrayList<>();
                        temp.add(nums[left]);
                        temp.add(nums[right]);
                           list.add(temp);
                        while(left<right&&nums[left]==nums[left+1]){
                            left++;
                        }
                        while(left<right&&nums[right]==nums[right-1]){
                            right--;
                        }
                        left++;
                        right--;
                    }else if(nums[left]+nums[right]<target){
                        left++;
                    }
                    else if(nums[left]+nums[right]>target){
                        right--;
                    }
                    
                }    
            }else{
                for (int i = index; i < len - k + 1; i++) {
                    //use current number to reduce ksum into k-1sum
                    ArrayList<List<Integer>> temp = kSum(nums, target - nums[i], k-1, i+1);
                    if(temp != null){
                        //add previous results
                        for (List<Integer> t : temp) {
                            t.add(0, nums[i]);
                        }
                        list.addAll(temp);
                    }
                    while (i < len-1 && nums[i] == nums[i+1]) {
                        //skip duplicated numbers
                        i++;
                    }
                }
            }
            return list;
        }
    }
  • 相关阅读:
    C语言I博客作业05
    C语言I博客作业04
    C语言II博客作业01
    学期总结
    第一周作业
    C语言I博客作业08
    C语言I博客作业07
    C语言I博客作业06
    C语言I博客作业05
    C语言I博客作业04
  • 原文地址:https://www.cnblogs.com/Michael2397/p/8019219.html
Copyright © 2011-2022 走看看