• [LintCode 57] three Sum


    LintCode 57. 三数之和

    给出一个有n个整数的数组S,在S中找到三个整数a, b, c,找到所有使得a + b + c = 0的三元组。

    样例
    例1:

    输入:[2,7,11,15]
    输出:[]
    例2:

    输入:[-1,0,1,2,-1,-4]
    输出:[[-1, 0, 1],[-1, -1, 2]]
    注意事项
    在三元组(a, b, c),要求a <= b <= c。

    结果不能包含重复的三元组。

    暴力解法,时间复杂度O(N^3),空间复杂度O(1):

    class Solution {
    public:
        /**
         * @param numbers: Give an array numbers of n integer
         * @return: Find all unique triplets in the array which gives the sum of zero.
         */
        vector<vector<int>> threeSum(vector<int> &numbers) {
            // write your code here
            vector<vector<int>> res;
            std::sort(numbers.begin(), numbers.end());
            size_t n = numbers.size();
            int i=0, j,k;
            while (i < n-2) {
                j = i+1;
                while (j < n-1) {
                    k = j+1;
                    while (k < n) {
                        if (numbers[i] + numbers[j] + numbers[k] == 0) {
                            res.push_back({numbers[i], numbers[j], numbers[k]});
                            break;
                        }
                        k++;
                        while(k<n && numbers[k]==numbers[k-1]) k++;
                    }
                    j++;
                    while (j<n-1 && numbers[j]==numbers[j-1]) j++;
                }
                i++;
                while (i<n-2 && numbers[i] == numbers[i-1]) i++;
            }
            return res;
        }
    };
    

    双指针解法,时间复杂度O(N^2),空间复杂度O(1):

    class Solution {
    public:
        /**
         * @param numbers: Give an array numbers of n integer
         * @return: Find all unique triplets in the array which gives the sum of zero.
         */
        vector<vector<int>> threeSum(vector<int> &numbers) {
            // write your code here
            vector<vector<int>> res;
            std::sort(numbers.begin(), numbers.end());
            size_t n = numbers.size();
            int i=0, j,k;
            while (i < n-2) {
                j = i + 1;
                k = n - 1;
                while (j < k) {
                    int sum3 = numbers[i] + numbers[j] + numbers[k];
                    if (sum3 < 0) {
                        j++;
                        while (j<k && numbers[j] == numbers[j-1]) j++;
                    } else if (sum3 > 0) {
                        k--;
                        while (j<k && numbers[k] == numbers[k+1]) k--;
                    } else {
                        res.push_back({numbers[i], numbers[j], numbers[k]});
                        // break; // for result can be [[-2,-1,3], [-2,1,1]]
                        j++;
                        while (j<k && numbers[j] == numbers[j-1]) j++;
                        k--;
                        while (j<k && numbers[k] == numbers[k+1]) k--;
                    }
                }
                i++;
                while (i<n-2 && numbers[i] == numbers[i-1]) i++;
            }
            return res;
        }
    };
    
  • 相关阅读:
    bobobrowse为Lucene添加分组统计
    实现lucene检索结果排序
    facets in lucene
    lucene3.5 example
    Lucene聚类分组统计功能(grouping)
    Eclipse开发struts完全指南(三)实战
    缓存是什么?占内存吗?
    []利用memcached在多台服务器之间共享PHP的session数据
    HTML meta refresh 刷新与跳转(重定向)页面
    [置顶] 微信开发出现“该公众号暂时无法提供服务,请稍后再试”的坑
  • 原文地址:https://www.cnblogs.com/zhcpku/p/14258528.html
Copyright © 2020-2023  润新知