[Leetcode Learning-c ++&java]算術スライス

問題:

難易度:中

説明:

算術配列、配列を入力し、長さが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;
    }
};

 

おすすめ

転載: blog.csdn.net/qq_28033719/article/details/113849984