力扣---2020.6.3

837. 新21点

class Solution {
    public double new21Game(int N, int K, int W) {
        if (K == 0) {
            return 1.0;
        }
        double[] dp = new double[K + W];
        for (int i = K; i <= N && i < K + W; i++) {
            dp[i] = 1.0;
        }
        dp[K - 1] = 1.0 * Math.min(N - K + 1, W) / W;
        for (int i = K - 2; i >= 0; i--) {
            dp[i] = dp[i + 1] - (dp[i + W + 1] - dp[i + 1]) / W;
        }
        return dp[0];
    }
}

面试题 04.06. 后继者

class Solution {

    public TreeNode inorderSuccessor(TreeNode root, TreeNode p) {
        if (root == null) {
            return null;
        }
        // 当前节点值小于等于目标值,那么当前目标值的后继者必然在右子树
        if (p.val >= root.val) {
            return inorderSuccessor(root.right, p);
        }
        // 否则结果有可能是当前节点,或者在当前节点的左子树中
        // 那么先去左子树找一下试试,找不到的话返回当前节点即是结果
        TreeNode node = inorderSuccessor(root.left, p);
        return node == null ? root : node;
    }
}

class Solution {
    public TreeNode inorderSuccessor(TreeNode root, TreeNode p) {
        if(root == null) return null;
        TreeNode node = inorderSuccessor(root.left, p);
        if(node != null) return node;

        if(root.val > p.val) return root;

        return inorderSuccessor(root.right, p);
    }
}

面试题 17.14. 最小K个数

class Solution {
    public int[] smallestK(int[] arr, int k) {
        PriorityQueue<Integer> pq = new PriorityQueue<>((a,b)->b-a);
        int[] ans = new int[k];
        for(int n:arr){
            pq.add(n);
            if(pq.size()>k){
                pq.poll();
            }
        }

        for(int i = 0;i<k;i++){
            ans[i] = pq.poll();
        }
        return ans;
    }
}
class Solution {
    public int[] smallestK(int[] arr, int k) {
        Arrays.sort(arr);
        return Arrays.copyOfRange(arr,0,k);
    }
}

你知道的越多,你不知道的越多。

你可能感兴趣的:(数据结构与算法)