解题思路:
二分法:
- 数组单调有序
- 时间复杂度O(nlogn)
满足上述条件就可以先考虑二分法
使用两个二分查找, 一个二分查找左边界, 一个二分查找右边界
查找左边界时:
当nums[mid] = target
时, right = mid - 1;
查找右边界时:
当nums[mid] = target
时, left = mid - 1;
- 为何查找左边界时, 当
nums[left] == target
直接返回left
?
处于while
循环中的时候, 由于一直在二分查找, 所以一定会有指针left
和指针right
指向同一个元素下标的时候
此时,left = right = mid
、nums[left] = nums[right] = nums[mid] = target
, 继续执行条件3right = mid - 1;
, 则right
在left
左侧, 跳出while
循环
跳出while
循环后,left
就是左边界, 同时nums[left] = target
- 同理, 查找右边界时, 当
nums[right] == target
直接返回right
class Solution {
public int leftNum(int[] nums, int target){
int left = 0, right = nums.length - 1;