本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1 704.二分查找
1.1 题目
1.2 题解
class Solution {
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (nums[mid] == target)
return mid;
else if (nums[mid] < target)
left = mid + 1;
else
right = mid - 1;
}
if (left > right) {
return -1;
}
return left;
}
}
2 278. 第一个错误的版本
2.1 题目
2.2 题解
public class Solution extends VersionControl {
public int firstBadVersion(int n) {
int left = 1;
int right = n;
while (left < right) {
int mid = left + (right - left) / 2;
if (isBadVersion(mid))
right = mid;
else
left = mid + 1;
}
return left;
}
}
3 35. 搜索插入位置
3.1 题目
3.2 题解
class Solution {
public int searchInsert(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] == target)
return mid;
else if (nums[mid] < target)
left = mid + 1;
else
right = mid - 1;
}
// 没有找到就是left==right的情形,该位置即为需要插入的位置
return left;
}
}
4 总结
4.1 二分查找模板
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (nums[mid] == target)
return mid;
else if (nums[mid] < target)
left = mid + 1;
else
right = mid - 1;
}
if (left > right) {
return -1;
}
return left;
}
4.2 二分查找变形
二分查找是在一个有序的数组中进行元素的查找某一个元素,二分查找的变形有如下(当然还有很多其他的变形):
- 类型
[********########]这样的有序数组,寻找第一个#号的下标。 - 类型
[********########]这样的有序数组,在第一个#号处插入元素。
注:关键在于while中条件的构造,终止条件是left<right。