14. 二分查找
注意是找第一个位置,所以当mid==target的时候,说明最终答案应该在此区间之前。循环终止的条件时(h+1<r),最后需要做一次double check。mid写作(t-h)/2+h是为了防止直接相加越界。
class Solution {
public:
int binarySearch(vector<int> &nums, int target) {
if (nums.size()==0) return -1;
int h=0;
int t=nums.size()-1;
while (h+1<t)
{
int mid=(t-h)/2+h;
if (nums[mid]==target) t=mid;
else if (nums[mid]<target)h=mid+1;
else t=mid-1;
}
if (nums[h]==target) return h;
if (nums[t]==target) return t;
return -1;
}
};
class Solution {
public:
int findPosition(vector<int> &nums, int target) {
if (nums.size()==0) return -1;
int h=0;
int t=nums.size()-1;
while (h+1<t)
{
int mid=(t-h)/2+h;
if (nums[mid]==target) return mid;
else if (nums[mid]<target)h=mid+1;
else t=mid-1;
}
if (nums[h]==target) return h;
if (nums[t]==target) return t;
return -1;
}
};
class Solution {
public:
int lastPosition(vector<int> &nums, int target) {
if (nums.size()==0) return -1;
int h=0;
int t=nums.size()-1;
while (h+1<t)
{
int mid=(t-h)/2+h;
if (nums[mid]==target) h=mid;
else if (nums[mid]<target) h=mid+1;
else t=mid-1;
}
if (nums[t]==target) return t;
if (nums[h]==target) return h;
return -1;
}
};
141. x的平方根
注意x*x可能会越界,要用target/x判断。
class Solution {
public:
int sqrt(int x) {
if (x==0) return 0;
int head=1;
int tail=x;
while(head+1<tail){
int mid=(tail-head)/2+head;
if (mid*mid==x) return mid;
else if (mid<x/mid) head=mid;