给定一个大小为N的整数数组A。求A的奇偶最长子序列
在下列情况下,子序列称为奇偶:
子序列的第一个元素是奇数,第二个元素是偶数,第三个元素是奇数,依此类推。例如:[5,10,5,2,1,4],[1,2,3,4,5]
子序列的第一个元素是偶数,第二个元素是奇数,第三个元素是偶数,依此类推。例如:[10,5,2,1,4,7],[10,1,2,3,4]
返回奇偶子序列的最大可能长度
注意:如果可以通过删除几个(可能是零个或全部)元素从a中获得B,则数组B是数组a的子序列
代码如下
def solve(A):
n = len(A)
sln =[]
for i in range(n):
for j in range(i):
if A[i]%2 == 0:
if A[j]%2==1 and A[j] < A[i]:
sln[i] = max(sln[i],sln[j]+1 )
else:
if A[j]%2==1 and A[j] < A[i]:
max(sln[i],sln[j]+1 )
return sln
A = [1, 2, 2, 5, 6]
solve(A)
我得到了索引错误----> sln[i] = max(sln[i],sln[j]+1 )
为什么索引错误会出现j
每次都比我小
您正在为尚未有值的列表的索引赋值:
您可以在找到新的匹配项时附加到解决方案
不过,这里有一个更简单的解决方案:
第一位确保传递空列表时没有错误。解决方案始终包含第一个元素。如果mod 2的值与解决方案中到目前为止的最后一个元素不同,则将包括所有其他元素
基于同样的想法,一个更简单的解决方案(事实上是一行代码)是这样的,但它有点难读,所以如果简洁本身就是一个目标,那就更好了:
我没有测量时间,但我希望
solve_short()
的运行速度也比solve()
快——如果考虑到这一点的话请注意,简短的解决方案利用了这样一个事实,即在原始列表中包含任何与其前一个不具有相同奇偶校验的数字,就可以获得正确的解决方案,即使这没有较长解决方案中的逻辑那么明确
我很好奇,运行了一个测试-长的解决方案实际上比短的解决方案性能更好,但这里有一个在大多数情况下性能更好:
还有两种方法和基准:
a = random.choices(range(100), k=10**6)
的基准时间:基准代码(Try it online!):
相关问题 更多 >
编程相关推荐