滑动窗口解决一系列问题
最长递增子序列
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)。
深信服公司福利 832人发布
