LC 2790. 长度递增组的最大数目
https://leetcode.cn/problems/maximum-number-of-groups-with-increasing-length/description/
我看了题解里面两种解法,感觉都挺好的
- 二分 https://leetcode.cn/problems/maximum-number-of-groups-with-increasing-length/solutions/2355580/pai-xu-er-fen-tu-jie-ban-by-yzq-a-smlx/
- 贪心 https://leetcode.cn/problems/maximum-number-of-groups-with-increasing-length/solutions/2355412/tan-xin-by-kuang-qie-2-fw0r/
二分的思路就是检查K个长度是否可以达到,我们可以从最大的往前填补:
- 如果当前值超过预期值,那么多余的不能被使用。
- 如果当前不够预期值的话,那么可以从后面的找补回来。
- 但是填充的时候应该使用当前值。
class Solution:
def maxIncreasingGroups(self, usageLimits: List[int]) -> int:
usageLimits.sort(reverse=True)
def test(K):
gap = 0
for x in usageLimits:
gap = min(gap + x - K, 0) # 只使用当前值去填充,之前多出来的会回填到之前的空处。
# 因为我们这里是从大到小填充,所以肯定不会出现重叠的情况。
if K > 0:
K -= 1
return gap >= 0
s, e = 1, len(usageLimits)
while s <= e:
k = (s + e) // 2
if test(k):
s = k + 1
else:
e = k - 1
return e
贪心则是从小到大进行填充:
- 如果当前填满的话,那么将多余的放在后面,并且将预期值+1
- 因为后面的数更大,会尽量用后面的数去填,所以不会出现重叠
class Solution:
def maxIncreasingGroups(self, usageLimits: List[int]) -> int:
usageLimits.sort()
xs = usageLimits.copy()
n = len(xs)
xs.append(0)
ans = 1
for i in range(n):
if xs[i] >= ans:
xs[i] -= ans
ans += 1
xs[i + 1] += xs[i]
return ans - 1