【leetcode】3Sum

来源:互联网 发布:php用户权限管理思路 编辑:程序博客网 时间:2024/06/02 05:30

描述:

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

Note:

  • Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)
  • 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)

分析:先排序,然后左右夹逼。时间复杂度是O(n2

解决办法1:运行时间为64ms

class Solution {public:    vector<vector<int>> threeSum(vector<int>& nums) {        vector<vector<int>> result;        //当nums的size小于3时   return null        if (nums.size() < 3) return result;        sort(nums.begin(), nums.end());        const int target = 0;                for (unsigned int i = 0; i <= nums.size() - 2; ++i) {            if (i > 0 && nums[i] == nums[i-1])  continue;                        int j = i + 1;            int k = nums.size() - 1;            while(j < k) {                int s = nums[i] + nums[j] + nums[k];                if (s > target)                    --k;                else if (s < target)                    ++j;                else {                    result.push_back({nums[i], nums[j], nums[k]});                    while (nums[j] == nums[++j]);                    while (nums[k] == nums[--k]);                }            }        }                return result;    }};


解决办法2:

1) 将三个数相加修改为两数相加可以加快运行速度
2) 在for循环中添加一个剪枝操作,如果nums[i] > 0,则说明3数总和不可能为0,则退出循环

运行时间为52ms

class Solution {public:    vector<vector<int>> threeSum(vector<int>& nums) {        vector<vector<int>> result;        //当nums的size小于3时   return null        if (nums.size() < 3) return result;        sort(nums.begin(), nums.end());                for (unsigned int i = 0; i <= nums.size() - 2; ++i) {            //如果nums[i]>0            if (nums[i] > 0) break;                        //如果nums[i]==nums[i-1]求的肯定是重复的答案,所以跳过            if (i > 0 && nums[i] == nums[i-1])  continue;                        int j = i + 1;            int k = nums.size() - 1;                        int target = -nums[i];                        while(j < k) {                int tempSum = nums[j] + nums[k];                if (tempSum == target) {                    result.push_back({nums[i], nums[j], nums[k]});                    while (nums[j] == nums[++j]);                    while (nums[k] == nums[--k]);                }                else if (tempSum > target) {                    --k;                }                else {                   ++j;                }            }        }                return result;    }};


0 0
原创粉丝点击