title: 每日一練(29):和為s的兩個數字
categories:[劍指offer]
tags:[每日一練]
date: 2022/03/02
每日一練(29):和為s的兩個數字
輸入一個遞增排序的陣列和一個數字s,在陣列中查詢兩個數,使得它們的和正好是s。如果有多對數字的和等於s,則輸出任意一對即可。
示例 1:
輸入:nums = [2,7,11,15], target = 9
輸出:[2,7] 或者 [7,2]
示例 2:
輸入:nums = [10,26,30,31,47,60], target = 40
輸出:[10,30] 或者 [30,10]
限制:
1 <= nums.length <= 10^5
1 <= nums[i] <= 10^6
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/probl...
方法一:雜湊
思路:
- 建立雜湊表
- 遍歷陣列
- 若雜湊表中存在元素與當前遍歷到的元素之和為 target 則返回結果即可
- 沒有滿足條件的元素,返回空
vector<int> twoSum(vector<int>& nums, int target) {
// 建立雜湊表
unordered_set<int> s;
// 遍歷陣列
for (int x : nums) {
// 若雜湊表中存在元素與當前遍歷到的元素之和為target
// 則返回結果即可
if (s.count(target - x)) {
return vector<int>{x, target - x};
}
// 插入當前遍歷到的元素
s.insert(x);
}
// 沒有滿足條件的元素,返回空
return {};
}
方法二:雙指標
充分利用遞增陣列的性質,雙指標從頭尾開始遍歷,兩數和小於目標,則left++;大於目標,則right--。
vector<int> twoSum(vector<int>& nums, int target) {
int l = 0; int r = nums.size() - 1;
while (l < r) {
if (target == nums[l] + nums[r]) {
return vector<int>{nums[l], nums[r]};
}
else if (target > nums[l] + nums[r]) {
l++;
}
else if (target < nums[l] + nums[r]) {
r--;
}
}
return vector<int>();
}