给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
class Solution {
public int search(int[] nums, int target) {
int mid,right=nums.length-1,left=0;
while(left<=right){
mid=left+(right-left)/2;//去left与right的中间值
if(nums[mid]==target){
return mid;
}else if(nums[mid]<target){
left=mid+1;
}else{
right=mid-1;
}
}
return -1;
}
}
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
class Solution {
public int searchInsert(int[] nums, int target) {
int left=0,right=nums.length-1;
while(left<=right){
int mid=left+(right-left)/2;
if(nums[mid]==target){
return mid;
}
if(nums[mid]<target){
left=mid+1;
}else{
right=mid-1;
}
}
return left;
}
}
去left与right的中间值为什么不写成mid=(left+right)/2呢?
假如 right和left都是一个很大的数,那么right + left会溢出,而(right - left)/2 + left 先做减法不会溢出。 所以好处是让pivot变量避免溢出