LeetCode 经典 150 · 可视化
逐步动画、变量流转与五语言代码参考
#135 · 数组 / 字符串
分发糖果
Candy
ratings = [1,0,2]线性序列4 个关键状态
步骤 1初始化每人 1 颗糖。
c=[1,1,1]1
01
11
2推荐
左右两遍扫描
时间
O(n)空间 O(n)左扫满足左邻规则,右扫用最大值同时满足右邻规则。
1function candy(ratings) {2 const c = Array(ratings.length).fill(1);3 for (let i = 1; i < ratings.length; i++)4 if (ratings[i] > ratings[i - 1]) c[i] = c[i - 1] + 1;5 for (let i = ratings.length - 2; i >= 0; i--)6 if (ratings[i] > ratings[i + 1]) c[i] = Math.max(c[i], c[i + 1] + 1);7 return c.reduce((a, b) => a + b, 0);8}多语言参考
来源 · CC BY-SA 4.0 ↗Java · C++ · Go
这是一组同题正确实现,独立于上方当前动画方法;不同语言可能采用另一种正确策略。
1class Solution {2 public int candy(int[] ratings) {3 int n = ratings.length;4 int[] left = new int[n];5 int[] right = new int[n];6 Arrays.fill(left, 1);7 Arrays.fill(right, 1);8 for (int i = 1; i < n; ++i) {9 if (ratings[i] > ratings[i - 1]) {10 left[i] = left[i - 1] + 1;11 }12 }13 for (int i = n - 2; i >= 0; --i) {14 if (ratings[i] > ratings[i + 1]) {15 right[i] = right[i + 1] + 1;16 }17 }18 int ans = 0;19 for (int i = 0; i < n; ++i) {20 ans += Math.max(left[i], right[i]);21 }22 return ans;23 }24}交互式算法学习
从执行步骤真正理解 LeetCode 经典 150
本站整理 150 道高频算法面试题和 302 种解法。动画方法同步展示 JavaScript 与 Python;每题另提供 Java、C++ 与 Go 同题参考实现。