已经好久没有更新了,目前的刷题情况是:已经作了600+道题,基本覆盖全部常见类型,拿到一道题通常有思路或者大体的方向,easy和偏简单的median基本没问题,难度较大的题目作不作得出来主要看类型。contest从一开始的一两道甚至一道都作不出到如今三道甚至四道(题目比较简单常规时)。可是回过头去看作过的这些题水分仍是有的,作过的题作不出来或者有思路写不出bug free的代码是常有的事情,因此新开了一个section按tag重刷一遍,尤为是高频。以后复习完每一个专题会来这边简单地写写小结,但愿别坑掉。数组
Sliding Window
Sliding Window的本质:对于每个尾指针j,使用移动头指针i的方式,求以j结尾的知足条件的最长或最短的subarray。时间复杂度通常为O(N),由于头指针i和尾指针j只能move forward,不能backward。
当题目要求最长或最短的subarray时考虑用sliding window,看对于每个以j结尾的subarray,头指针i是否只能向前移动,若是是的能够用sliding window解决,若是i能够向后移动就考虑其余解法。典型的题目如:指针
340 Longest Substring with At Most K Distinct Characters
这两道都用的是HashMap+count
992 Subarrays With K Different Integers:这道题是340的拓展,关键在于:
exactly(K) = most(K) - most(K-1)
424 Longest Repeating Character Replacementcode
还有一种sliding window是移动一个固定长度的窗口,例如
567 Permutation in String:HashMap+count
239 Sliding Window Maximum
1100 Find K-Length Substrings With No Repeated Characters
480 Sliding Window Median
这一类的题目都是考虑一个“进出”的问题,窗口每移动一个单位,就把最左边不在窗口里的删掉,把最右边的加进窗口中leetcode
还有一些没有归类到Sliding Window,但我的以为用到了Sliding Window思想的题目:
795. Number of Subarrays with Bounded Maximumget
Subarray sum
看到和subarray sum相关的题目,第一反应是从prefix sum入手。虽然切入点都是prefix sum,但具体处理起来方法不少
560 Subarrays sum equal to K:求和为K的subarray的个数。用HashMap存储distinct prefix sum和其个数
1074 Number of Matrix that sum to target: 560的延伸,从一维到二维。基本方法仍是同样的,重点是如何将二维数组压缩成一维数组。具体实现我会在二维数组部分进行总结(若是我真的写了的话。。。)
209.subarray sum equals k:给一个正数数组,求使得和>=s的最短subarray的长度。这道题有一种O(N)解法和一种O(NlogN)的解法。O(N):Sliding window, O(NlogN): TreeMap/Binary Search,这里TreeMap记录的是前缀和和其index
ps: 这道题里全部数都是正数,若是会出现负数怎么处理呢?
这就是862. Shortest Subarray with Sum at Least K,须要用到deque,和Sliding Window Maximum解法比较相似,本质是monotonic queue,关于这个问题以后有空再总结string