一、[LeetCode OJ]3Sum題解

【問題描述】

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


【問題解析】

看到這個問題的時候,會想到的第一個思路會是什麼?用三個嵌套循環遍歷數組,找到所有能滿足公式:a+b+c=0的集合,然而這個時間複雜度將會是O(n^3),而且使用數組Array,由於並不知道n的大小,不得不給它比較多的空間資源防止越界,是一個效率不高的算法。


考慮使用vector容器,不必事先給它較多的空間資源,創建一個vector<vector<int>>容器去存放所有滿足條件的集合,創建一個vector<int>容器去臨時存儲滿足條件的元素,先給數組進行排序(爲了防止滿足條件的集合會被重複存放),然後尋找滿足條件的集合存入容器,算法複雜度O(n^2)


【源代碼】

class Solution {
public:
    vector<vector<int> > threeSum(vector<int>& nums) {
        vector<vector<int> > result;
        vector<int> median;
        sort(nums.begin(),nums.end());
        for (int i = 0; i < nums.size(); i++) {
            if (i > 0 && nums[i] == nums[i-1])
                continue;    
      		int target = i + 1;
      		int j = nums.size() - 1;
      		while (target < j) {
         		if(nums[i] + nums[j] + nums[target] == 0) {
              		median.clear();
                  	median.push_back(nums[i]);
                  	median.push_back(nums[j]);
                  	median.push_back(nums[target]);
                  	result.push_back(median);
                  	target++;
                  	j--;
                  	while (target < nums.size() && nums[target] == nums[target-1])
                    	target++;
                  	while (j >= target && nums[j] == nums[j+1])
                      	j--;
          		} else if (nums[i] + nums[j] + nums[target] > 0){
          			j--;
        		} else {
                  	target++;
                }
            }
        }
        return result;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章