• LeetCode 15. 三数之和


    思路

    方法:排序 + 双指针

    先排序,之后有序数组,固定一个数,对后面的有序序列进行双指针查找,双指针方法见此题:LeetCode 167. 两数之和 II - 输入有序数组

     1 class Solution {
     2 public:
     3     vector<vector<int>> threeSum(vector<int>& nums) {
     4         vector<vector<int>> res;
     5         if(nums.size() < 3) {
     6             return res;
     7         }
     8 
     9         //从小到大排序
    10         sort(nums.begin(), nums.end());
    11         int n = nums.size();
    12         for(int i = 0; i < n; ++i) {
    13             if(nums[i] > 0) {
    14                 //因为是从小到大排好了序,所以遇到的数大于0,后面全都会大于0,肯定不会出现三数之和等于0的情况了
    15                 break;  
    16             }
    17             
    18             if(i > 0 && nums[i] == nums[i-1]) 
    19                 continue;   //去重
    20 
    21             int L = i+1, R = n-1;
    22             while(L < R) {
    23                 int sum = nums[i] + nums[L] + nums[R];
    24                 if(sum == 0) {
    25                     vector<int> v({nums[i], nums[L], nums[R]});
    26                     res.push_back(v);
    27                     while(L < R && nums[L] == nums[L+1]) L++; //去重
    28                     while(L > R && nums[R] == nums[R-1]) R--;   //去重
    29                     L++;
    30                     R--;
    31                 } else if (sum < 0) {
    32                     L++;
    33                 } else {
    34                     R--;
    35                 }
    36             }
    37 
    38         }
    39 
    40         return res;
    41     }
    42 };

    复杂度分析

    时间复杂度:O(n2),排序是O(nlogn),固定一个数,对后序进行双指针查找,这个过程是O(n2),所以总体是O(n2)。

    原文:画解算法:15. 三数之和

  • 相关阅读:
    Gengxin讲STL系列——Set
    理解Python的With语句
    Python中Non-ASCII character 'xe7' in file的问题解决
    gnome-terminal的一些调整
    硬盘的CHS寻址
    Wiz发布cnblog笔记
    cygwin安装man手册
    linux命令行使用
    小步前进
    学习的感觉真好
  • 原文地址:https://www.cnblogs.com/FengZeng666/p/14462829.html
Copyright © 2020-2023  润新知