数値の配列を指定して、すべての要素が等しいサブ配列(連続する要素)の総数を数えます。
例:以下の配列の場合
[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))
より効率的な方法や興味深いアプローチがあるかどうか知りたいと思いました。ご存知の場合は、複雑な場合もご説明ください。
まず、質問の言い方がおかしいです。最小値と最大値は同じです。これは明らかに、サブアレイのすべての要素が同じであることを意味します。
同じすべての要素の配列を取得したら、これが長さ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)で実行できます。二重ループは必要ありません。
私はアルゴリズムを書いています、あなたはあなたが望むどんな言語でも実装できます
アルゴリズム:配列A = {1,3,1} 1.まず最初に配列をソートします。つまり、配列A = {1,1,3} 2.配列の一意の各要素のカウント辞書/配列を作成します
Count{
Element count
1 2
3 1
}