算法:数组最长问题

问题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清空。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值