C++中的算術切片 II - 子序列
假設我們有一個數組 A,其中包含 N 個數字。該陣列的子序列切片是任何整數序列,例如 (K0, K1, K2, … Kn),其中 0 <= K0 < K1 < K2 < … < Kn < N。如果序列 A[K0]、A[K1]、… A[Kn] 是算術序列,則 A 的子序列切片 (K0, K1, K2, … Kn) 稱為算術切片,這意味著 n >= 2。因此,我們必須返回算術切片的數量。
因此,如果輸入類似於 [2,4,6,8,10],則答案將是 7,因為有 7 個算術切片:[2,4,6],[2,4,10],[4,6,8],[6,8,10],[2,4,6,8],[4,6,8,10],[2,4,6,8,10]。
為了解決這個問題,我們將遵循以下步驟:
- ret := 0
- 定義一個對映 dp 和另一個對映 cnt
- 透過從 A 中獲取元素來定義一個集合 s
- n := A 的大小
- 對於初始化 i := 1,當 i < n 時,更新(i 增加 1),執行:
- 對於初始化 j := i - 1,當 j >= 0 時,更新(j 減少 1),執行:
- diff := A[i] - A[j]
- 如果 diff <= -inf 或 diff > inf,則:
- 忽略以下部分,跳到下一個迭代
- 如果 diff 在對映 dp[j] 中,則 temp := dp[j, diff],否則為 0
- ret := ret + temp
- 如果 (A[i] + diff) 存在於 s 中,則:
- dp[i, diff] := dp[i, diff] + temp + 1
- 對於初始化 j := i - 1,當 j >= 0 時,更新(j 減少 1),執行:
- 返回 ret
讓我們看看下面的實現以更好地理解:
示例
#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
class Solution {
public:
int numberOfArithmeticSlices(vector<int>& A) {
int ret = 0;
unordered_map <lli, unordered_map <lli, lli> > dp, cnt;
unordered_set <int> s (A.begin(), A.end());
int n = A.size();
for(int i = 1; i < n; i++){
for(int j = i - 1; j >= 0; j--){
lli diff = (lli)A[i] - (lli)A[j];
if(diff <= INT_MIN || diff > INT_MAX) continue;
int temp = dp[j].count(diff) ? dp[j][diff] : 0;
ret += temp;
if(s.count(A[i] + diff))dp[i][diff] += temp + 1;
}
}
return ret;
}
};
main(){
Solution ob;
vector<int> v = {2,4,6,8,10};
cout << (ob.numberOfArithmeticSlices(v));
}輸入
{2,4,6,8,10}輸出
7
廣告
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP