leetcode糖果问题,这种做法为什么可行?-灵析社区

Mia好纠结

leetcode糖果问题,这种做法为什么可行? [leetcode糖果问题](https://link.segmentfault.com/?enc=qmaNQWeOe4%2BDCx2tFqGVhw%3D%3D.ocar3CDjNlgV9MLKyPLyELfql2evkFnhSBEaDMvUiLTBso5mdCnGVDVc%2FP28TvnuOEv5a7AceMcp%2BQs3ZMnERpiHuJmRz5qSw63E9%2BedWPCsaPOatMVNGl0vY2ecVe%2FPhkXcR%2Bfwqi0naBCxICYhLDjqJOMhWCmnT65lVxMN%2FpOxPQWmM%2BR8e4dz2vTpSXHu) 这个官方题解并没有证明,只是说了一下过程。我有以下几点疑问: * `left[..]`是在仅符合左规则下分的糖果最少的分配方案吗?同样的`right[...]`是在仅符合右规则下分的糖果最少的分配方案吗? * 为什么取仅符合左规则的值和仅符合右规则的值的最大值可以同时符合左右规则呢? * 就算符合左右规则,为什么这种方案下分的糖果是最少的呢? ![image.png](https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241004/9a8115caf5d15e6e8dcd5785532d0a1a.png) var candy = function(ratings) { const n = ratings.length; const left = new Array(n).fill(0); for (let i = 0; i 0 && ratings[i] > ratings[i - 1]) { left[i] = left[i - 1] + 1; } else { left[i] = 1; } } let right = 0, ret = 0; for (let i = n - 1; i > -1; i--) { if (i ratings[i + 1]) { right++; } else { right = 1; } ret += Math.max(left[i], right); } return ret; }; 附: 我凭感觉也写了一种解法,通过了但是我并不知道这是否真的正确。如果是正确的,该怎么证明?如果是错误的,它哪里有问题? function candy(ratings) { /* candy[i] : the min number of candy the i th people can get based on ratings[0...i], we calculate candy[0...i] if we add ratings[i+1], how to calculate candy[0...i+1] guess(I don't know how to proof): 1. ratings[i+1] > ratings[i], candy[i+1] = candy[i] + 1 2. ratings[i+1] == ratings[i], candy[i+1] = 1 3. ratings[i+1] 1 => candy[i + 1] = 1 candy[i] == 1 => candy[i] += 1, candy[i] = 1 => if ratings[i-1] > ratings[i], and candy[i-1] >=(actual = ) ratings[i] candy[i-1] += 1 => ... based on rating[0] candy[0] = 1 */ const n = ratings.length; const minCandies = Array(n).fill(1); for (let i = 1; i ratings[i - 1]) { minCandies[i] = minCandies[i - 1] + 1; } else if (ratings[i] === ratings[i - 1]) { minCandies[i] = 1; } else { minCandies[i] = 1; if (minCandies[i - 1] == 1) { minCandies[i - 1]++; let cur = i - 1; while ( cur - 1 >= 0 && ratings[cur - 1] > ratings[cur] && minCandies[cur - 1] pre + cur); }

阅读量:146

点赞量:0

问AI
«left[..]是在仅符合左规则下分的糖果最少的分配方案吗?同样的right[...]是在仅符合右规则下分的糖果最少的分配方案吗?» 是 «为什么取仅符合左规则的值和仅符合右规则的值的最大值可以同时符合左右规则呢?» 如果 "rating[i] = left[i+1]", 所以,"candy[i] rating[j] > rating[j+1]"。 否则,利用数学归纳法,如果对 N 个及以下孩子时时最小的。对 N+1 个孩子的情况,除去以上讨论过的情形 1) 如果存在 k,使得 "raing[k] == rating[k+1]",则整个问题可以拆解为 [0..k], [k+1..N] 两个子问题,长度分别为 k+1 与 N-k。两个区间内left, right, candy 的取值均互不影响。由归纳假设,可以得到最小值 2) 否则,则一定存在 k ,使得 "rating[k-1] > rating[k] < rating[k+1]"。 此时,可以令 "candy[k] = 1"。"[0,k]" 区间 与 "[k,N]" 区间相互独立,两个区间内left, right, candy 的取值均互不影响。于是这就形成了两个长度分别为 k+1 与 N-k+1 的子问题。由归纳假设,可知可以分别得到他们的最小值,于是对N+1 的情况也可以得到最小值。 以上方式可以同样用于证明你自己的解法。