美文网首页
数组类(一):leetcode No.18. 4Sum 四数之和

数组类(一):leetcode No.18. 4Sum 四数之和

作者: GavinLaw | 来源:发表于2020-03-25 01:00 被阅读0次

    题目什么的都不贴了,来的人都看过题目,以后这个主要是写给我自己复盘总结,顺便蹭点粉。

    代码:

    class Solution {
        public List<List<Integer>> fourSum(int[] nums, int target) {
            Arrays.sort(nums);
            List<List<Integer>> list = new ArrayList<List<Integer>>();
            for(int i=0;i<nums.length-3;i++){
                if(i>0&&nums[i]==nums[i-1]) continue;
                for(int j=i+1;j<nums.length-2;j++){
                    if(j>i+1&&nums[j]==nums[j-1]) continue;
                    int lo = j+1;
                    int hi = nums.length-1;
                    while(lo<hi){
                        if(nums[i]+nums[j]+nums[lo]+nums[hi]==target){
                            list.add(Arrays.asList(nums[i], nums[j], nums[lo],nums[hi]));
                            while(lo<hi&&nums[lo]==nums[lo+1])  lo++;
                            while(lo<hi&&nums[hi]==nums[hi-1]) hi--;
                            hi--;
                            lo++;
                        }
                        else if(nums[i]+nums[j]+nums[lo]+nums[hi]>target){
                            hi--;
                        }
                        else{
                            lo++;
                        }
                    }
                }
            }
            return list;
        }
    }
    

    分析:
    这个时间复杂度是O(n3),主要处理过程就是,第一防止重复,第二就是注意边界,i应该不能超过nums.length-3
    然后我就想:有三数之和,二数之和,四数之和,那是不是有k数之和?

    然后看下讨论,居然有人写了k数之和的递归代码,nb!

    k数之和代码:

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    public 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>> res = new ArrayList<>();
            if(index>=len){
                return res;
            }
            if(k==2){
                int i=index,j=len-1;
                while(i<j){
                    if(target-nums[i]==nums[j]){
                        List<Integer> temp = new ArrayList<>();
                        temp.add(nums[i]);
                        temp.add(nums[j]);
                        res.add(temp);
                        //跳过重复
                        while(i<j&&nums[i]==nums[i+1]) i++;
                        while(i<j&&nums[j]==nums[j-1]) j--;
                        i++;j--;
                    }
                    //往左边移动
                    else if(nums[i]+nums[j]>target){
                        j--;
                    }
                    else{//往右边移动
                        i++;
                    }
                }
            }
            else{
                for(int i=index;i<len-k+1;i++){
                    //跳过重复
                    if(i>index&&nums[i]==nums[i-1]){
                        continue;
                    }
                    ArrayList<List<Integer>> temp = kSum(nums,target-nums[i],k-1,i+1);
                    if(temp!=null){
                        for(List<Integer> t : temp){
                            t.add(0,nums[i]);
                        }
                        res.addAll(temp);
                    }
                }
            }
            return res;
        }
    }
    

    相关文章

      网友评论

          本文标题:数组类(一):leetcode No.18. 4Sum 四数之和

          本文链接:https://www.haomeiwen.com/subject/zymzyhtx.html