Problem: 面试题 16.24. 数对和
题目描述
思路及解法
若本题目直接双循环暴力求解会超时,可以利用排序 + 双指针进行优化,具体:
1.对原数组进行升序排序;
2.双指针指向排好序的数组的头尾(假设索引分别为i,j),循环匹配查找(while循环,循环退出条件i < j):2.1 若nums[i] + nums[j] == target;则将当前索引对应的值添加到集合中,并且i++;j–;
2.2 若nums[i] + nums[j] < target;则i++继续查找(因为数组是按升序排好序的)
2.3 若nums[i] + nums[j] > target;则j–继续查找
复杂度
时间复杂度:
O ( n l o g n ) O(nlogn) O(nlogn);其中 n n n为数组nums的大小
空间复杂度:
O ( n ) O(n) O(n)
Code
class Solution {
public:
/**
* Get the sum of all pairs using a double pointer
* @param nums Given arrays
* @param target Target number
* @return vector<vector<int>>
*/
vector<vector<int>> pairSums(vector<int>& nums, int target) {
vector<vector<int>> result;
if (nums.size() == 0) {
return result;
}
int i = 0;
int j = nums.size() - 1;
sort(nums.begin(), nums.end());
while (i < j) {
if (nums[i] + nums[j] == target) {
vector<int> temp;
temp.push_back(nums[i]);
temp.push_back(nums[j]);
result.push_back(temp);
i++;
j--;
} else if (nums[i] + nums[j] < target) {
i++;
} else {
j--;
}
}
return result;
}
};