第一题
704. 二分查找 - 力扣(LeetCode) (leetcode-cn.com)
比较基础的题,基本上了解二分查找的原理,然后套用模板就能做出来。
int search(vector<int>& nums, int target) {
int left=0;
int right=nums.size()-1;
int ans=0;
while(left<=right)
{
int mid=(left+right)/2;
if(target==nums[mid]) {ans=mid ;return ans;}
else if(target<nums[mid]){right=mid-1;}
else if(target>nums[mid]){left=mid+1;}
}
return -1;
}
第三题
167. 两数之和 II - 输入有序数组 - 力扣(LeetCode) (leetcode-cn.com)
这个题感觉更容易想到双指针…先写了一个双指针的代码
vector<int> twoSum(vector<int>& numbers, int target) {
int left=0;
int right=numbers.size()-1;
int ans[2];
while (left<right)
{
if (numbers[left]+numbers[right]==target)
{ans[0]=left+1;ans[1]=right+1;break;}
else if (numbers[left]+numbers[right]<target)
left++;
else if (numbers[left]+numbers[right]>target)
right--;
}
return vector<int>(ans,ans+2);
}
二分查找
二分也不是很难
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int ans[2];
for (int i=0; i<numbers.size()-1; i++) {
int left=i+1;
int right=numbers.size()-1;
while (left<=right)
{ int mid=(left+right)/2;
if (numbers[mid]==target-numbers[i])
{ans[0]=i+1;ans[1]=mid+1;break;}
else if (numbers[mid]>target-numbers[i])
right=mid-1;
else if (numbers[mid]<target-numbers[i])
left=mid+1;
}}
return vector<int>(ans,ans+2);
}
};