这是我参与2022首次更文挑战的第7天,活动详情查看:2022首次更文挑战
二分查找
该题出自力扣的704题——二分查找【简单题】
审题
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
- 这题可以说是二分查找算法最直观的实现了,纯粹的算法。
- 二分:
- 取一个升序的集合,并取中间索引的值;
- 划分为两个集合,根据目标值进入其中一个集合;
- 重复上述步骤,直到找到目标值。
编码
public int search(int[] nums, int target) {
if(nums == null){
return -1;
}
int front = 0;
int end = nums.length-1;
while (end>=front){
int mid = front+(end-front)/2;
if (nums[mid]>target){
end = mid-1;
}else if (nums[mid]<target){
front = mid+1;
}else if (nums[mid] == target){
return mid;
}
}
return -1;
}
第一个错误的版本
该题出自力扣的278题——第一个错误的版本【简单题】
审题
你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个 > 版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。 假设你有 n 个版本 [1, 2, ..., n],你想找出导致之后所有版本出错的第一个错误的版本。 你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函 > 数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。
- 首先该题的题意就是总一个升序数组中找出错误的版本
- 显而易见就是二分的练习题
- 给定的一个数值,并且给定一个API;
- 给一个值的参数,实际上就是给了一个数组,从1到n;
- 二分查找
编码
public int firstBadVersion(int n) {
int left = 1;
while(n > left){
int mid = left + (n - left)/2;
if(isBadVersion(mid)){
n = mid;
}else{
left = mid+1;
}
}
return n;
}
总结
二分查找相对来说,还是比较好辨认出,但是缺点也很明显,需要具备数组有序的条件