Leetcode题解-3Sum&3Sum Closest

来源:互联网 发布:hp m1136驱动下载 mac 编辑:程序博客网 时间:2024/05/16 12:01

Leetcode题解-3Sum&3Sum Closest

3Sum

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]
]

3Sum Closest

Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution.

For example, given array S = {-1 2 1 -4}, and target = 1.The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).

思路

3Sum就是在2Sum基础上套一层循环
3Sum Closest在3Sum基础上多声明一个变量来记录最靠近目标值的和

代码

3Sum

class Solution {public:    vector<vector<int>> threeSum(vector<int>& nums) {        vector<vector<int>> res;        //if(nums.size() < 3) return res;        std::sort(nums.begin(), nums.end());        cout << 1 << endl;        int l = nums.size();        for(int i = 0; i < l; i++){            int target = 0 - nums[i], front = i+1, back = l-1;            while(front < back){                if(nums[front] + nums[back] < target) front++;                else if(nums[front] + nums[back] > target) back--;                else{                    vector<int> tem(3,0);                    tem[0] = nums[i];                    tem[1] = nums[front];                    tem[2] = nums[back];                    res.push_back(tem);                    //用nums[front] == tem[1]不用nums[front] == nums[front+1]是因为nums[front+1]可能会越界                    while(front < back && nums[front] == tem[1]) front++;                    while(front < back && nums[back] == tem[2]) back--;                }            }            while(i+1 < l && nums[i] == nums[i+1]) i++;        }        return res;    }};

3Sum Closest

class Solution {public:    int threeSumClosest(vector<int>& nums, int target) {        if(nums.size() < 3) return 0;        int closest = nums[0]+nums[1]+nums[2];        sort(nums.begin(), nums.end());        for(int first = 0 ; first < nums.size()-2 ; ++first) {            if(first > 0 && nums[first] == nums[first-1]) continue;            int second = first+1;            int third = nums.size()-1;                        while(second < third) {                int curSum = nums[first]+nums[second]+nums[third];                if(curSum == target) return curSum;                if(abs(target-curSum)<abs(target-closest)) {                    closest = curSum;                }                if(curSum > target) {                    --third;                } else {                    ++second;                }            }        }        return closest;    }};
原创粉丝点击