博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法:数组最长问题
阅读量:4060 次
发布时间:2019-05-25

本文共 1060 字,大约阅读时间需要 3 分钟。

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


转载地址:http://bbwji.baihongyu.com/

你可能感兴趣的文章
Jenkins 启动命令
查看>>
Maven项目版本继承 – 我必须指定父版本?
查看>>
通过C++反射实现C++与任意脚本(lua、js等)的交互(二)
查看>>
利用清华镜像站解决pip超时问题
查看>>
微信小程序开发全线记录
查看>>
CCF 分蛋糕
查看>>
解决python2.7中UnicodeEncodeError
查看>>
小谈python 输出
查看>>
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
查看>>
python:如何将excel文件转化成CSV格式
查看>>
机器学习实战之决策树(一)
查看>>
机器学习实战之决策树二
查看>>
[LeetCode By Python]7 Reverse Integer
查看>>
[LeetCode By Python]121. Best Time to Buy and Sell Stock
查看>>
Android/Linux 内存监视
查看>>
Android2.1消息应用(Messaging)源码学习笔记
查看>>
Variable property attributes or Modifiers in iOS
查看>>
NSNotificationCenter 用法总结
查看>>
C primer plus 基础总结(一)
查看>>
剑指offer算法题分析与整理(三)
查看>>