第 41 课
- 962.最大宽度坡
- 1124.表现良好的最长时间段
962.最大宽度坡
class Solution:
def maxWidthRamp(self, nums: List[int]) -> int:
# list
q, n, ans = [], len(nums), 0
for i, x in enumerate(nums):
if not q or x < nums[q[-1]]: # 依次保存值更小的下标,单调递减
q.append(i)
for i in range(n - 1, -1, -1):
# 和栈顶比较,更新答案,记录最大宽度,同时栈顶元素已经完成使命。
while q and nums[i] >= nums[q[-1]]:
ans = max(ans, i - q.pop())
return ans
# sort 对索引排序
# n, ans = len(nums), 0
# minidx = n - 1
# idx = sorted(range(n), key=lambda i : nums[i])
# for i in idx:
# ans = max(ans, i - minidx)
# minidx = min(minidx, i)
# return ans
class Solution {
public int maxWidthRamp(int[] nums) {
// Deque 8 ms
// int ans = 0, n = nums.length;
// Deque<Integer> q = new LinkedList<>();
// for (int i = 0; i < n; i++){
// if (q.isEmpty() || nums[i] < nums[q.peek()]) q.push(i);
// }
// for (int i = n - 1; i >= 0; i--){
// while (!q.isEmpty() && nums[i] >= nums[q.peek()]){
// ans = Math.max(ans, i - q.pop());
// }
// }
// return ans;
// array 2 ms
// int top = 0, ans = 0, n = nums.length;
// int[] q = new int[n];
// for (int i = 1; i < n; i++){
// if (nums[i] < nums[q[top]]) {
// q[++top] = i;
// }
// }
// for (int i = n - 1; i >= 0; i--){
// while (top >= 0 && nums[i] >= nums[q[top]]){
// ans = Math.max(ans, i - q[top--]);
// }
// }
// return ans;
// sort 30 ms 按值对索引排序
int ans = 0, n = nums.length, min = n - 1;
Integer[] idx = new Integer[n];
for (int i = 0; i < n; i++) idx[i] = i;
Arrays.sort(idx, (i, j) -> nums[i] - nums[j]); // ★ 只对索引排序
for (int i : idx){
ans = Math.max(ans, i - min); // 当前索引和之前的最小索引差
min = Math.min(min, i);
}
return ans;
}
}
1124.表现良好的最长时间段
class Solution:
def longestWPI(self, hours: List[int]) -> int:
arr = [1 if h > 8 else -1 for h in hours]
acc = list(accumulate(arr, initial=0))
# 找最后一个比它大的
ans, n, q = 0, len(acc), []
for i, x in enumerate(acc):
if not q or x < acc[q[-1]]:
q.append(i)
# 注意 acc 就是一个普通的列表
for i in range(n-1,-1,-1):
while q and acc[i] > acc[q[-1]]:
ans = max(ans, i-q.pop())
return ans