【LeetCode】167. 兩數之和 II - 輸入有序數組

解題思路

自己開始的思路是,對另一個數,在已有的數組中進行二分查找,而不是簡單的遍歷,自己覺得複雜度挺小的O(nlogn),但是一直超時,同時自己的代碼考慮了一種情況[2,7,7,10,11],target=9,如果是官方題解應該是返回值時{1,3};而我覺得正確的情況是[1,2](我寫的代碼可以獲得該結果),因此從官方題解可以看出沒有這種情況出現。代碼見後
在這裏插入圖片描述

之後參考自LeetCode官方提解
使用兩個指針,初始分別位於第一個元素和最後一個元素位置,比較這兩個元素之和與目標值的大小。
如果和等於目標值,我們發現了這個唯一解。
如果比目標值小,我們將較小元素指針增加一。
如果比目標值大,將較大指針減小一。移動指針後重覆上述比較直到找到答案。
時間複雜度O(n),空間複雜度O(1)

代碼

雙指針法

//雙指針
class Solution {
public:
	vector<int> twoSum(vector<int>& numbers, int target) {
		int low = 0, high = numbers.size() - 1;//low低指針,high高指針
		while (low < high)
		{
			int sum = numbers[low] + numbers[high];
			if (sum == target) return { low + 1,high + 1 };//學到了
			else if (sum < target)
			{
				low++;
			}
			else if (sum > target)
			{
				high--;
			}
		}
		return { -1,-1 };//學到了
	}
};

自己的想法

//下列算法,超時無法通過題目
class Solution {
public:
	vector<int> twoSum(vector<int>& numbers, int target) {
		vector<int> res;
		for (int i=0;i<numbers.size();i++)
		{
			res.push_back(i+1);
			int index = binarySearch(i+1, numbers, target - numbers[i]);
			if (index != -1)
			{
				res.push_back(index+1);
				return res;
			}
			res.pop_back();
		}
		return res;
	}
	//尋找左側邊界的二分搜索
	int binarySearch(int i,vector<int> numbers,int target)
	{
		int left = i;
		int right = numbers.size();
		while (left<right) {
			int mid = left + (right - left) / 2;
			if (numbers[mid] == target) right=mid;
			else if (numbers[mid] < target) {
				left = mid + 1;
			}
			else if (numbers[mid]>target)
			{
				right = mid;
			}
		}
		if (left == numbers.size()) return -1;
		return numbers[left]==target?left:-1;
	}
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章