Skip to content

Latest commit

 

History

History
 
 

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

135.Candy

这是一道经典的贪心法。

我们令f[0]=1,然后从左往右扫一遍,保证f[i]与f[i-1]比较时符合要求,即f[i]=max(1, f[i-1]+1 if rating[i]>rating[i-1]). 这个操作更新了f[i]的下限,是f[i]合法的一个必要条件。言下之意就是说,f[i]不保证是一个合法的分配,但f[i]不能更小了。

然后从右往左扫一遍,保证f[i]与f[i+1]比较时符合要求,即f[i]=max(f[i], f[i+1]+1 if rating[i]>rating[i+1]). 这个操作同样进一步更新了f[i]的下限,即f[i]不能更小了。

以上两步操作都是必要条件,找到了f[i]的一个下限。但是这个下限本身是否就是符合要求的方案呢?事实上就是如此。上面两轮two pass保证了每个小朋友与相邻两个人做比较时都是公平的。换句话说,任意两个相邻小朋友之间的比较和分配都是公平的。所以此时f[i]的分布同时也是一个充分解。

贴着下限的充分解,就是题目要求的最优解(最少分发总数)。

Leetcode Link