0
点赞
收藏
分享

微信扫一扫

Java 第 41 课 962.最大宽度坡 1124.表现良好的最长时间段



第 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


举报

相关推荐

0 条评论