問題:
難易度:中
説明:
算術配列、配列を入力し、長さが3以上のすべての非反復算術部分文字列(連続部分列)を検索するように要求します。
件名リンク:https://leetcode.com/problems/arithmetic-slices/
ケースを入力してください:
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.
私のコード:
兄貴がたくさんいることを理解するのに一週間かかりました。
連続区間の解はスライディングウィンドウである必要があり、内部と外部の2つのトラバーサル処理が実行され、内部のループがwhileになります。
次に、長さが3以上の部分文字列を見つけるため、算術連続シーケンスでは、長さ(サイズ)が3以上であり、部分文字列は繰り返されません。
長さ3:サイズ-2
長さ4:サイズ-3
.........。
長さi:サイズ-i + 1、これはΣNに相当し、算術配列を追加するための数式です。連続したシーケンスで取得できるのは(i-1)*(i-2)>> 1のみです。部分文字列の数(3回以上繰り返さない)
Java:
class Solution {
public int numberOfArithmeticSlices(int[] A) {
if(A.length < 3) return 0;
int len = A.length, count = 0, temp = 2, dis = A[1] - A[0];
boolean flag;
for(int i = 2;i < len;) {
flag = true;
while(i < len && A[i] - A[i - 1] == dis) {
i ++; temp ++; flag = false;
}
if(!flag) count += (temp - 1) * (temp - 2) >> 1;
if(i < len) {
dis = A[i] - A[i - 1]; temp = 2;
}
i ++;
}
return count;
}
}
C ++:
class Solution {
public:
int numberOfArithmeticSlices(vector<int>& A) {
if(A.size() < 3) return 0;
int len = A.size(), count = 0, size = 2, dis = A[1] - A[0], flag;
for(int i = 2; i < len;) { // 从2开始
flag = 0;
while(i < len && A[i] - A[i - 1] == dis) {
size ++; i ++; flag = 1;
}
if(flag) count += (size - 1) * (size - 2) >> 1;
if(i < len) {
dis = A[i] - A[i - 1]; size = 2; // 重置数据
}
i ++; // 必须要再加,否则下一次进来会经历同一个 i
}
return count;
}
};