【孩子分糖】-leecode-OJ

/*
 * 原问题:N个孩子站成一排,每个人分给一个权重。按照如下的规则分配糖果: 每个孩子至少有一个糖果;所分配权重较高的孩子,
 * 会比他的邻居获得更多的糖果。 问题是,最少需要多少个糖果?关注微信公众账号“待字闺中”,了解更多。
 * 
 * 分析:每个孩子相对他左右邻居的权重,只有4种确定情形:左低右高,左高右高,左高右低,
 * 左低右低(若权重相等则分配数量相等的糖果即可)。对左低右高的情形,当前权重为他的左邻权重;
 * 左高右高则当前权重为1;左高右低当前权重为他的右邻权重(递归处理),左低右低当前权重为左右邻的较大值(动态规划处理)


 * 附件为在leetcode上通过的测试

 * 通过打印value()的调用次数可以知道时间复杂度是O(n)

 * */



public class Solution {


public int candy(int[] ratings) {
if(ratings.length==1)return 1;
if(ratings.length==2)return ratings[0]==ratings[1]?2:3;
A s = new A();
s.a = ratings;
s.run();
int sum = 0;
for (int j = 0; j < s.a.length; j++) {
sum += s.a[j];
}
return sum;
}


}


class A {
int[] a = {};
int _Lneighborweight = 0;
int k = 0;


int value(int i) {


if (i == 0) {
k++;
if (a[0] < a[1]) {
_Lneighborweight = a[0];
a[0] = 1;
} else if (a[0] > a[1]) {
_Lneighborweight = a[0];
a[0] = value(1) + 1;
if(a[0]<=0)a[0]=1;


} else {
a[0] = 1;
_Lneighborweight = a[0];
}
} else if (i == a.length - 1) {
k++;


if (a[i] <=_Lneighborweight) {
a[i] = 1;
} else {
a[i] = a[i - 1] + 1;
}
} else if (a[i] <= _Lneighborweight && (a[i] < a[i + 1]|| a[i] == a[i + 1])) {//V L


_Lneighborweight = a[i];
k++;
a[i] = 1;
} else if (a[i] > _Lneighborweight && (a[i] < a[i + 1]||a[i] == a[i + 1] )) {//  /  厂  
k++;
_Lneighborweight = a[i];
a[i] = a[i - 1] + 1;


} else if (a[i] > _Lneighborweight && a[i] > a[i + 1]) {// A
k++;
_Lneighborweight = a[i];
int r = value(i + 1);
a[i] = ((a[i - 1] > r) ? a[i - 1] + 1 : r + 1);
} else if (a[i] <= _Lneighborweight && a[i] > a[i + 1]) {// \
k++;
_Lneighborweight = a[i];
a[i] = value(i + 1) + 1;

return a[i];
}


void run() {
for (; this.k < this.a.length;) {
this.value(k);
}
}
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值