二分思想总结:
- 确保题目是有序排列(升序,降序)都可以;
- 二分可以解决的问题有,查找目标元素,寻找插入位置
704. 二分查找
class Solution {
public int search(int[] nums, int target) {
int l = 0, r = nums.length - 1;
while (l <= r ) {
int mid = l + (r - l) / 2;
if (nums[mid] < target) {
l = mid + 1;
} else if (nums[mid] > target) {
r = mid - 1;
} else {
return mid;
}
}
return -1;
}
}
278. 第一个错误的版本
/* The isBadVersion API is defined in the parent class VersionControl.
boolean isBadVersion(int version); */
public class Solution extends VersionControl {
public int firstBadVersion(int n) {
int left = 1, right = n, mid = 1 ;
while (left < right) { // 循环至区间左右端点相同
mid = left + (right - left) / 2; // 防止计算时溢出
if (isBadVersion(mid)) {
right = mid; // 答案在【left, mid】
} else {
left = mid + 1; // 答案在【mid + 1, right】
}
}
// 此时left = right,答案即为一个点,
return left;
}
}
35. 搜索插入位置
class Solution {
public int searchInsert(int[] nums, int target) {
int index = 0;
for (int i = 0; i <= nums.length - 1; i++) {
if (nums[i] == target) {
return index;
} else if (nums[i] > target) {
return index;
}
index++;
}
return nums.length;
}
}