这是我参与8月更文挑战的第26天,活动详情查看:8月更文挑战
剑指 Offer 53 - I. 在排序数组中查找数字 I
题目
统计一个数字在排序数组中出现的次数
示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: 2
示例 2:
输入: nums = [5,7,7,8,8,10], target = 6
输出: 0
限制:
0 <= 数组长度 <= 50000
方法一
朴素做法:枚举一遍数组并计数
class Solution {
public int search(int[] nums, int target) {
int res = 0;
for (int x : nums)
if (x == target)
res ++;
return res;
}
}
时间复杂度: O(n)
空间复杂度: O(1)
方法二
二分:题目说明是一个排序数组,可以通过二次二分,分别求得target的左右边界,相减得出答案
class Solution {
public int search(int[] nums, int target) {
int n = nums.length;
if (n == 0) return 0;
int l = 0, r = n - 1;
while (l < r) {
int mid = l + r + 1 >> 1;
if (nums[mid] <= target) l = mid;
else r = mid - 1;
}
if (nums[l] != target) return 0;
int first = l;
l = 0; r = n - 1;
while (l < r) {
int mid = l + r >> 1;
if (nums[mid] >= target) r = mid;
else l = mid + 1;
}
return first - l + 1;
}
}
时间复杂度: O(logn)
空间复杂度: O(1)
剑指 Offer 54. 二叉搜索树的第k大节点
题目
给定一棵二叉搜索树,请找出其中第k大的节点。
示例 1:
输入: root = [3,1,4,null,2], k = 1
3
/ \
1 4
\
2
输出: 4
示例 2:
输入: root = [5,3,6,2,4,null,null,1], k = 3
5
/ \
3 6
/ \
2 4
/
1
输出: 4
限制:
- 1 ≤ k ≤ 二叉搜索树元素个数
方法一
DFS:题目所给的是一个搜索树,所以大的一定在右子树,所以搜索顺序为右、根、左;
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
int res, k;
public int kthLargest(TreeNode root, int _k) {
k = _k;
dfs(root);
return res;
}
boolean dfs(TreeNode root) {
if (root == null) return false;
if (dfs(root.right)) return true;
k --;
if (k == 0) {
res = root.val;
return true;
}
if (dfs(root.left)) return true;
return false;
}
}
时间复杂度: O(k)
空间复杂度: O(k)