704:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。其中leecode题目在这力扣
这个是很经典的二分查找,可以直接套用二分查找模版,注意原文是闭区间,所以right和left需要➕➖1
int search(int* nums, int numsSize, int target){
int left=0,right=numsSize-1;
while(left<=right){
int middle=(left+right)/2;
if(nums[middle]>target){
right=middle-1;
}
else if(nums[middle]<target){
left=middle+1;
}
else
return middle;
}
return -1;
}
35:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 其中leecode题目在这力扣
其实这个也是用到二分查找,但是与常规的不用是如果目标值不存在,需要找出相应的位置,可以理解为与目标值最接近,但是比他大的那个元素的位置,所以如果查找失败,则说明数组中没有目标值,那么right所在位置的下一个位置是与目标值最为接近且比他大的位置
int searchInsert(int* nums, int numsSize, int target){
int left=0,right=numsSize-1;
while(left<=right){
int middle=(left+right)/2;
if(nums[middle]>target){
right=middle-1;
}
else if(nums[middle]<target){
left=middle+1;
}
else
return middle;
}
return right+1;
}
69:给你一个非负整数 x ,计算并返回 x 的 算术平方根 。由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。其中leecode题目在这力扣
这个题其实答案有三种方法,第一种比较讨巧,第三种是数学的牛顿迭代法,我认为第二种二分查找是最为中规中矩也是实用的方法,首先为了防止溢出,可以先将right设置为x/2,再利用二分查找来找出x的算术平方根或者最为接近x的整数
int mySqrt(int x){
int left,right;
left=1;right=x/2;
int mid;
if(x==1){
return 1;
}
while(left<=right){
mid=(left+right)/2;
if(mid==x/mid&&x%mid==0){
return mid;
}
else if(mid<=x/mid){
left=mid+1;
}
else{
right=mid-1;
}
}
return left-1;
}