剑指Offer 53 54

174 阅读1分钟

这是我参与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)