Dato un array di numeri, conta il numero totale di sottoarray (elementi consecutivi) in cui tutti gli elementi sono uguali.
Esempio: per sotto l'array
[1,1,3]
Ans: 4
Di seguito sono riportati i sottoarray desiderati:
[1], [1], [3], [1,1]
Quindi ho scritto per la prima volta un programma Java la cui efficienza è negativa:
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;
}
}
E poi, ci ho pensato con più semplicità e ho scritto un programma in Python (comunque può essere scritto in qualsiasi lingua). Eccolo:
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))
Volevo sapere se esiste un metodo più efficiente o un approccio interessante. Se lo sai, per favore spiega pure se è complicato.