二分查找模板:
模板一:
while(left<=right)
{
int mid =left+(right - left) /2;
if(nums[mid] ==target)
{ returnmid; }
Else if(nums[mid] <target)
{ left=mid +1; }
Else
{ right=mid - 1; }
}
模板二:
while(left<right)
{
int mid =left+(right - left) /2;
if(nums[mid] ==target)
{ returnmid; }
Else if(nums[mid] <target)
{ left=mid +1; }
Else
{ right=mid; }
}
if(left!=nums.size() &&nums[left] ==target) return left;
模板三:
while (left+1<right)
{
int mid =left+(right - left) /2;
if(nums[mid] ==target)
{
return mid;
}
Else if(nums[mid] <target)
{
left=mid;
}
else
{
right=mid;
}
}
if(nums[left] ==target) return left;
if(nums[right] ==target) return right;
给定一个 n
个元素有序的(升序)整型数组 nums
和一个目标值 target
,写一个函数搜索 nums
中的 target
,如果目标值存在返回下标,否则返回 -1
。
class Solution {
public:
int search(vector<int>& nums, int target) {
int left=0,right=nums.size()-1;
while(left<=right)
{
int mid=left+((right-left)/2);
if(nums[mid]<target)
{
left=mid+1;
}
else if(nums[mid]>target)
{
right=mid-1;
}
else
{ return mid; }
}
return -1;
}
};
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n)
的算法。
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int l=0,r=nums.size()-1,mid;
while(l<=r)
{
mid=(l+r)/2;
if(nums[mid]==target){
return mid;
}
else if(nums[mid]<target)
{
l=mid+1;
}
else
r=mid-1;
}
return l;
}
};
给你一个正整数 num
。如果 num
是一个完全平方数,则返回 true
,否则返回 false
。
完全平方数 是一个可以写成某个整数的平方的整数。换句话说,它可以写成某个整数和自身的乘积。
不能使用任何内置的库函数,如 sqrt
。
class Solution {
public:
bool isPerfectSquare(int num) {
int l=0,r=num;
while(l<=r)
{
int mid=(r-l)/2+l;
long s=(long) mid*mid;
if(s<num)
{
l=mid+1;
}
else if(s>num){
r=mid-1;
}
else{
return true;
}
}
return false;
}
};