-
题目:剑指Offer57.和为s的两个数字
一个有序数组nums,返回任意一对和为target的数字; -
思路:
1.哈希表:时间O(n):遍历一次,最坏情况下目标数在数组末尾,就需要把n-1个数都insert进哈希表,insert操作是O(1),空间O(n):最坏需要存n-1个数
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_set<int> us;
for (auto x : nums) {
if (us.find(target - x) != us.end()) return {
x, target - x};
else us.insert(x);
}
return {
};
}
};
2.使用双指针优化方法1:O(n),O(1)
数组本身有序,这是可以使用双指针的原因;
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int n = nums.size();
if (n == 1) return {
};
int l = 0, r = n - 1;
while (l < r) {
if (nums[l] + nums[r] > target) --r;
else if (nums[l] + nums[r] < target) ++l;
else return {
nums[l], nums[r]};
}
return {
};
}
};
- 总结:
对于O(n ^ 2)的,通常可以使用哈希表或双指针(双指针需要有序)将其优化为O(n);
同样本题,可以使用双指针将方法1的空间复杂度从O(n)优化为O(1);