给定一个未排序数组, 找出其中最长的等差数列
2013-09-11 09:29
295 查看
转载请注明来自souldak,微博:@evagle
题目如题所诉:其实就是前面那篇leetcode 最长连续序列 longest consecutive sequence
的升级版
leetcode上的题目是要求等差为1,即连续序列,而现在把等差为1的限制条件去掉,找最长的等差数列,做法和复杂度却升级了。
现在给出一个O(n^2)的算法:
算法思路:
先排序,O(NlogN)
从后往前,对于a[i],令 j=i+1~n-1
map[pair(a[i],a[j]-a[i])] = max(map[pair(a[j]-,a[j]-[a[i])] , 1) + 1
其中pair(a,b)表示以a为首项,b为等差的等差数列的最长的长度
从a[n-1]一直算到a[0],所有的pair(a[k],b)都算出来了,现在只要找出其中最大的即可。
按着这个思路,代码实现也比较简单,就不上代码了。
题目如题所诉:其实就是前面那篇leetcode 最长连续序列 longest consecutive sequence
的升级版
leetcode上的题目是要求等差为1,即连续序列,而现在把等差为1的限制条件去掉,找最长的等差数列,做法和复杂度却升级了。
现在给出一个O(n^2)的算法:
算法思路:
先排序,O(NlogN)
从后往前,对于a[i],令 j=i+1~n-1
map[pair(a[i],a[j]-a[i])] = max(map[pair(a[j]-,a[j]-[a[i])] , 1) + 1
其中pair(a,b)表示以a为首项,b为等差的等差数列的最长的长度
从a[n-1]一直算到a[0],所有的pair(a[k],b)都算出来了,现在只要找出其中最大的即可。
按着这个思路,代码实现也比较简单,就不上代码了。
相关文章推荐
- 【Java】有个排序后的字符串数组,其中散布着一些空字符串,编写一个方法,找出给定字符串的位置
- 11.5 排序后的字符串数组,其中散布着空字符串,编写一个方法,找出给定字符串的位置。
- 程序员面试金典: 9.11 排序与查找 11.5有个排序后的字符串数组,其中散布这一些空字符串,编写一个方法,找出给定字符串的位置
- 02_对N个长度最长可达到1000的数进行排序、对给定的一个字符串,找出有重复的字符,并给出其位置、输入一系列整数,将其中最大的数挑出,并将剩下的数进行排序
- 整型数组处理算法(十)给定数组a[n],其中有超过一半的数为一个定值,找出这个数。[2014人人网笔试题]
- 给定一个数组,其中只有一个数出现一次,别的数都出现3次,找出这个数
- 9.11排序与查找(三)——给定一个排序后的数组,包括n个整数,但这个数组已被旋转过多次,找出数组中的某个元素
- Java算法给定一个整数数组,找出其中两个数相加等于目标值
- 9.11排序与查找(五)——有个排序后的字符串数组,其中散布着一些空字符串,找出给定字符串的位置
- 给定一个无序整形数组,找出其中所以三个数之和为0的所有组合
- 给定一个排序后的数组,包含n个整数,但这个数组已被旋转过多次,找出数组中的某个元素
- 给定一组单词,编写一个程序,找出其中的最长单词,且该单词由这组单词中的其他单词组合而成。
- 给定一个未排序的整数数组,找到其中位数。 中位数是排序后数组的中间值,
- 有个排序后的字符串数组,其中散布着一些空字符串,找出给定字符串的位置
- 给有n个数的数组a,其中超过一半的数为一个定值,在不排序,不开额外数组情况下,以最高效的方法找出这个数。
- 面试题:给定一个数组,数组中只包含0和1。请找到一个最长的子序列,其中0和1的数量是相同的
- 给定一个长度为N的数组,找出一个最长的单调自增子序列
- 9.11排序与查找(三)——给定一个排序后的数组,包含n个整数,但这个数组已被旋转过多次,找出数组中的某个元素
- 程序员面试金典——解题总结: 9.18高难度题 18.7给定一组单词,编写一个程序,找出其中的最长单词,且该单词由这组单词中的其他单词组合而成。
- 给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱). 第二解