• 15. 3Sum


    1. 问题描述

    Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

    Note: The solution set must not contain duplicate triplets.

    For example, given array S = [-1, 0, 1, 2, -1, -4],
    A solution set is:
    [
        [-1, 0, 1],
        [-1, -1, 2]
    ]

    Tags: Array Two Pointers

    Similar Problems: (E) Two Sum (M) 3Sum Closest (M) 4Sum (M) 3Sum Smaller

    2. 解答思路

     

    3. 代码

      1 #include <vector>
      2 #include <map>
      3 #include <algorithm>
      4 using namespace std;
      5 class Solution {
      6 public:
      7     vector<vector<int>> threeSum(vector<int>& nums) {
      8         vector<vector<int>> ResultVec;
      9         bool bIsValidate = Validate(nums);
     10         if (!bIsValidate)
     11         {
     12             return ResultVec;
     13         }
     14         int idx = 0;
     15         int Fir = 0;
     16         int Sec = nums.size() - 1;
     17 
     18         while (nums[idx] <= 0)
     19         {
     20             int target = -nums[idx];
     21             Fir = idx + 1;
     22             Sec = nums.size() - 1;
     23             int sum;
     24             while (Fir < Sec)
     25             {
     26                 sum = nums[Fir] + nums[Sec];
     27                 if (sum > target)
     28                 {
     29                     Sec--;
     30                 }
     31                 else if (sum < target)
     32                 {
     33                     Fir++;
     34                 }
     35                 else
     36                 {
     37                     std::vector<int> tVec;
     38                     tVec.push_back(nums[idx]);
     39                     tVec.push_back(nums[Fir]);
     40                     tVec.push_back(nums[Sec]);
     41                     ResultVec.push_back(tVec);
     42 
     43                     int t = nums[Fir];
     44                     Fir++;
     45                     while (Fir != Sec)
     46                     {
     47                         if (t != nums[Fir])
     48                         {
     49                             break;
     50                         }
     51                         Fir++;
     52                     }
     53                 }
     54             }
     55             int t = nums[idx];
     56             idx++;
     57             while (nums[idx] <= 0)
     58             {
     59                 if (t != nums[idx])
     60                 {
     61                     break;
     62                 }
     63                 idx++;
     64             }
     65         }
     66         return ResultVec;
     67     }
     68 private:
     69     bool Validate(vector<int>& nums)
     70     {
     71         //判断数组的Size是否满足要求,非空且Size至少>3
     72         int vSize = nums.size();
     73         if (vSize < 3)
     74         {
     75             return false;
     76         }
     77 
     78         std::sort(nums.begin(), nums.end());
     79         //边界检查
     80         if (nums[0] > 0 || nums[vSize-1] < 0)//若数组中全是负数或者全是非的整数
     81         {
     82             return false;
     83         }
     84 
     85         int t = nums[vSize-1];
     86         int n = 0;//用于记录与nums[vSize-1]值相同的数字的个数
     87         for (int i=1; vSize-i>=0; i++)
     88         {
     89             if (t == nums[vSize-i])
     90             {
     91                 n++;
     92             }
     93             else
     94             {
     95                 break;
     96             }
     97         }
     98         if (nums[vSize-1] == 0 && n<3)//如[-3, -2, -1, 0, 0]
     99         {
    100             return false;
    101         }
    102         return true;
    103     }
    104 };

    4. 反思

    第一遍做的时候忘记了进行边界检查!!!

  • 相关阅读:
    Java-LockSupport
    Kafka Eagle 安装
    Kafka shell
    python pip 使用
    Kafka 集群部署
    Kafka 概述
    DockerFile 简单使用
    《深入理解Java虚拟机》读书笔记
    linux安装redis
    Java多线程基础知识例子
  • 原文地址:https://www.cnblogs.com/whl2012/p/5578826.html
Copyright © 2020-2023  润新知