注意:不懂的地方一定要在纸上划划,举几个例子,然后就能很好的理解了
二分法模板
力扣704链接
class Solution {
public:
int search(vector<int>&nums,int target)
{
int left=0;
int right=nums.size()-1;
while(left<=right)
{
int middle=left+(right-left)/2;
if(nums[middle]>target)
{
right=middle-1;
}
else if(nums[middle]<target)
{
left=middle+1;
}
else
{
return middle;
}
}
//未找到目标值
return -1;
}
};
相关题目推荐
力扣35链接
class Solution {
public:
int searchInsert(vector<int>&nums,int target)
{
int left=0;
int right=nums.size()-1;
while(left<=right)
{
int middle=left+(right-left)/2;
if(nums[middle]>target)
{
right=middle-1;
}
else if(nums[middle]<target)
{
left=middle+1;
}
else
{
return middle;
}
}
return right+1;
}
};
力扣34链接
class Solution {
public:
int firstposition(vector<int>&nums,int target)
{
int left=0;
int right=nums.size()-1;
while(left<=right)
{
int mid=(left+right)/2;
if(nums[mid]==target)
{
if(mid==0||nums[mid-1]<target)
{
return mid;
}
right=mid-1;
}
else if(nums[mid]>target)
{
right=mid-1;
}
else if(nums[mid]<target)
{
left=mid+1;
}
}
return -1;
}
int lastposition(vector<int>&nums,int target)
{
int left=0;
int right=nums.size()-1;
while(left<=right)
{
int mid=(left+right)/2;
if(nums[mid]==target)
{
if(mid==nums.size()-1||nums[mid+1]>target)
{
return mid;
}
left=mid+1;
}
else if(nums[mid]>target)
{
right=mid-1;
}
else if(nums[mid]<target)
{
left=mid+1;
}
}
return -1;
}
vector<int> searchRange(vector<int>& nums, int target) {
vector<int>range;
range.push_back(firstposition(nums,target));
range.push_back(lastposition(nums,target));
return range;
}
};
力扣69链接
class Solution {
public:
int mySqrt(int x) {
int left=1;
int right=x;
while(left<=right)
{
long long middle=left+(right-left)/2;
long long square=middle*middle;
if(square>x)
{
right=middle-1;
}
else if(square==x)
{
return middle;
}
else
{
left=middle+1;
}
}
return right;
}
};
力扣367链接
**二分法:**
class Solution {
public:
bool isPerfectSquare(int num) {
int left=0;//因为num等于0有意义,所以左边界从0开始
int right=num;
if(num==0)
{
return true;
}
while(left<=right)
{
long long middle=left+(right-left)/2;
long long square=middle*middle;
if(square==num)
return true;
else if(square>num)
right=middle-1;
else
left=middle+1;
}
return false;
}
};
**数学方法:**
class Solution {
public:
bool isPerfectSquare(int num) {
int sub=1;
if(num==0)
return true;
while(num>0)//注意此处num>0//因为num<0的时候也会发生循环
{
num-=sub;
sub+=2;
}
if(num==0)
return true;
else
return false;
}
};