天天看點

167. 兩數之和 II - 輸入有序數組 雜湊演算法 雙指針

給定一個已按照升序排列 的有序數組,找到兩個數使得它們相加之和等于目标數。

函數應該傳回這兩個下标值 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 {};	
    }
};