704. 二分查找
class Solution {public int search(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 if (nums[mid] > target)right = mid - 1; // 注意}return -1;}}// 详细解析参见:// https://labuladong.github.io/article/?qno=704
力扣34题
/*** 范围查询规律* 初始化:* int left = 0;* int right = nums.length - 1;* 循环条件* left <= right* 右边取值* right = mid - 1* 左边取值* left = mid + 1* 查询条件* >= target值, 则 nums[mid] >= target时, 都减right = mid - 1* > target值, 则 nums[mid] > target时, 都减right = mid - 1* <= target值, 则 nums[mid] <= target时, 都加left = mid + 1* < target值, 则 nums[mid] < target时, 都加left = mid + 1* 结果* 求大于(含等于), 返回left* 求小于(含等于), 返回right* 示例(求> 或 >=)* private int search(int[] nums, int target) {* int left = 0;* int right = nums.length - 1;* while (left <= right){* int mid = (right - left) / 2 + left;* if (nums[mid] 查询条件 target){* right = mid - 1;* } else {* left = mid + 1;* }* }* return left(根据查询条件确认);* }* 核心思想: 要找某个值, 则查找时遇到该值时, 当前指针(例如right指针)要错过它, 让另外一个指针(left指针)跨过他(体现在left <= right中的=号), 则找到了*/作者:chendragon链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/solution/er-fen-cha-zhao-tong-yong-gui-lu-gu-ding-g93u/来源:力扣(LeetCode)著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
示例
/*** 找数组中第一个 >= 目标值的索引* 没找到则返回数组长度值* 思路:* 大于等于都满足, 则不能取right值, 只能取与left相关的* 由于可以最大值都没有 >= 目标值, 故left要在遍历过程中达到 left > right* 故循环结束条件 left <= right* left要大于right, 则nums[mid] >= target时 right = mid - 1, 是right降到小于目标值的位置, 然后left跨过去* left 固定必须为 mid + 1* 没找到则返回数组长度值*/public static int searchGeTarget(int[] nums, int target){int left = 0;int right = nums.length - 1;while (left <= right){int mid = (right - left) / 2 + left;if (nums[mid] >= target){right = mid - 1;} else {left = mid + 1;}}return left;}/*** 找数组中第一个 > 目标值的索引* 没找到则返回数组长度值*/public static int searchGtTarget(int[] nums, int target){int left = 0;int right = nums.length - 1;while (left <= right){int mid = (right - left) / 2 + left;if (nums[mid] > target){right = mid - 1;} else {left = mid + 1;}}return left;}/*** 找数组第一个 <= 目标值的索引(4,4,4,4)的右边界* 没有则返回-1*/public static int searchLeTarget(int[] nums, int target){int left = 0;int right = nums.length - 1;while (left <= right){int mid = (right - left) / 2 + left;if (nums[mid] > target){right = mid - 1;} else {left = mid + 1;}}return right;}/*** 找数组第一个 < 目标值的索引(4,4,4,4,5)的右边界5* 没有则返回-1*/public static int searchLtTarget(int[] nums, int target){int left = 0;int right = nums.length - 1;while (left <= right){int mid = (right - left) / 2 + left;if (nums[mid] >= target){right = mid - 1;} else {left = mid + 1;}}return right;}
34题代码
class Solution {/*** 二分查找*/public int[] searchRange(int[] nums, int target) {//寻找左边界(这里寻找第一个 >= target的索引)int leftIndex = search(nums, target);if (leftIndex >= nums.length || nums[leftIndex] != target){return new int[]{-1, -1};}//寻找右边界(这里寻找第一个 >= target+1的索引)int rightIndex = search(nums, target + 1);return new int[]{leftIndex, rightIndex - 1};}/*** 寻找第一个>=目标值的索引, 找不到则返回数组长度*/private int search(int[] nums, int target) {int left = 0;int right = nums.length - 1;while (left <= right){int mid = (right - left) / 2 + left;if (nums[mid] >= target){right = mid - 1;} else {left = mid + 1;}}return left;}}
