JZ53-I 在排序数组中查找数字 I
先使用二分查找搜索目标数字位置,找到目标数字后再向两边计算目标数字出现的次数(优化:两次二分查找,分别找到左边界和右边界)
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 ;
}
}
JZ53-II 0~n-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;
}
}
JZ54 二叉搜索树的第k大节点
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) ;
}
}
JZ55-I 二叉树的深度
class Solution {
int res;
public int maxDepth ( TreeNode root) {
res = 0 ;
if ( root == null ) return res;
preorder ( root, 1 ) ;
return res;