zoukankan      html  css  js  c++  java
  • LeetCode15:三数之和

    给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。

    注意:答案中不可以包含重复的三元组。

    示例:

    给定数组 nums = [-1, 0, 1, 2, -1, -4],

    满足要求的三元组集合为:
    [
    [-1, 0, 1],
    [-1, -1, 2]
    ]

    这题基本思想是三个循环嵌套,但是需要判断产生的三元组是否重复。

    在此基础上改进,通过观察可以发现,第二层循环和第三层循环其实可以合并。如果当前三个位置为a,b,c,如果当前和大于0,则需要减小c;如果当前和小于0,则需要增大b。可以发现b和c的循环其实加起来是O(n)的,这样修改为2层循环,时间复杂度也降为O(n)。

     1 class Solution {
     2 public:
     3     vector<vector<int>> threeSum(vector<int>& nums) {
     4         vector<vector<int>> ret;
     5         sort(nums.begin(),nums.end());
     6         int a,b,c,n=nums.size(),target;
     7         for(int a=0;a<n-2;a++){
     8             if(a!=0 && nums[a]==nums[a-1])
     9                 continue;
    10             target=-nums[a];
    11             c=n-1;
    12             for(b=a+1;b<c;b++){
    13                 if(b!=a+1 && nums[b]==nums[b-1])
    14                     continue;
    15                 while(nums[b]+nums[c]>target && c>b+1){
    16                     c--;
    17                 }
    18                 if(nums[b]+nums[c]==target)
    19                     ret.push_back({nums[a],nums[b],nums[c]});
    20                 else if(c==b+1 && nums[b]+nums[c]>target)
    21                     break;
    22             }
    23         }
    24 
    25 
    26         return ret;
    27     }
    28 };

    此外在每次修改a和b的时候,都需要判断当前是否跟上一个位置重复,即每次向前移动都要保证移动到a或b位置的数改变。

  • 相关阅读:
    Nginx配置IP白名单和黑名单
    MySQL外键的作用和创建
    MySQL命令大全
    Mysql数据类型详解
    常见英文简写
    ubuntu12.04destdrop删除不必要的软件
    Ubuntu Nginx 开机自启动
    再生龙小用------转载
    Clonezilla SE---克隆linux------转载
    linux下制作镜像文件
  • 原文地址:https://www.cnblogs.com/rookiez/p/13192494.html
Copyright © 2011-2022 走看看