lintcode-57-三數之和


57-三數之和

給出一個有n個整數的數組S,在S中找到三個整數a, b, c,找到所有使得a + b + c = 0的三元組。

注意事項

在三元組(a, b, c),要求a <= b <= c。
結果不能包含重復的三元組。

樣例

如S = {-1 0 1 2 -1 -4}, 你需要返回的三元組集合的是:
(-1, 0, 1)
(-1, -1, 2)

標簽

數組 排序 兩根指針 臉書

思路

參考資料
首先升序排序數組
然后定義下標變量 k , i , j 。如果簡單的遍歷,那么跟是否有序沒有關系,其時間復雜度將達到O(n^3)。
但是,如果當前選擇了a、b、c三個數,如果其和小於目標target,那么需要將其中一個數用更大的數替換;反之亦然。但究竟替換三個數中的哪個數?可以先固定一個數(k),當前值小於target時,可以讓 i 增加;否則,j 減小。

code

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> &nums) {
        // write your code here
        int size = nums.size(), target = 0;
        if(size < 3) {
            return vector<vector<int> >();
        }
        vector<vector<int> > result;

        int i = 0, j = 0, k = 0;
        sort(nums.begin(), nums.end());
        for(k=0; k<size; k++) {
            if(k>0 && nums[k]==nums[k-1]) {
                continue;
            }

             for(i=k+1, j=size-1; i<j;) {
                if(i>k+1 && nums[i]==nums[i-1]) {
                    i++;
                    continue;
                }
                if(j<size-1 && nums[j]==nums[j+1]) {
                    j--;
                    continue;
                }

                int sum = nums[i] + nums[j] + nums[k];

                if(target == sum) {
                    vector<int> temp;
                    temp.push_back(nums[k]);
                    temp.push_back(nums[i]);
                    temp.push_back(nums[j]);
                    result.push_back(temp);
                    i++;
                    j--;
                }
                else if(target < sum) {
                    j--;
                }
                else {
                    i++;
                }
            }
        }
        return result;
    }
};


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM