问题名称:413。算术切片
问题陈述:
如果一个数字序列至少由三个元素组成,并且任何两个连续元素之间的差相同,则称为算术序列。
例如,这些是算术序列:
1、3、5、7、9
7、7、7、7
3,-1,-5,-9
以下序列不是算术运算。
1、1、2、5、7
给出了一个由N个数字组成的零索引数组A。该数组的一个切片是任意一对整数(P,Q),使得0 <= P 如果序列A的数组A的切片(P,Q)被称为算术:
A [P],A [p +1],...,A [Q-1],A [Q]是算术运算。特别是,这意味着P +1 该函数应返回数组A中算术切片的数量。 LINK :https://leetcode.com/problems/arithmetic-slices/ 我正在尝试找出上述问题的递归算法。我正在尝试实现一种算法,该算法基本上占用数组的一部分,然后递归地解决该问题,直到数组大小达到length ==3。在length == 3时,我们检查数组是否为有数学运算符,并基于该值返回1或0 。
我的问题:代码返回的答案小于原始答案。请帮忙。
我的解决方案:def isArithmatic(array):
if (array[1] - array[0]) == (array[2] - array[1]):
return True
return False
def arithmaticSlices(array):
if len(array) == 3:
if isArithmatic(array):
return 1
return 0
else:
return arithmaticSlices(array[1:]) + arithmaticSlices(array[:len(array)-1])
答案 0 :(得分:0)
考虑以下数组:
1, 3, 5, 7
您对1, 3, 5
和3, 5, 7
进行计数。但是,它无法计算1, 3, 5, 7
(这是长度为4的算术切片)。
答案 1 :(得分:0)
这里是LeetCode接受的一个答案。我希望简单的逻辑有意义:
JavaScript代码:
function f(A, i=2, total=0, prevSeqTotal=0){
if (i >= A.length)
return total
// The number of sequences ending here is 1 (length 3)
// plus the number ending at the previous
// element since those all just got extended.
if (A[i] - A[i-1] == A[i-1] - A[i-2])
return f(A, i + 1, total + 1 + prevSeqTotal, 1 + prevSeqTotal)
return f(A, i + 1, total, 0)
}
console.log(f([3, 1, -1, -3]))