第一天—二分查找
704.二分查找
题目:给定一个 n
个元素有序的(升序)整型数组nums
和一个目标值 target
,写一个函数搜索 nums
中的 target
,如果目标值存在返回下标,否则返回 -1
。
示例:
输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
思路:典型的二分查找
public int search(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;
else if(nums[mid] > target){
right = mid - 1;
}else{
left = mid + 1;
}
}
return -1;
}
其中要注意的是:left <= right
这里等于符号,如果没有是不能处理:如下。
[9]
9
0
0
上一种方式的区间两边都是闭区间,当不想取等于符号时,此时需要区间是左闭右开。如下看代码:
public int search(int[] nums,int target){
int left = 0, right = nums.length; // right开区间
while(left < right){
int mid = left + (right - left) / 2;
if(nums[mid] = target) return mid;
else if(nums[mid] > target){
right = mid; // 开区间
}else {
left = mid + 1;
}
}
return -1;
}
35. 搜索插入位置
题目:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(logn)
的算法。
示例 1:
输入: nums = [1,3,5,6], target = 5
输出: 2
示例 2:
输入: nums = [1,3,5,6], target = 2
输出: 1
思路:看到时间复杂度,排序好的数组,那就二分嘛!
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;
}else if(nums[mid] > target){
right = mid - 1;
}else{
left = mid + 1;
}
}
return left;
}
同理,上面也是左右双闭区间,也可按照上一题改成左闭右开区间。
参考:
同名公众号欢迎关注