Вывести все индексы минимальных элементов. Java
Есть массив mas = -1, 22, 33, 44, 567, 567, 44, 33, 22, -1.
Необходимо вывести индексы минимальных элементов в убывающем порядке.
В моем случае это 9 0.
Смог найти только один минимальный индекс.
static void step3(int[] mas) {
int indexOfMin = 0;
for (int i = 1; i < mas.length; i++) {
if (mas[i] < mas[indexOfMin]) {
indexOfMin = i;
}
}
System.out.println("Индекс минимального элемента: " + indexOfMin);
}
Ответы (2 шт):
На первом проходе определяется последний индекс минимального элемента, используя нестрогое сравнение <= с текущим минимумом, а потом на обратном проходе выводятся индексы минимумов.
Также имеет смысл обозначить начальное значение индекса минимума -1 для случая пустого массива.
static void printMinIndexes(int ... mas) {
int indexOfMin = -1;
for (int i = 0; i < mas.length; i++) {
if (indexOfMin < 0 || mas[i] <= mas[indexOfMin]) {
indexOfMin = i;
}
}
System.out.print("Min indexes: ");
if (indexOfMin == -1) {
System.out.print("not found");
} else for (int i = indexOfMin; i >= 0; i--) {
if (mas[i] == mas[indexOfMin]) {
System.out.print(i + " ");
}
}
System.out.println();
}
Тесты:
printMinIndexes(); // Min indexes: not found
printMinIndexes(-1, 22, 33, 44, 567, 567, 44, 33, 22, -1); // Min indexes: 9 0
Также можно отслеживать первый индекс минимума, чтобы использовать его при выводе минимумов как ограничитель (если первый минимум находится не в самом начале входного массива):
static void printMinIndexes(int ... mas) {
int firstMin = -1;
int lastMin = -1;
for (int i = 0; i < mas.length; i++) {
if (firstMin < 0 || mas[i] < mas[firstMin]) {
firstMin = lastMin = i;
} else if (mas[i] == mas[lastMin]) {
lastMin = i;
}
}
System.out.print("Min indexes ");
if (firstMin == -1) {
System.out.print("not found");
} else {
System.out.print("between " + firstMin + " and " + lastMin + ": ");
for (int i = lastMin; i >= firstMin; i--) {
if (mas[i] == mas[firstMin]) {
System.out.print(i + " ");
}
}
}
System.out.println();
}
Тесты:
printMinIndexes();
printMinIndexes(3, 2);
printMinIndexes( 22, 33, 44, 2, 567, 2, 567, 2, 44, 33, 22);
printMinIndexes( -1, 22, 33, 44, 567, 567, 44, 33, 22, -1);
Результаты:
Min indexes not found
Min indexes between 1 and 1: 1
Min indexes between 3 and 7: 7 5 3
Min indexes between 0 and 9: 9 0
static void step3(int[] arr) {
int indexOfMin = 0;
for (int i = 1; i < arr.length; i++) {
// немного поменял алгоритм поиска минимального элемента,
//но я думаю разберётесь
if (arr[indexOfMin] > arr[i]) {
indexOfMin = i;
}
}
//создаём строку, можно изменить на стрингБилдер
String moreElements = "";
// сравниваем наш минимальный элемент со следующим элементом массива,
// и при совпадении конкатенируем индекс со строкой
for (int i = indexOfMin; i < arr.length; i++) {
if (arr[indexOfMin] == arr[i]) {
moreElements += " " + i;
}
}
System.out.println("Индекс минимального элемента: " + moreElements);
}