3 sum & 4 sum

3 sum & 4 sum 

4sum
https://www.youtube.com/watch?v=TZLRWytk37Q


https://www.youtube.com/watch?v=-AMHUdZc9ss

3 sum 
这道题目的难点在于处理duplicate,给的数组可能会出现duplicate。 先sort下这个歌数组,时间复杂度为O(nlogn)。 把3sum的问题拆分为2sum问题, 可以遍历数组的时候,指针i指向的为target=nums[i], 那么剩下就是再找两个元素的和为-target的问题。 由于存在重复元素,用hashmap做起来很不方便,可以用两指针来从两端往中间找。 注意边界条件的判定跟duplicate。 时间复杂度为O(nlogn) + O(n^2)

// 3sum hash map? 






 Two Sum. Hash map & two pointers 
// hash map, return indices of the two numbers such that they add up to a specific target.
class Solution {
    public int[] twoSum(int[] nums, int target) {
      int[] result = new int[2];
      Map<Integer, Integer> map = new HashMap<>();
      for(int i = 0; i < nums.length; i++){
        if(map.containsKey(target - nums[i])){
          result[0] = map.get(target - nums[i]);
          result[1] = i;
        }else{
          map.put(nums[i], i);
        }
      }
      return result;  
    }
}

// two pointers , can’t,  because index changed after sorting 






4sum 见 java solution

// no map. NLOGN + N^3

class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
      
      
      List<List<Integer>> result = new ArrayList<>();
      if(4 * nums[0] > target || 4 * nums[nums.length - 1] < target) return result;
      if(nums == null || nums.length < 4) return result;
   
      
      Arrays.sort(nums);
      
      for(int i = 0; i < nums.length - 3; i++){
        if(nums[i]+nums[i+1]+nums[i+2]+nums[i+3]>target)break; //first candidate too large, search finished
        if(nums[i]+nums[nums.length-1]+nums[nums.length-2]+nums[nums.length-3]<target)continue;
        while( i > 0 && nums[i] == nums[i-1]) i++;
    
        for(int j = i+1; j < nums.length - 2; j++){
         if(nums[i]+nums[j]+nums[j+1]+nums[j+2]>target)break; //second candidate too large
         if(nums[i]+nums[j]+nums[nums.length-1]+nums[nums.length-2]<target)continue;
         while( j>i+1 && nums[j] == nums[j-1]) j++;
          
          int n = j+1;
          int m = nums.length - 1;
          while( n < m){
            int sum=nums[i]+nums[j]+nums[n]+nums[m];
            if(target == sum){
              result.add(Arrays.asList(nums[i], nums[j], nums[n], nums[m]));
              while(n < m && nums[n] == nums[n+1]) n++;
              while(n < m && nums[m] == nums[m-1]) m--;
              n++;
              m--;
            }else if( sum < target){
              n++;
            }else{
              m--;
            }
          }
        }
      }
      return result;
    }
}




// USE MAP 

猜你喜欢

转载自www.cnblogs.com/tobeabetterpig/p/9450366.html
sum
今日推荐