zoukankan      html  css  js  c++  java
  • LeetCode 15 三数之和

    题目:

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

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

    例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
    
    满足要求的三元组集合为:
    [
      [-1, 0, 1],
      [-1, -1, 2]
    ]

    解题思路:

    1. 为了去重,首先要对原数组排序,在遍历的时候存在 num[i] == num[i-1] 时就跳过。

    2. 因为原数组已经有序了,所以当选择第一个加数时,正数就不要考虑了。因为正数的后面肯定都是正数。

    3. 当第一个数选定之后,后面两个数之和应为第一个加数的相反数。所以为了减少时间复杂度,可以用左、右双指针法,从第一个加数之后的数组开始,left=i+1, right=num.size()-1, 两指针所指之数之和若为第一个加数的相反数,则满足条件,放入ans。若小于,则left++,若大于,则right--。

    4. 上一步中的第二、第三个加数也要像第一个加数像第1步那样去重

    代码:

     1 class Solution {
     2 public:
     3     vector<vector<int>> threeSum(vector<int>& nums) {
     4         vector<vector<int>> ans;
     5         int left,right;
     6         vector<int> out;
     7         sort(nums.begin(), nums.end());
     8         for(int i=0; i<nums.size(); ++i) {
     9             if(nums[i] > 0)
    10                 break;
    11             if(i>0 && nums[i] == nums[i-1]) 
    12                 continue;
    13             out.clear();
    14             int temp = -nums[i];
    15             left = i + 1;
    16             right = nums.size() - 1;
    17             while(left < right) {
    18                 if(nums[left] + nums[right] == temp) {
    19                     ans.push_back({nums[i], nums[left], nums[right]});
    20                     while(left < right && nums[left] == nums[left+1]) left++; //第二个加数去重
    21                     while(left < right && nums[right] == nums[right-1]) right--; //第三个加数去重
    22                     left++; //把相同的去掉之后,下一个才是不同的
    23                     right--;
    24                 }
    25                 else if(nums[left] + nums[right] < temp) left++;
    26                 else right--;
    27             }
    28         }
    29         return ans;
    30     }
    31 };
  • 相关阅读:
    使用超酷的jQuery缩略图生成插件NailThumb制作漂亮的缩略图web应用
    极客Web前端开发资源大荟萃#015
    极客编程小挑战#29:实现手机上常见的某一功能的效果显示
    在线制作gif loading图
    极客标签二重大礼华丽登场 宅男宅女必备套装
    SVG矢量图形课程基础入门篇
    浏览器JS交互,点击查询
    11选5专家投注研究算法
    大龙VBox API参数插件
    利用DLL劫持内存补丁技术注入
  • 原文地址:https://www.cnblogs.com/moxiangfeng/p/10675744.html
Copyright © 2011-2022 走看看