web-dev-qa-db-ja.com

等しい要素を持つ数値の指定された配列からサブ配列の総数を見つける。より良いアプローチ

数値の配列を指定して、すべての要素が等しいサブ配列(連続する要素)の総数を数えます。

例:以下の配列の場合

[1,1,3]

回答:4

以下は望ましいサブアレイです:

[1]、[1]、[3]、[1,1]

だから私は最初にJavaプログラムの効率が悪いプログラムを書きました:

import Java.util.*;


public class EqualSubarrays {

    public static void main(String[] args) {

        int count = 0;

        Integer[] arr = {1,1,3};
        List<Integer> list = new ArrayList<Integer>(Arrays.asList(arr));
        for(int i=1; i<=arr.length; i++) {
            for(int j=0; j<=arr.length-i; j++) {
                if(areAllElementsEqual(list.subList(j, j+i)))
                    count++;
            }
        }

        System.out.println(count);
    }

    static boolean areAllElementsEqual(List<Integer> list) {
        if (list.size()==1)
            return true;
        if (Collections.frequency(list, list.get(0))==list.size())
            return true;
        else
            return false;
    }

}

そして、私はそれをもっと簡単に考えて、Python(ただし、任意の言語で書くことができます)でプログラムを書きました)。

def count_equal_subarrays(nums):
    n = len(nums)
    total = 0
    i = 0
    while i < n:
        count = 1
        while i+1 < n and nums[i] == nums[i+1]:
            i += 1
            count += 1
        i += 1
        total += count * (count + 1) / 2

    return int(total)

num_arr = [1, 1, 1, 1]
print(count_equal_subarrays(num_arr))

より効率的な方法や興味深いアプローチがあるかどうか知りたいと思いました。ご存知の場合は、複雑な場合もご説明ください。

2
xploreraj

まず、質問の言い方がおかしいです。最小値と最大値は同じです。これは明らかに、サブアレイのすべての要素が同じであることを意味します。

同じすべての要素の配列を取得したら、これが長さnの場合、n(n + 1)/ 2個のサブ配列を持つことができます。

たとえば、[1,1,1]は[1]、[1]、[1]、[1,1]、[1,1]、[1,1,1]および3(3 + 1)/ = 6

したがって、すべてのアルゴリズムは、前の要素が何であったか、およびその要素の行に何個あったかをメモリに保持して配列を処理するだけです。同じ場合は、金額を上げて続行します。それが異なると、n(n + 1)/ 2式に入れて合計に追加した量になります。

その後、すべてをO(n)で実行できます。二重ループは必要ありません。

2
user2802557

私はアルゴリズムを書いています、あなたはあなたが望むどんな言語でも実装できます

アルゴリズム:配列A = {1,3,1} 1.まず最初に配列をソートします。つまり、配列A = {1,1,3} 2.配列の一意の各要素のカウント辞書/配列を作成します

Count{ 
Element   count
 1          2
 3          1

}

  1. 次に、式(n *(n + 1))/ 2をCount [element]の各値に適用し、すべての値を追加します。これは、Count [1]の答えが2であるため、(2 *(2 + 1))/ 2 = 3 For Count [3] countは1なので、(1 *(1 + 1))/ 2 = 1それらをすべて追加します3 + 1 = 4疑わしい場合は返信します
    • 配列を使用している場合は、配列の最大要素を見つけて、そのサイズのカウント配列を作成します
0
Kousei