Найти 2 нечетных минимальных элемента в массиве
Помогите решить проблему
void findMin(int* arr, int size) {
int min1, min2;
min1 = 0;
for (int i = 0; i < size; i++) {
if (arr[i] % 2 == 1) {
if (arr[min1] > arr[i]) {
min1 = i;
}
}
else
continue;
printf("%d\n", min1);
}
min2 = 0;
for (int i = 0; i < size; i++) {
if (arr[i] % 2 == 1) {
if (arr[i] < arr[min2] && arr[i] != arr[min1]) {// второй минимальный элемент
min2 = i;
}
}
else
continue;
printf("%d--\n", min2);
}
/*sorting(arr, size, min1, min2);*/
}
Ответы (2 шт):
Автор решения: Harry
→ Ссылка
Можно, конечно, и в один проход, но раз вы решили в два - то это можно сделать, например, так:
int getOddMin(int* a, int size, int exclude)
{
int idx = -1, m;
for(int i = 0; i < size; ++i)
{
if (a[i]%2==0 || i == exclude) continue;
if (idx == -1 || a[i] < m)
{
m = a[i];
idx = i;
}
};
return idx;
}
void findMin(int* a, int size, int* idx1, int * idx2)
{
*idx2 = -1;
*idx1 = getOddMin(a,size,-1);
if (*idx1 == -1) return;
*idx2 = getOddMin(a,size,*idx1);
}
Если нечетных нет вовсе — оба индекса будут равны -1, если только одно - то отрицательным будет только один индекс.
Автор решения: Nowhere Man
→ Ссылка
Вариант с одним проходом по массиву:
void findMin(int* arr, int size) {
int min1 = -1, min2 = -1;
for (int i = 0; i < size; i++) {
if (arr[i] % 2 == 0) continue;
if (min1 == -1 || arr[i] < arr[min1]) {
min2 = min1;
min1 = i;
} else if (min2 == -1 || arr[i] < arr[min2]) {
min2 = i;
}
}
if (min1 > -1) {
printf("Odd min1 at %d = %d\n", min1, arr[min1]);
if (min2 > -1) {
printf("Odd min2 at %d = %d\n", min2, arr[min2]);
} else {
printf("min2 not found\n");
}
} else {
printf("No odd min is found\n");
}
}