class Solution {
public int search(int[] nums, int target) {
//二分查找,左闭右闭
int left = 0;
int right = nums.length - 1;
int count = 0;
while(left <= right){
int mid = left + (right - left) / 2;
if(nums[mid] > target){
right = mid - 1;
}else if(nums[mid] < target){
left = mid + 1;
}else{
//向两边搜索
int i = mid;
int j = mid;
count += 1;
while(i >= 1 && nums[i - 1] == target){
count++;
i--;
}
while(j < nums.length - 1 && nums[j + 1] == target){
count++;
j++;
}
return count;
}
}
return count;
}
//优化
public int search(int[] nums, int target) {
//二分查找,左闭右闭
//搜索右边界
int left = 0;
int right = nums.length - 1;
int rightBorder = 0;
while(left <= right){
int mid = left + (right - left) / 2;
if(nums[mid] > target){
right = mid - 1;
}else if(nums[mid] <= target){
left = mid + 1;
}
}
if(left == 0 || nums[left - 1] != target) return 0; //未搜索到目标值
rightBorder = left;
//搜索左边界
int leftBorder = 0;
left = 0;
right = rightBorder; //左边界肯定在右边界左边
while(left <= right){
int mid = left + (right - left) / 2;
if(nums[mid] >= target){
right = mid - 1;
}else if(nums[mid] < target){
left = mid + 1;
}
}
leftBorder = right;
return rightBorder - leftBorder - 1;
}
}
class Solution {
public int missingNumber(int[] nums) {
//二分查找
int left = 0;
int right = nums.length - 1;
while(left <= right){
int mid = left + (right - left) / 2;
if(nums[mid] > mid){
right = mid - 1;
}else{
left = mid + 1;
}
}
return left;
}
}
class Solution {
int res, count; //注意这里使用全局变量不容易混淆
public int kthLargest(TreeNode root, int k) {
//中序遍历的逆序右中左
count = 0;
reverseInorder(root, k);
return res;
}
private void reverseInorder(TreeNode root, int k){
if(root == null) return;
if(count == k) return;
reverseInorder(root.right, k);
count++;
if(count == k){
res = root.val;
return;
}
reverseInorder(root.left, k);
}
}
class Solution {
int res;
public int maxDepth(TreeNode root) {