二刷Leetcode-Days03

贪心算法:

    /**
     * 455. 分发饼干
     * @param g
     * @param s
     * @return
     */
    public int findContentChildren(int[] g, int[] s) {
        // 优先考虑胃口,先喂饱大胃口
        Arrays.sort(g);
        Arrays.sort(s);
        int start = s.length - 1;
        int count = 0;
        // 胃口优先,如果是饼干优先,for 饼干,if 控制胃口
        // 如果最大胃口大于最大饼干,则全部遍历失败的情况,下同理
        for (int i = g.length - 1; i >= 0; i--) {
            if (start >= 0 && g[i] <= s[start]) {
                count++;
                start--;
            }
        }
        return count;
    }

    public int findContentChildren2(int[] g, int[] s) {
        // 优先考虑饼干,小饼干先喂饱小胃口
        Arrays.sort(g);
        Arrays.sort(s);
        int start = 0;
        int count = 0;
        for (int i = 0; i < s.length && start < g.length; i++) {
            if (s[i] >= g[start]) {
                start++;
                count++;
            }
        }
        return count;
    }

动态规划:

    /**
     * 509. 斐波那契数
     * @param n
     * @return 斐波那契数列,该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。
     */
    public static int fib(int n) {
        // 从 0 开始的
        if (n == 0 || n == 1) {
            return n == 0 ? 0 : 1;
        }
        // 显然,从题目中就可以看出,当前项的值一定是由上两个状态推导出来的 --> 考虑 dp
        // 确定dp数组、下表含义表示斐波那契数第n位的数值,由于从第0位开始,所以空间为 n+1
        int[] dp = new int[n + 1];
        // 确定递推公式 dp[i] = dp[i - 1] + dp[i - 2]
        // dp数组如何初始化 由于和前两项值有关,显然需要初始化 dp[0] 和 dp[1],这两项值直接计算就好
        dp[0] = 0;
        dp[1] = 1;
        // 确定遍历顺序  同上,所以要从第2项开始 dp[2] = dp[1] + dp[0]
        for (int i = 2; i <= n; i++) {
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[n];
    }

单调栈:

    /**
     * 739. 每日温度
     * @param temperatures 给定一个整数数组 temperatures ,表示每天的温度
     * @return 返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。
     * 如果气温在这之后都不会升高,请在该位置用 0 来代替。
     */
    public int[] dailyTemperatures(int[] temperatures) {
        int[] res = new int[temperatures.length];
        // Deque 效率明显比 Stack 高很多
        // Stack<Integer> stack = new Stack<>();
        Deque<Integer> stack = new LinkedList<>();
        stack.push(0);
        for (int i = 1; i < temperatures.length; i++) {
            if (temperatures[i] <= temperatures[stack.peek()]) {
                stack.push(i);
            } else {
                while (!stack.isEmpty() && temperatures[i] > temperatures[stack.peek()]) {
                    int index = stack.pop();
                    res[index] = i - index;
                }
                stack.push(i);
            }
        }
        return res;
    }

    /**
     * 更高效的算法,从后往前考虑
     */
    public int[] dailyTemperatures2(int[] temperatures) {
        int[] res = new int[temperatures.length];
        for (int i = temperatures.length - 2; i >= 0; i--) {
            for (int j = i + 1; j < temperatures.length; j += res[j]) {
                if (temperatures[i] < temperatures[j]) {
                    res[i] = j - i;
                    break;
                } else if (res[j] == 0) {
                    res[i] = 0;
                    break;
                }
            }
        }
        return res;
    }

 

posted @ 2023-05-16 11:00  LinxhzzZ  阅读(14)  评论(0)    收藏  举报