Problem: 面试题 16.24. 数对和
文章目录
- 题目描述
- 思路及解法
- 复杂度
- Code
题目描述
思路及解法
若本题目直接双循环暴力求解会超时,可以利用排序 + 双指针进行优化,具体:
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;}
};