20200315
题目 在排序数组中查找数字|
统计一个数字在排序数组中出现的次数。
思路 :第一眼看去一个hashmap搞定,但是给定的是一个已经排序后的数组,所有采用二分法。
code
class Solution{
public int search(int[] nums, int target){
int l = 0;
int r = nums.length - 1;
int ans = 0;
while(l <= r){
int temp = (l + r) >> 1;
if(nums[temp] < target){
l = temp + 1;
}else if(nums[temp] > target){
r = temp - 1;
}else{
for(int i = temp; i >= 0 && nums[i] == target;i--, ans++);
for(int i = temp + 1; i < nums.length && nums[i] == target;i++,ans++);
break;
}
}
return ans;
}
}
题目 :0~n-1中缺失的数字
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
思路 :利用二分查找,如果当前数字与当前位置相等,则说明前面的数字都没有缺失,接着对后半部分进行查找;
code
class Solution{
public int missingNumber(int[] nums){
int low = 0;
int high = nums.length;
while(low < high){
int mid = (low + high) >> 1;
if(nums[mid] != mid) high = mid;
else low mid + 1;
}
return low;
}
}
题目 :二叉搜索树的第k大节点
给定一颗二叉搜索树,请找出其中第k大的节点。
示例
输入: root = [3,1,4,null,2], k = 1
3
/ \
1 4
\
2
输出: 4
思路 :二叉树的一个特性:通过中序遍历得到的序列,是有序的。
当遍历到第K大数的时,停止遍历。
code
class Solution{
private int ans = 0, count = 0;
public int kthLargest(TreeNode root, int k){
helper(root,k);
return ans;
}
private void helper(TreeNode root, int k){
if(root.right != null) helper(root.right, k);
if(++count == k){
ans = root.val;
return ;
}
if(root.left != null) helper(root.left,k);
}
}