leetcode 135. Candy 分糖果 + 很经典的贪心算法
2017-09-17 10:33
621 查看
There are N children standing in a line. Each child is assigned a rating value.
You are giving candies to these children subjected to the following requirements:
Each child must have at least one candy.
Children with a higher rating get more candies than their neighbors.
What is the minimum candies you must give?
典型的贪心算法题本身可以用贪心法来做,我们用candy
表示每个孩子的糖果数,遍历过程中,如果孩子i+1的rate大于孩子i 的rate,那么当前最好的选择自然是:给孩子i+1的糖果数=给孩子i的糖果数+1如果孩子i+1的rate小于等于孩子i 的rate咋整?这个时候就不大好办了,因为我们不知道当前最好的选择是给孩子i+1多少糖果。
代码如下:
下面是C++的做法,这道题是的典型的贪心算法的一个简单应用,需要好好学习
注意反向遍历的时候注意dp的比较
代码如下:
You are giving candies to these children subjected to the following requirements:
Each child must have at least one candy.
Children with a higher rating get more candies than their neighbors.
What is the minimum candies you must give?
典型的贪心算法题本身可以用贪心法来做,我们用candy
表示每个孩子的糖果数,遍历过程中,如果孩子i+1的rate大于孩子i 的rate,那么当前最好的选择自然是:给孩子i+1的糖果数=给孩子i的糖果数+1如果孩子i+1的rate小于等于孩子i 的rate咋整?这个时候就不大好办了,因为我们不知道当前最好的选择是给孩子i+1多少糖果。
代码如下:
import java.util.Arrays; /* * 典型的贪心算法 * 题本身可以用贪心法来做,我们用candy 表示每个孩子的糖果数,遍历过程中, * 如果孩子i+1的rate大于孩子i 的rate,那么当前最好的选择自然是:给孩子i+1的糖果数=给孩子i的糖果数+1 * 如果孩子i+1的rate小于等于孩子i 的rate咋整?这个时候就不大好办了, * 因为我们不知道当前最好的选择是给孩子i+1多少糖果。 * 解决方法是:暂时不处理这种情况。等数组遍历完了,我们再一次从尾到头遍历数组, * 这回逆过来贪心,就可以处理之前略过的孩子。 * 最后累加candy 即得到最小糖果数。 * */ public class Solution { public int candy(int[] ratings) { if(ratings==null || ratings.length<=0) return 0; int []num = new int[ratings.length]; Arrays.fill(num, 1); for(int i=1;i<ratings.length;i++) { if(ratings[i]>ratings[i-1]) num[i]=num[i-1]+1; } for(int i=ratings.length-2;i>=0;i--) { if(ratings[i]>ratings[i+1] && num[i] < num[i+1]+1) num[i]=num[i+1]+1; } int sum=0; for(int i=0;i<num.length;i++) sum+=num[i]; return sum; } }
下面是C++的做法,这道题是的典型的贪心算法的一个简单应用,需要好好学习
注意反向遍历的时候注意dp的比较
代码如下:
#include <iostream> #include <vector> #include <map> #include <unordered_map> #include <set> #include <unordered_set> #include <queue> #include <stack> #include <string> #include <climits> #include <algorithm> #include <sstream> #include <functional> #include <bitset> #include <numeric> #include <cmath> #include <regex> using namespace std; class Solution { public: int candy(vector<int>& r) { int n = r.size(); vector<int> dp(n, 1); for (int i = 1; i < n; i++) { if (r[i] > r[i - 1]) dp[i] = dp[i - 1] + 1; } for (int i = n - 2; i >= 0; i--) { if (r[i] > r[i + 1] && dp[i] < dp[i + 1]+1) dp[i] = dp[i + 1] + 1; } return accumulate(dp.begin(), dp.end(), 0); } };
相关文章推荐
- LeetCode 135. Candy(糖果)
- (Java) LeetCode 135. Candy —— 分发糖果
- LeetCode-135. Candy (JAVA)根据等级分糖果
- LeetCode 198. House Robber - 贪心算法
- 【LeetCode-面试算法经典-Java实现】【105-Construct Binary Tree from Preorder and Inorder Traversal(构造二叉树)】
- leetcode经典编程题(4)
- [LeetCode]Candy——分糖果问题
- leetcode 575. 分糖果
- 【LeetCode-面试算法经典-Java实现】【111-Minimum Depth of Binary Tree(二叉树的最小深度)】
- 【LeetCode-面试算法经典-Java实现】【120-Triangle(三角形)】
- 每天一道LeetCode-----分糖果问题
- 【LeetCode-面试算法经典-Java实现】【136-Single Number(只出现一次的数字)】
- Leetcode 135. Candy
- [leetcode] 135. Candy
- 【LeetCode-面试算法经典-Java实现】【001-Two Sum(求两个数的和)】
- 【LeetCode-面试算法经典-Java实现】【168-Excel Sheet Column Title(Excell列标题)】
- 【leetcode】经典算法题-Counting Bits
- 【leetcode73】经典算法-Guess Number Higher or Lower
- 【LeetCode-面试算法经典-Java实现】【019-Remove Nth Node From End of List(移除单链表的倒数第N个节点)】
- NYOJ 91 阶乘之和 (经典贪心算法)