• LeetCode18:四数之和


    题目描述:

    解题思路:

    1、排序,根据三数之和的经验,首先对数组排序,这样的很话,确定第一个数字之后,就可以将本题转化成类似三数之和那种的;

    2、固定第一个元素,将该题转化为三数之和问题。

    具体代码:

     1 class Solution {
     2     public List<List<Integer>> fourSum(int[] nums, int target) {
     3         int len = nums.length;
     4         List<List<Integer>> res = new ArrayList<>();
     5         if(len < 4 || nums == null) return res;
     6         Arrays.sort(nums); // 对数组排序
     7         for(int i = 0; i < len - 3; i++){ // 固定第一个元素
     8             if(i > 0 && nums[i] == nums[i-1]) continue; // 防止因为元素重复导致答案一样
     9             int min1 = nums[i] + nums[i+1] + nums[i+2] + nums[i+3]; 
    10             int max1 = nums[i] + nums[len-1] + nums[len-2] + nums[len-3];// 快速判断target是否不存在,target可能存在的条件是min1 < target < max1
    11             if(min1 > target || max1 < target){
    12                 continue;
    13             }
    14             for(int j = i + 1; j < len -2; j++){ // 固定第二个元素
    15                 if(j  > i + 1 && nums[j] == nums[j-1]) continue; // 防止结果重复
    16                 int k = j + 1;
    17                 int l = len - 1;
    18                 while(k < l){ // 双指针寻找另外两个数
    19                     int sum = nums[i] + nums[j] + nums[k] + nums[l];
    20                     if(sum < target){
    21                         k++;
    22                     }else if(sum > target){
    23                         l--;
    24                     }else{ // 将和为target的四个数存到结果中
    25                         ArrayList<Integer> temp = new ArrayList<>();
    26                         temp.add(nums[i]);
    27                         temp.add(nums[j]);
    28                         temp.add(nums[k]);
    29                         temp.add(nums[l]);
    30                         res.add(temp);
    31                         k++;
    32                         l--; // 直接移动指针
    33                         while(k < l && nums[k] == nums[k-1]){ //防止元素重复引起结果重复
    34                             k++;
    35                         }
    36                         while(k < l && nums[l] == nums[l+1]){
    37                             l--;
    38                         }
    39                     }
    40                 }
    41             }
    42         }
    43         return res;
    44     }
    45 }
  • 相关阅读:
    【jQuery基础学习】03 jQuery中的事件与动画
    【jQuery基础学习】02 jQuery的DOM操作
    【jQuery基础学习】01 jQuery选择器
    【jQuery基础学习】00 序
    【JS复习笔记】07 复习感想
    【JS复习笔记】06 方法
    洛谷P1067 多项式输出 NOIP 2009 普及组 第一题
    嵊州D6T2 城市 city
    博弈论小结
    嵊州D2T4 十七个中毒的英国人 poisoning
  • 原文地址:https://www.cnblogs.com/zhang-yi/p/12901119.html
Copyright © 2020-2023  润新知