二分查找总结20220829
为什么要使用二分查找?
普通的查找找比较多:the general find need more time!
二分搜索的有点就是时间复杂度是O(logn)的,而普通的查找时间复杂度是O(N)的。但他们所消耗的空间是一样的。同时普通查找不需要数组有序,直接for循环即可,但是二分查找需要数组有一定的顺序。
template
``
public class Solution {
/**
* @param A an integer array sorted in ascending order
* @param target an integer
* @return an integer
*/
public int findPosition(int[] nums, int target) {
if (nums == null || nums.length == 0) {
return -1;
}
int start = 0, end = nums.length - 1;
// 要点1: start + 1 < end
while (start + 1 < end) {
// 要点2:start + (end - start) / 2
int mid = start + (end - start) / 2;
// 要点3:=, <, > 分开讨论,mid 不+1也不-1
if (nums[mid] == target) {
return mid;
} else if (nums[mid] < target) {
start = mid;
} else {
end = mid;
}
}
// 要点4: 循环结束后,单独处理start和end
if (nums[start] == target) {
return start;
}
if (nums[end] == target) {
return end;
}
return -1;
}
}
``
在数组中二分搜索一个数字
必须是有序的,但是递增递减无所谓:
在数组中二分,只要是有序数组,就可以进行二分。递增和递减只会与当前位置与目标值的大小关系如何影响边界变化有关。
Maximum Number in Mountain Sequence
如果你解决了这道题,你会发现,二分问题其实并不需要要求数组一定是严格有序的,我们不能根据数组是否有序来判断是否是二分问题。
那我们该如何判断这个问题是否是二分问题呢?大家可以先思考一下。
不知道大家还记不记得,我们在上一节课就讲了一个判断算法的技巧——通过时间复杂度判断算法。在这里就能用到这个技巧。我们知道二分答案的时间复杂度是O(logn)的。所以当你发现有一个问题,用O(N)的时间复杂度非常好做,或者面试官说:“你给我优化一下这个算法。”那么你优化的思路就是优化到O(logn),也就是尝试使用二分去做,这就是二分算法的判断条件。