滑动窗口解决一系列问题

最长递增子序列

http://www.nowcoder.com/questionTerminal/9cf027bf54714ad889d4f30ff0ae5481

图片说明

可以用滑动窗口的方法,但是需要一种数据结构来维护着每个窗口的最大值和最小值。Java中的TreeMap就可以获取最大值和最小值。

class Solution {
    public int longestSubarray(int[] nums, int limit) {
        TreeMap<Integer, Integer> m = new TreeMap<>();
        int left = 0, right = 0;
        int res = 0;
        while(right < nums.length){
            m.put(nums[right], m.getOrDefault(nums[right], 0) + 1);
            while(m.lastKey() - m.firstKey() > limit){
                m.put(nums[left], m.get(nums[left]) - 1);
                if(m.get(nums[left]) == 0){
                    m.remove(nums[left]);
                }
                left++;
            }
            res = Math.max(res, right - left + 1);
            right++;
        }
        return res;
    }
}

  • 时间复杂度:O(N*log(N)),每个元素遍历一次,新元素插入红黑树的调整时间为 O(log(N));
  • 空间复杂度:O(N)。
全部评论

相关推荐

点赞 评论 收藏
分享
HNU_fsq:建议直接出国,这简历太6了。自愧不如
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务