LeetCode问题的递归实现

时间:2019-08-15 06:04:24

标签: python recursion dynamic-programming

问题名称: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])  

我的问题:代码返回的答案小于原始答案。请帮忙。

2 个答案:

答案 0 :(得分:0)

考虑以下数组:

1, 3, 5, 7

您对1, 3, 53, 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]))