【算法】day5 二分查找
-
二分查找并不是只适用于有序序列,而是适用于任何能找到“二段性”的序列。
-
二分查找的间隔点并不一定是重点,也可以是 1/3、1/4.... 处,之所以选择 1/2,是因为它的查找效率是所有划分中最高的,这涉及到数学中的概率,不展开证明。
1、朴素二分查找
题目:704. 二分查找 - 力扣(LeetCode)
思路:
代码:
class Solution {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) left = mid+1;else if(nums[mid] > target) right = mid-1;else return mid;}return -1;}
}
模板总结:
2、查找左/右边界的二分
题目:34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)
思路:
代码:
class Solution {public int[] searchRange(int[] nums, int target) {int left = 0, right = nums.length-1;int[] ret = new int[]{-1, -1};if(nums == null || nums.length == 0) return ret;// 找左边界while(left < right) {int mid = left + (right - left)/2;if(nums[mid] < target) left = mid+1;else right=mid;}if(nums[left] == target) ret[0] = left;left = 0;right = nums.length-1;// 找右边界while(left < right) {int mid = left + (right - left + 1)/2;if(nums[mid] > target) right = mid-1;else left = mid;}if(nums[left] == target) ret[1] = left;return ret;}
}
模板总结: