二刷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; }

浙公网安备 33010602011771号