Leetcode 413. Arithmetic Slice 算術序列切片(動態規劃,暴力)
阿新 • • 發佈:2018-11-07
tco 都是 java 測試 vector put sta int 題目
Leetcode 413. Arithmetic Slice 算術序列切片(動態規劃,暴力)
題目描述
如果一個數組1.至少三個元素2.兩兩之間差值相同,那麽這個數組就是算術序列
比如下面的數組都是算術序列:
1, 3, 5, 7, 9
7, 7, 7, 7
3, -1, -5, -9
但是這一個就不是:
1, 1, 2, 5, 7
求給定數組,能有多少個算術序列
測試樣例
Input: [1, 2, 3, 4]
Output: 3
有三個算術序列切片:
[1,2,3], [2,3,4], [1,2,3,4]
註意,切片是不能跳著選的...
詳細分析
暴力:
從長度3開始直到數組那麽長,每次暴力求[k,k+len]是否是算術序列(是否兩兩差值相同)即可。- 動態規劃:
對於[1,2,3,4,3,5,6],我們從3開始:
- [1,2,3]是一個算術序列,dp[2]=1
- 然後繼續[2,3,4],是算術序列則dp[3]=dp[2]+1;
- 繼續[3,4,3]不是算術序列,dp[4]=0
- 繼續[4,3,5] dp[5]=0
- [3,5,6] dp[6]= 0
算法實現
- 方法1:暴力
class Solution { public: int numberOfArithmeticSlices(vector<int>& A) { if(A.size()<3){ return 0; } int totalSolution = 0; for(int dist=3;dist<=A.size();dist++){ for(int k=0;k+dist<=A.size();k++){ // Arithmetic sequence checking for current [k,k+distance] (sub)sequence bool isArithmeticSeq = true; int diff = A[k+1] - A[k]; for(int p=k+2;p<k+dist;p++){ if((A[p]-A[p-1])!=diff){ isArithmeticSeq = false; break; } } if(isArithmeticSeq) totalSolution++; } } return totalSolution; } };
- 方法2:DP
class Solution { public int numberOfArithmeticSlices(int[] A) { int[] dp = new int[A.length]; int sum = 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; sum +=dp[i]; }else{ dp[i]=0; } } return sum; } }
Leetcode 413. Arithmetic Slice 算術序列切片(動態規劃,暴力)