1. 程式人生 > >[leetcode]18. 4Sum

[leetcode]18. 4Sum

這一題和那個3sum是一個思路。其實多少sum都是一樣的。
有兩種方法解,明顯第二種比較快。

Solution 1: hashmap+三個迴圈

空間複雜度為O(n)
時間複雜度為O(n3)

class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        Map<Integer,Integer> hashmap=new HashMap<Integer,Integer>();
        Arrays.sort(nums);
        
        List<List<Integer>> res=new ArrayList<>();
        
        for(int i=0;i<nums.length;i++){
            hashmap.put(nums[i],i);
        }
        
        for(int i=0;i<nums.length-3;i++){
            for(int j=i+1;j<nums.length-2;j++){
                for(int k=j+1;k<nums.length-1;k++){
                    int temp=target-nums[i]-nums[j]-nums[k];
                    if(hashmap.containsKey(temp)&&hashmap.get(temp)>k){
                        List<Integer> list=new ArrayList<>();
                        list.add(nums[i]);
                        list.add(nums[j]);
                        list.add(nums[k]);
                        list.add(temp);
                        res.add(list);
                        
                        
                    }
                    
                    while(k+1<nums.length&&nums[k]==nums[k+1]){
                        k++;
                    }
                }
                
                while(j+1<nums.length&&nums[j]==nums[j+1]){
                    j++;
                }
            }
            
            while(i+1<nums.length&&nums[i]==nums[i+1]){
                    i++;
                }
        }
        
        return res;
    }
}

Solution 2:fix兩個數,然後用兩個指標pq

時間複雜度O(n2)

class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
       
        Arrays.sort(nums);
        
        List<List<Integer>> res=new ArrayList<>();
    
        
        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-1!=i&&nums[j]==nums[j-1]){
                    continue;
                }
                
                int p=j+1;
                int q=nums.length-1;
                
                while(p<q){
                    int sum=nums[i]+nums[j]+nums[p]+nums[q];
                    
                    if(sum<target){
                        p++;
                    }
                    else if(sum>target){
                        q--;
                    }
                    else{
                        List<Integer> list=new ArrayList<>();
                        list.add(nums[i]);
                        list.add(nums[j]);
                        list.add(nums[p]);
                        list.add(nums[q]);
                        res.add(list);
                        
                        p++;
                        while(p<nums.length&&nums[p-1]==nums[p]){
                            p++;
                        }
                    }
                }
                
            }
            
           
        }
        
        return res;
    }
}