[leetcode]18. 4Sum
阿新 • • 發佈:2018-12-01
這一題和那個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; } }