A sequence of number is called arithmetic if it consists of at least three elements and if the difference between any two consecutive elements is the same. For example, these are arithmetic sequence: 1, 3, 5, 7, 9 7, 7, 7, 7 3, -1, -5, -9 The following sequence is not arithmetic. 1, 1, 2, 5, 7 A zero-indexed array A consisting of N numbers is given. A slice of that array is any pair of integers (P, Q) such that 0 <= P < Q < N. A slice (P, Q) of array A is called arithmetic if the sequence: A[P], A[p + 1], ..., A[Q - 1], A[Q] is arithmetic. In particular, this means that P + 1 < Q. The function should return the number of arithmetic slices in the array A. Example: A = [1, 2, 3, 4] return: 3, for 3 arithmetic slices in A: [1, 2, 3], [2, 3, 4] and [1, 2, 3, 4] itself.
將包含大於等於三個元素且任意相鄰兩個元素之間的差相等的數組成爲等差數列。如今輸入一個隨機數組,問該數組中一共能夠找出多少組等差數列。java
假設已經知道以第i-1個數字爲結尾有k個等差數列,且第i個元素與i-1號元素和i-2號元素構成了等差數列,則第i個數字爲結尾的等差數列個數爲k+1。所以咱們能夠自底向上動態規劃,記錄每一位做爲結尾的等差數列的個數,並最終得出整個數列中等差數列的個數。代碼以下:數組
public int numberOfArithmeticSlices(int[] A) { int[] dp = new int[A.length]; int count = 0; for(int i = 2 ; i<A.length ; i++) { if(A[i] - A[i-1] == A[i-1] - A[i-2]) { dp[i] = dp[i-1] + 1; count += dp[i]; } } return count; }
首先看一個簡單的等差數列1 2 3
, 可知該數列中一共有1個等差數列
再看1 2 3 4
, 可知該數列中一共有3個等差數列,其中以3爲結尾的1個,以4爲結尾的2個
再看1 2 3 4 5
, 可知該數列中一共有6個等差數列,其中以3爲結尾的1個,4爲結尾的2個,5爲結尾的3個。this
綜上,咱們能夠得出,若是是一個最大長度爲n的等差數列,則該等差數列中一共包含的等差數列個數爲(n-2+1)*(n-2)/2
,即(n-1)*(n-2)/2
。code
所以,咱們只須要找到以當前起點爲開始的最長的等差數列,計算該等差數列的長度並根據其長度得出其共包含多少個子等差數列。three
代碼以下:element
public int numberOfArithmeticSlices2(int[] A) { if(A.length <3) return 0; int diff = A[1]-A[0]; int left = 0; int right = 2; int count = 0; while(right < A.length) { if(A[right] - A[right-1] != diff) { count += (right-left-1) * (right-left-2) / 2; diff = A[right] - A[right-1]; left = right-1; } right++; } count += (right-left-1) * (right-left-2) / 2; return count; }