Category: Algorithm
Difficulty: Medium
Tags: Array, Two Pointers
Discription: https://leetcode.com/problems/3sum/#/description
這題給一個數字陣列,然後要找出任三個數字相加為零之所有組合。
實作概念就是使用三個個指標,先固定其中一個,再讓另外兩個走訪加總,以此來逐步找出所組合。
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> result;
int i, j, k, numslen=nums.size();
sort(nums.begin(), nums.end());
for(i=0; i<numslen; i++){
while (i>0 && nums[i]==nums[i-1]) i++;
j = i+1;
k = numslen-1;
while(j < k){
if(nums[i]+nums[j]+nums[k] < 0) j++;
else if(nums[i]+nums[j]+nums[k] > 0) k--;
else{
result.push_back({nums[i], nums[j], nums[k]});
while(j<k && nums[j]==nums[j+1]) j++;
while(j<k && nums[k]==nums[k-1]) k--;
j++;
k--;
}
}
}
return result;
}
};
首先排序數字陣列,
接下來實作之巢狀迴圈:O(n*n)
第一層負責移動第一個指標,
弟二層負責移動第二及第三個指標(由外而內移動),
第一個指標便會指向陣列最初之最小元素,
第二個指標將指向最小元素隔壁之稍大元素,
第三個指標則指向陣列最後之最大元素,
若三個所指向元素相加小於零,第二個指標將會移動(但不可超過第三個指標),
若三個所指向元素相加大於零,第三個指標將會移動(但不可小於第二個指標),
如果是等於零,直接將三個元素歸入結果陣列。
留言
張貼留言