算法:算法 - 最长摆动子序列
数字序列被称为蠕动序列如果差异 连续数字正和负 之间严格交替之间。第一个差异(如果存在的话)可能是正数 或负数。具有少于两个元素的序列一般是摆动序列。
例如,[1,7,4,9,2,5]是一个摆动序列,因为 差异(6,-3,5,-7,3)交替为正数和负数。相比之下,[1,4,7,2,5]和[1,7,4,5,5]不是摆动序列, 首先是因为它的前两个差异是正的,而第二个是因为其最后的差异是零。
给定一个整数序列,返回最长的 子序列的长度,这是一个摆动序列。通过 删除 原始序列中的一些元素(最终也为零),从而使其余元素保持其原始 的顺序,从而获得子序列。
实例:
Input: [1,7,4,9,2,5]
Output: 6
The entire sequence is a wiggle sequence.
Input: [1,17,5,10,13,15,10,5,16,8]
Output: 7
There are several subsequences that achieve this length. One is [1,17,10,13,10,16,8].
Input: [1,2,3,4,5,6,7,8,9]
Output: 2
我的溶液:
def wiggle_max_length(nums)
[ build_seq(nums, 0, 0, true, -1.0/0.0),
build_seq(nums, 0, 0, false, 1.0/0.0)
].max
end
def build_seq(nums, index, len, wiggle_up, prev)
return len if index >= nums.length
if wiggle_up && nums[index] - prev > 0 || !wiggle_up && nums[index] - prev < 0
build_seq(nums, index + 1, len + 1, !wiggle_up, nums[index])
else
build_seq(nums, index + 1, len, wiggle_up, prev)
end
end
这是工作于较小的输入(例如[1,1,1,3,2,4,1,6, 3,10,8]和所有样本输入,但其失败的非常大的输入(这是很难调试),如:
[33,53,12,64,50,41,45 ,21,97,35,47,92,39,0,93,55,40,46,69,42,6,95,51,68,72,9,32,84,34,64,6,2 ,26,98,3,43,30,60,3,68,82,9,97,19,27,98,99,4,30,96,37,9,78,43,64,4,65 ,30,84,90,87,64,18,50,60,1,40,32,48,50,76,100,57,29,63,53,46,57,93,98,42,80,82 ,9,41,55,69,84,82,79,30,79,18,97,67,23,52,38,74,15]
其中应该有输出:67但我soln输出57.有人知道这里有什么问题吗?
什么是预期的时间复杂度? – marvel308
不确定,但不是我关心的atm - 现在我正在寻找准确性 – Sunny
仅供参考:https://en.wikipedia.org/wiki/Longest_alternating_subsequence – Stefan