給定一個已按照升序排列 的有序數組,找到兩個數使得它們相加之和等于目标數。
函數應該傳回這兩個下标值 index1 和 index2,其中 index1 必須小于 index2。
說明:
傳回的下标值(index1 和 index2)不是從零開始的。
你可以假設每個輸入隻對應唯一的答案,而且你不可以重複使用相同的元素。
示例:
輸入: numbers = [2, 7, 11, 15], target = 9
輸出: [1,2]
解釋: 2 與 7 之和等于目标數 9 。是以 index1 = 1, index2 = 2 。
通過次數128,780送出次數230,199
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/two-sum-ii-input-array-is-sorted
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
題解:典型的雜湊演算法 ,不過我目前還隻是剛剛接觸
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
vector<int> ans;
unordered_map<int, int> map;
for (int i = 0; i < numbers.size(); ++i)
map[numbers[i]] = i;
for (int i = 0; i < numbers.size(); ++i) {
if (map[target - numbers[i]] > 0) {
if (numbers[i] == target - numbers[i])
//這是為了防止int數組中有重複數字的情況
//eg:
// [0,0,3,4]
// 0
//應該輸出[1,2],如果沒有判斷的話會輸出[2,2]
ans.push_back(map[numbers[i]]);
else
ans.push_back(map[numbers[i]] + 1);
ans.push_back(map[target - numbers[i]] + 1);
break;
}
}
return ans;
}
};
使用雙指針 一趟周遊 時間複雜度O(n),空間:O(1),為了效率,連建立vector也省了
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int len= numbers.size();
int left=0,right=len-1;
while(left<right){
if(numbers[left]+numbers[right]==target){
// ans.push_back(left+1);
// ans.push_back(right+1);
// break;
return {left+1,right+1};
}
if(numbers[left]+numbers[right]>target)
--right;
else
++left;
}
return {};
}
};