Получение индексов максимального числа в массиве

у меня есть массив, содержащий числа, ряды.

что-то вроде этого :

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, поскольку он равен максимальному.Надеюсь, я помогла.