【LeetCode 15】三数之和

题目链接

【题解】

先把n个数字升序排个序。 然后枚举三元组最左边的那个数字是第i个数字。 之后用两个指针l,r移动来获取三元组的第2个和第3个数字。 (初始值,l=i+1,r = n-1); 如果a[i]+a[l]+a[r]>0 那么说明后面两个数字a[l]和a[r]太大了。 得让其中较大的那个数字a[r]变小一点。 也即r-- 否则l++即可。 这就给我们在一个一维数组中找两个数的和为x的二元组个数提供了思路。 即令l=1,r=n 若a[l]+a[r]>x那么,让r--. 否则让l++. (当然 前提是你是一个有序的数组。所以复杂度取决于排序的速度>_<(移动两个指针复杂度是O(N))的)

【代码】

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int> > ans;
        vector<int> temp;
        temp.resize(3);
        sort(nums.begin(),nums.end());
        int len = nums.size();
        
        for (int i = 0;i < len;i++){
            if (i>0 && nums[i]==nums[i-1]) continue;//start 相同
            int l = i+1,r = len-1;
            while (l<r){
                if (nums[i]+nums[l]+nums[r]==0){
                    temp[0] = nums[i],temp[1] = nums[l],temp[2] = nums[r];
                    ans.push_back(temp);
                    while (l+1<len && nums[l+1]==nums[l]) l++;
                    while (r-1>i && nums[r-1]==nums[r]) r--;
                    l++;r--;
                }else if (nums[i]+nums[l]+nums[r]>0){
                    r--;
                }else {
                    l++;
                }
                
            }
        }
        return ans;
    }
};
posted @ 2019-11-06 21:15  AWCXV  阅读(125)  评论(0编辑  收藏  举报