Получение индексов максимального числа в массиве
у меня есть массив, содержащий числа, ряды.
что-то вроде этого :
0 4 2 0 1 0 4 2 0 4 0 2
здесь 0
соответствует низшему рангу и max
номер соответствует самому высокому рангу. Может быть несколько индексов, содержащих наивысший ранг.
Я хочу найти индекс всех этих самых высоких рангов в массиве. Я достиг со следующим кодом:
import java.util.*;
class Index{
public static void main(String[] args){
int[] data = {0,4,2,0,1,0,4,2,0,4,0,2};
int max = Arrays.stream(data).max().getAsInt();
ArrayList<Integer> indexes = new ArrayList<Integer>();
for(int i=0;i<12;i++){
if(data[i]==max){
indexes.add(i);
}
}
for(int j=0;j<indexes.size();j++){
System.out.print(indexes.get(j)+" ");
}
System.out.println();
}
}
я получил результат как:1 6 9
есть ли лучший способ, чем этот ?
потому что в моем случае может быть массив, содержащий миллионы элементов, из-за которых у меня есть некоторые проблемы с производительностью.
и
любое предложение приветствуется.
3 ответов
одним из подходов было бы просто сделать один проход вдоль массива и отслеживать все индексы самого высокого числа. Если текущая запись меньше, чем наибольшее число, виденное до сих пор, то no-op. Если текущая запись совпадает с наибольшим числом, то добавьте этот индекс. В противном случае, мы увидели новое наибольшее число, и мы должны выбросить наш старый список самых высоких чисел и начать новый.
int[] data = {0,4,2,0,1,0,4,2,0,4,0,2};
int max = Integer.MIN_VALUE;
List<Integer> vals = new ArrayList<>();
for (int i=0; i < data.length; ++i) {
if (data[i] == max) {
vals.add(i);
}
else if (data[i] > max) {
vals.clear();
vals.add(i);
max = data[i];
}
}
вы находитесь на пути потока... Я бы посоветовал вам остаться там:)
int[] data = { 0, 4, 2, 0, -1, 0, 4, 2, 0, 4, 0, 2 };
int max = Arrays.stream(data).max().getAsInt();
int[] indices = IntStream.range(0, data.length).filter(i -> data[i] == max).toArray();
Как я вижу, ваша программа идет через массив 2 раза.Вы можете попробовать это: Запустите массив, найдя максимум этого массива.Когда вы найдете max, просто сохраните каждый другой элемент, который равен текущему max и их значениям.Таким образом, вы проходите через массив только один раз. Вот пример: Предположим, у вас есть следующий массив {1,3,5,3,4,5}, и вы проходите через него.Сначала вы сохраните 1 как max, затем 3, затем 5, который является максимальным для этого массива.После сохранения 5 вы не сохраните 3 или 4 но вы сохраните 5, поскольку он равен максимальному.Надеюсь, я помогла.