本文最后更新于 3 分钟前,文中所描述的信息可能已发生改变。
3637. 三段式数组 I - 力扣(LeetCode)
解题思路
一次遍历,注意判断相邻值相同的情况
示例代码
python
class Solution:
def isTrionic(self, nums: List[int]) -> bool:
d = []
for x, y in pairwise(nums):
if x == y:
return False
t = 1 if x < y else -1
if d and t * d[-1] > 0:
d[-1] += t
else:
d.append(t)
return d[0] > 0 and len(d) == 33638. 平衡装运的最大数量 - 力扣(LeetCode)
解题思路
贪心,每次取相邻两个元素判断,满足数量加 1,下标加 1
示例代码
python
class Solution:
def maxBalancedShipments(self, weight: List[int]) -> int:
n = len(weight)
ans = i = 0
while i < n:
if i + 1 < n and weight[i + 1] < weight[i]:
i += 1
ans += 1
i += 1
return ans3639. 变为活跃状态的最小时间 - 力扣(LeetCode)
解题思路
二分,判别函数用贡献法计算即可
示例代码
python
class Solution:
def minTime(self, s: str, order: List[int], k: int) -> int:
n = len(s)
order = [-1] + order
def check(m):
t = sorted(order[: m + 2])
return sum((y - x) * (n - y) for x, y in pairwise(t)) >= k
l = 0
r = n - 1
while l <= r:
m = l + r >> 1
if check(m):
r = m - 1
else:
l = m + 1
return l if check(l) else -13640. 三段式数组 II - 力扣(LeetCode)
解题思路
类似分组循环,不过多遍历了一次,另外首段递增用二分查找分界点,末段直接判断是否为正值,否则只累加nums[q + 1]
示例代码
python
class Solution:
def maxSumTrionic(self, nums: List[int]) -> int:
d = []
for x, y in pairwise(nums):
if x == y:
d.append(0)
else:
t = 1 if x < y else -1
if d and t * d[-1] > 0:
d[-1] += t
else:
d.append(t)
j = 0
ans = -inf
pre = list(accumulate(nums, initial=0))
for i in range(len(d) - 2):
if d[i] > 0 and d[i + 2] > 0 and d[i + 1] < 0:
l = j
p = l + d[i]
q = p + abs(d[i + 1])
r = q + d[i + 2]
lidx = bisect_left(nums, 0, l, p - 1)
tmp = pre[p + 1] - pre[lidx] + \
pre[q + 1] - pre[p + 1] + \
max(pre[r + 1] - pre[q + 1], nums[q + 1])
ans = max(ans, tmp)
j += abs(d[i]) if d[i] else 1
return ans