问题0:
全为正整数的未排序数组累加和为指定值的最长长度:
窗口滑动,时间O(N)
[L,R],若窗口和小于给定值,则R++,小于则L++。
问题A:
未排序数组累加和为指定值的最长长度:
哈希+前缀和,时间O(N)
哈希保存(sum,loc),已经遍历过的累加和及其最后位置。
问题B:
未排序数组累加和为指定值的最长长度,额外要求正负数个数相同:
哈希+前缀和,时间O(N)
使用两个数组,一个原数组采用上面方法。
另一个数组将负数置为-1,正数置为1,则累加和为0为正负个数相同
问题C:
未排序数组只有0和1,累加和为指定值的最长长度,且0和1个数相同:
哈希+前缀和,时间O(N)
使用两个数组,一个原数租采用上面方法。
另一个数组将1不变,0置为-1,则累加和为0为0和1个数相同。
问题D:
未排序数组累加和小于或等于指定值的最长长度:
后缀最小和+窗口滑动,时间O(N)
k,指定值
minSum[i] 表示 必须以 数组i 开头的最小累加和
minEnd[i] 表示 满足上列条件的最终位置
窗口滑动[l,r],初始l=0,r=0,窗口和sum = 0
若sum + minSum[r] <= k ,则向右扩至 r = minEnd[r] + 1,新窗口为[ l , r ]
否则 l++,r不变
若窗口里没有数字,则r = l + 1,直到结尾。
问题E:
数组不重复字符子串长度:
哈希+窗口滑动,时间O(N)
哈希记录当前窗口内每个字符的个数,L,R窗口滑动,当R碰到一个重复字符后,L向右移动,直至碰到R位置的字符。
问题F:
数组中子数组的最大异或和:
trie树+前缀和+贪心,时间O(N)
首先,异或和的规律为,sumA 为 {1,2,3} 异或和 , sumB 为 {1,2,3,4,5} 异或和 ,则sumB^sumA 为{4,5}的异或和。
将遍历数据之前的所有从0开始的累加和,转为二进制,生成trie树。
每遍历一个数据,在trie树中找可以生成最大异或和的配对数字,则当前位置减配对数字位置,即为子数组的左右坐标。
找配对的规则采用贪心,若当前为1001,则依次找0110。
问题G:
最长可整合子数组长度:
整合数组定义为,排序后,相邻数的差的绝对值为1。
暴力,时间O(N*N)
核心思想,子数组若所有数字不同,且max-min = 子数组长度,则子数组是整合数组。
枚举[L,R]区间,map记录重复数字,maxnum,minnum记录最大最小。
L更新时,map清空。