413. Arithmetic Slices.md 1.4 KB
Newer Older
K
KEQI HUANG 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
### 413. Arithmetic Slices



题目: 
<https://leetcode.com/problems/arithmetic-slices/>



难度 : Medium



思路:

tag 是DP

数从 i 到 j 之间的这个arithmetic 数

我的方法时间复杂度比较高O(N^2),从 i 开始数它的arithmetic slice,每个i数一遍,到 j

AC代码

```
class Solution(object):
    def numberOfArithmeticSlices(self, A):
        """
        :type A: List[int]
        :rtype: int
        """
        n = len(A)
        if n < 3:
        	return 0
        else:
        	res = 0
        	for i in range(n-2):
        		for j in range(i+2,n):
        			if A[j] - A[j-1] == A[i+1] - A[i]:
        				res += 1
        			else:
        				break
        	return res
```



应该可以优化到O(N)

不需要每个每个开始数,可以边数边移动

可以参考<http://www.cnblogs.com/grandyang/p/5968340.html>



O(N) 代码

```
class Solution(object):
    def numberOfArithmeticSlices(self, A):
        """
        :type A: List[int]
        :rtype: int
        """
        n = len(A)
        if n < 3:
        	return 0
        else:
        	res, cnt = 0, 2
        	for i in range(2, n):
        		if A[i] - A[i-1] == A[i-1] - A[i-2]:
        			print i, i-1, i-2
        			cnt += 1
        		else:
        			if cnt > 2:
        				res += (cnt-1) * (cnt-2)  / 2
        			cnt = 2
        	if cnt > 2: res += (cnt-1) * (cnt-2)  / 2
        	return res


```