滑动窗口解决一系列问题
最长递增子序列
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)。