So … I have : int array[] = {-8,2,0,5,-3,6,0,9};
I want to find the smallest positive number ( which in the list above is 2 )
This is what i am doing :
int array[] = {-8,2,0,5,-3,6,0,9};
int smallest=0;
for(int i=0;i<array.length;i++) // Find the first number in array>0 (as initial
// value for int smallest)
{
if(array[i]>0)
{
smallest=array[i];
break;// Break out of loop, when you find the first number >0
}
}
for(int i=0;i<array.length;i++) // Loop to find the smallest number in array[]
{
if(smallest>array[i]&&array[i]>0)
{
smallest=array[i];
}
}
System.out.println(smallest);
}
My question is :
Can we reduce the number of steps ?
Is there any smarter/shorter way of doing it, with no other data structure.
Thanks.
Artem_Santos 0 / 0 / 0 Регистрация: 26.12.2017 Сообщений: 6 |
||||
1 |
||||
Найти минимум положительных элементов массива26.12.2017, 19:11. Показов 3674. Ответов 14 Метки нет (Все метки)
Условие:
0 |
afront 1493 / 1208 / 821 Регистрация: 29.02.2016 Сообщений: 3,597 |
||||
26.12.2017, 19:58 |
2 |
|||
перепишите 13 строчку
0 |
16 / 16 / 11 Регистрация: 28.10.2016 Сообщений: 75 |
|
26.12.2017, 20:26 |
3 |
Можно конкретнее, что работает неправильно?
0 |
0 / 0 / 0 Регистрация: 26.12.2017 Сообщений: 6 |
|
26.12.2017, 20:49 [ТС] |
4 |
массив не определяет положительные числа, считает минимальный элемент даже отрицательный.
0 |
7427 / 5021 / 2891 Регистрация: 18.12.2017 Сообщений: 15,694 |
|
26.12.2017, 21:05 |
5 |
Artem_Santos, почему сравниваете с 1 в неравенствах ?
0 |
1493 / 1208 / 821 Регистрация: 29.02.2016 Сообщений: 3,597 |
|
26.12.2017, 21:16 |
6 |
Artem_Santos, программа работает не правильно если А[0] – отрицательное число, которое в 13 строке заносится в min
1 |
1174 / 835 / 359 Регистрация: 26.02.2015 Сообщений: 3,743 |
|
26.12.2017, 21:21 |
7 |
И ещё, ТС, выучи наконец математику начальной школы. Действительными числами даже и не пахнет.
0 |
Yetty 7427 / 5021 / 2891 Регистрация: 18.12.2017 Сообщений: 15,694 |
||||||||||||
27.12.2017, 02:51 |
8 |
|||||||||||
Действительными числами даже и не пахнет. уже проходило
почему сравниваете с 1 в неравенствах ? начальным минимальным нужно делать первое встреченное положительное Добавлено через 1 час 3 минуты
C[0] и будет первым минимальным положительным Добавлено через 12 минут
Добавлено через 4 часа 3 минуты
0 |
d1scret0 11 / 11 / 10 Регистрация: 26.12.2017 Сообщений: 48 |
||||
27.12.2017, 08:56 |
9 |
|||
0 |
7427 / 5021 / 2891 Регистрация: 18.12.2017 Сообщений: 15,694 |
|
27.12.2017, 14:21 |
10 |
d1scret0, зачем 2 идентичных блока на вывод?
0 |
11 / 11 / 10 Регистрация: 26.12.2017 Сообщений: 48 |
|
27.12.2017, 14:39 |
11 |
Yetty, В каком смысле два блока на вывод? Если он один. Если ты про тот который в начале, это что бы ты видел свой массив. Что бы знал с чем сравнивать
0 |
7427 / 5021 / 2891 Регистрация: 18.12.2017 Сообщений: 15,694 |
|
27.12.2017, 14:47 |
12 |
В каком смысле два блока на вывод? в смысле строки 34-35 и 40-41 – я не придираюсь, просто на самом деле хотелось бы видеть наиболее оптимальный код
0 |
11 / 11 / 10 Регистрация: 26.12.2017 Сообщений: 48 |
|
27.12.2017, 14:49 |
13 |
rofl, Ты где нибудь там слово cout видел? Я конечно не придираюсь, но как можно перепутать сумму и вывод. Ты указал мне на цикл, в цикле может быть все что угодно. А cout перед циклом, к нему не принадлежит
0 |
7427 / 5021 / 2891 Регистрация: 18.12.2017 Сообщений: 15,694 |
|
27.12.2017, 15:01 |
14 |
как можно перепутать сумму и вывод бывает просто я хотел бы оставить наиболее оптимальный вариант (свой и ли твой) для меня один из критериев – количество строк. хотел увидеть сколько будет в твоей строк если убрать дубль-блок
0 |
11 / 11 / 10 Регистрация: 26.12.2017 Сообщений: 48 |
|
27.12.2017, 15:20 |
15 |
знаешь, количество строк ничего не решает. Я могу весь свой код написать на одной строке, но длинна этой строки будет большей китайской стены, так что, такой себе критерий
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
27.12.2017, 15:20 |
Помогаю со студенческими работами здесь Найти сумму, максимум, минимум, среднее значение элементов массива Найти количество положительных элементов массива; найти сумму элементов, расположенных после заданного Определить, сколько из элементов массива кратны M и больше N, и найти минимум из найденых Найти сумму положительных элементов массива и количество этих элементов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 15 |
Принцип поиска максимального или
минимального элемента массива заключается
в следующем: в дополнительную переменную
заносится значение первого элемента
массива, которое принимается за максимум
(минимум); затем организовывается перебор
оставшихся элементов массива, каждый
из которых сравнивается с максимумом
(минимумом); если текущий элемент массива
оказывается больше (меньше), чем принятый
за максимум (минимум), то этот элемент
становится максимальным (минимальным).
Таким образом, после завершения перебора
элементов массива в дополнительной
переменной окажется максимальное
(минимальное) значение среди элементов
массива. Фрагмент блок-схемы алгоритма,
реализующий описанный метод приведен
на рисунке 5.2.1.
В блоке 1 дополнительным переменным maxиmin, в которых
будут храниться максимальное и минимальное
значения соответственно, присваивается
значение 1-го элемента массива. Кроме
этого введены еще две переменныеimaxиimin, которые будут
использоваться для хранения номеров
максимального и минимального элементов
массива. С помощью блока модификации
(блок 2) организовывается цикл по перебору
элементов массива Х (перебор начинается
со 2-го элемента, так как 1-й элемент уже
обработан в блоке 1). Если текущий элемент
массиваXiбольше значения, которое хранится в
переменнойmax(блок 3), то за максимум принимается
значение этого элемента:max=Xi,
и запоминается его номер:imax=i(блок 4). Если текущий элемент массива
не больше максимума, то проверяется, не
меньше ли он минимума (блок 5). В случае
если текущий элементXiокажется меньше минимального значения,
которое хранится в переменнойmin,
то за минимум принимается значение
этого элемента:min=Xi,
и запоминается его номер:imin=i(блок 6). После выхода из цикла будут
выведены значения максимального и
минимального элементов, а также их
номера в массиве (блок 7).
Приведенный
выше алгоритм имеет один недостаток –
в нем используется две лишние переменныеmaxиmin.
Зная индекс элемента массива всегда
можно получить его значение, поэтому
нет необходимости хранить максимальное
и минимальное значения в отдельных
переменных. Оптимальный алгоритм
приведен на рис. 5.2.2.
В блоке 1 дополнительным переменным
imaxиimin,
используемых для хранения номеров
максимального и минимального элемента,
присваивается значение 1. Таким образом,
за максимум и минимум принимается 1-й
элемент массива, само же значение этого
элемента нигде дополнительно не
сохраняется. Оставшиеся элементы массива
также перебираются, начиная со второго
(блок 2). При этом каждый элемент массиваXi
сравнивается с
элементами, имеющими номер равныйimax(блок 3) иimin(блок
6), т.е. с элементами принятыми за максимум
(минимум). Если результат проверки
условий является истиной, то в переменныхimaxиiminсохраняются индексы новых максимального
(блок 4) и минимального (блок 6) элементов.
После выхода из цикла будут выведены
значения максимального и минимального
элементов, а также их номера в массиве
(блок 7).
Если в массиве имеется несколько
элементов равных по значению максимальному
(минимальному) элементу, то алгоритмы,
приведенные на рис 5.2.1 и 5.2.2, определят
позицию только первого такого элемента.
Например, чтобы найти количество
элементов массива равных максимальному
и позицию последнего такого элемента,
можно воспользоваться алгоритмом,
приведенным на рис. 5.2.3.
В начале алгоритма за максимум принимается
1-й элемент массива и вводится переменная
kдля подсчета
количества элементов равных максимальному
(блок 1). Затем организовывается цикл по
перебору оставшихся элементов массива
(блок 2). На каждом шаге цикла выполняется
следующая последовательность действий.
Вначале текущий элемент массива Xiсравнивается с максимальным (блок 3).
Если он оказывается больше элемента,
принятого за максимальный, то запоминается
номер этого элемента и переменнойkприсваивается 1 (блок 4). Это означает,
что встретился первый «новый» максимальный
элемент.
Если текущий элемент не больше максимума,
значит, он может быть равным или меньше
максимального элемента. Поэтому в блоке
5 текущий элемент массива Xi
проверяется на равенство
максимальному. Если он оказывается
равным максимуму, то опять запоминается
номер текущего элемента и значение
переменнойkувеличивается на 1 (блок 6). Это означает,
что встретился следующий элемент равный
максимальному элементу. В итоге после
выхода из цикла в переменнойimaxбудет храниться индекс последнего по
счету элемента равного максимальному,
а в переменнойkколичество элементов, равных максимуму.
Если же из блока 6 убрать операциюimax=i,
то в переменнойimax,
как и в предыдущих примерах будет
сохранен номер первого по счету элемента
равного максимальному.
В некоторых задачах невозможно вначале
принять за максимум (минимум) первый
элемент массива. Например, если элементы
массива ещё не определены (не введены
или не вычислены), или если необходимо
найти максимум (минимум) только среди
положительных, четных по значению и
т.д. элементов. Во втором случае неизвестно
когда в массиве встретится первый такой
элемент. В таких ситуациях можно
использовать способ, реализованный в
алгоритме из примера 5.2.
Пример 5.2.В массиве Х [N]
найти минимальный положительный элемент.
Массив
Х может содержать как положительные,
так и отрицательные элементы. Поэтому
неизвестно какой элемент массива или
произвольное значение можно принять
за начальный минимум. Решение поставленной
задачи можно разбить на два этапа: поиск
положительных элементов в массиве с
определением первого такого элемента
и поиск среди положительных элементов
минимального по значению. Блок-схема
алгоритма приведена на рис. 5.2.4.
В нашем примере нумерация элементов
массива начинается с единицы, поэтому
в качестве начального значения для
переменной iminпринимается 0 (блок 1), т.е. значение
которое не могут принимать индексы
элементов массива Х. Таким образом
показывается, что при обработке массива
еще не встречался положительный элемент,
который можно принять за начальное
значение для минимума. Затем организовывается
цикл по перебору всех элементов массива
(блок 2). На каждом шаге цикла выполняется
следующая последовательность действий.
В блоке 3 проверяется, не является ли
текущий элемент массива Xiположительным. Если он отрицательный
или равен нулю, то такой элемент
пропускается и над ним не выполняется
никаких действий. ЕслиXi> 0, то в блоке 4 проверяется, не является
ли этот элемент первым встретившимся
положительным элементом массива
(признаком чего служит значениеiminравное 0). В этом случае в блоке 5 переменнойiminбудет присвоено
текущее значениеi.
Таким образом, за начальное значение
для минимума будет принято значение
первого по счету положительного элемента
массива Х. Эта ситуация может возникнуть
только один раз, и при дальнейшей работе
цикла блок 5 больше выполняться не будет.
Остальные положительные элементы
массива в блоке 6 будут сравниваться с
элементом массива, принятым в текущий
момент за минимум. Если такой элемент
окажется меньше минимального, то в блоке
7 в переменнойiminбудет сохранен его номерi.
После выхода из цикла проверяется, не
равно ли значение iminнулю (блок 8), так как сразу же выводить
значение минимального элемента массиваXimin
и его номерimin(блок 9) нельзя. Это объясняется тем что,
если в массиве Х не будет положительных
элементов, то значение переменнойiminостанется равным нулю, а обращение к
несуществующему элементу массиваХ0не допустимо.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
В этой статье рассмотрены два способа нахождения минимального (максимального) элемента массива, а также задачи с применением этих способов.
1 способ
Задача 1: Дан одномерный массив, состоящий из n целых чисел. Найти минимальный элемент массива. В первой строке вводится количество чисел в массиве n. Затем выводятся сами числа, заданные случайным образом. В третьей строке выводится результат: минимальный элемент массива. | |
Исходные данные: |
Результат: |
10 |
-4 |
10 |
0 |
Считаем, что первый элемент массива – минимальный. Затем, сравниваем, начиная со второго до последнего все элементы массива с минимальным. Используем для этого цикл. Если очередной элемент на каком-то шаге цикла оказывается меньше минимального, то значение минимального изменяем, присвоив ему значение этого очередного элемента. По окончании цикла выводим результат: минимальный элемент.
program min1;
var a:array[1..100] of integer;
i,min,n:integer;
begin
//заполнение массива и вывод массива в строчку
readln(n);
for i:=1 to n do begin
a[i]:=random(-100,100);
write(a[i],’ ‘);
end;
//нахождение минимального элемента массива
min:=a[1];
for i:=2 to n do
if min>=a[i] then min:=a[i];
//вывод результата
writeln;
write(min);
end.
Заметим, что для нахождения максимального элемента массива достаточно заменить имя переменной min на max и знак >= на знак <=.
Задача 2: Дан одномерный массив, состоящий из n целых чисел. Найти индекс минимального элемент массива. В первой строке вводится количество чисел в массиве n. Затем выводится массив, заданный случайным образом. В третьей строке выводится результат: индекс минимального элемент массива. |
|
Исходные данные: |
Результат: |
10 |
5 |
10 |
9 |
Если в задаче требуется найти индекс минимального (максимального), то вводим переменную imin, в которую будем запоминать индекс минимального (максимального), причем первоначально ее значение равно 1.
program min2;
var a:array[1..100] of integer;
i,min,n,imin:integer;
begin
//заполнение массива и вывод массива в строчку
readln(n);
for i:=1 to n do begin
a[i]:=random(-100,100);
write(a[i],’ ‘);
end;
//нахождение индекса минимального элемента массива
min:=a[1];
imin:=1;
for i:=2 to n do
if min>=a[i] then begin
imin:=i;
min:=a[i];
end;
//вывод результата
writeln;
write(imin);
end.
Если в массиве есть несколько равных между собой минимальных элементов, то данная программа найдет номер последнего (правого) элемента. Для того чтобы найти индекс первого (левого) элемента достаточно изменить знак >= на строгий знак >.
Эту программу можно оптимизировать, так как, зная индекс минимального элемента, можно найти значение минимального элемента массива. Значит, переменная min не нужна:
var a:array[1..100] of integer;
i,n,imin:integer;
Фрагмент нахождения индекса минимального элемента массива выглядит так:
imin:=1;
for i:=2 to n do
if a[imin]>=a[i] then imin:=i;
Задача 3: Дан одномерный массив, состоящий из n целых чисел. Найти количество минимальных элементов массива. В первой строке вводится количество чисел в массиве n. Затем выводится массив, заданный случайным образом. В третьей строке выводится результат: количество минимальных элементов массива. | |
Исходные данные: |
Результат: |
10 |
2 |
10 |
3 |
program min3;
var a:array[1..100] of integer;
i,min,n,k:integer;
begin
//заполнение массива и вывод массива в строчку
readln(n);
for i:=1 to n do begin
a[i]:=random(-5,5);
write(a[i],’ ‘);
end;
//нахождение минимального элемента массива
min:=a[1];
for i:=2 to n do
if min>=a[i] then
min:=a[i];
//считаем количество равных элементов
k:=0;
for i:=1 to n do
if a[i]=min then k:=k+1;
//вывод результата
writeln;
write(k);
end.
Задача 4: Дан целочисленный массив из n элементов. Элементы массива могут принимать целые значения от 0 до 1000. Напишите программу, находящую минимальное значение среди элементов массива, которые имеют чётное значение и не делятся на четыре. Гарантируется, что в исходном массиве есть хотя бы один элемент, значение которого чётно и не кратно четырем. В первой строке вводится количество чисел в массиве n. Затем выводится массив, заданный случайным образом. В третьей строке выводится результат: минимальное значение среди элементов массива, которые имеют чётное значение и не делятся на четыре. | |
Исходные данные: |
Результат: |
10 |
-6 |
10 |
-10 |
В этой задаче первый способ нахождения минимального не подойдет. Первый элемент массива может оказаться меньше, чем минимальный четный и не кратный четырем и программа выведет неверный результат. Каким должно быть начальное значение переменной min? Его нужно выбрать таким, чтобы для первого же «подходящего» элемента выполнилось условие a[i] < min, и это «временное» начальное значение было бы заменено на реальное. Такое «подходящее» обязательно будет, так как это гарантировано условием задачи. Оно должно быть большим и таким, какое не может быть по условию задачи, например, 1001.
Кроме того заметим, что задавать элементы массива нужно с клавиатуры, чтобы обеспечить условия задачи.
Итак, находим минимальный элемент вторым способом.
2 способ
Записываем в переменную min значение 1001. Затем в цикле просматриваем все элементы массива, с первого до последнего. Если остаток от деления очередного элемента на 2 равен 0 и остаток от его деления на 4 не равен нулю и значение элемента меньше, чем значение переменной min, сохраняем в переменную min значение очередного элемента массива. После окончания работы цикла выводим значение переменной min.
program min4;
var a:array[1..100] of integer;
i,min,n:integer;
begin
//заполнение массива и вывод массива в строчку
readln(n);
for i:=1 to n do
readln(a[i]);
for i:=1 to n do
write(a[i],’ ‘);
//нахождение минимального элемента массива
min:=1001;
for i:=1 to N do
if (a[i] mod 2=0) and (a[i] mod 4 <> 0) and (a[i]<min) then
min:=a[i];
//вывод результата
writeln;
write(min);
end.
Проверяем на тестах:
10 411 837 755 90 520 203 581 798 401 640 |
90 |
10 |
658 |
Конечно, решить эту задачу можно и первым способом, но для нахождения первого значения min нужно написать дополнительные команды поиска. Вот таким может быть решение:
program min5;
var a:array[1..100] of integer;
i,min,n,j:integer;
begin
//заполнение массива и вывод массива в строчку
readln(n);
for i:=1 to n do
readln(a[i]);
for i:=1 to n do
write(a[i],’ ‘);
//нахождение первого четного и не кратного 4 числа
i:=1;
while (i<=n)and not((a[i] mod 2=0) and (a[i] mod 4 <> 0)) do i:=i+1;
//в переменной i запомнился номер первого элемента, удовлетворяющего условию
//нахождение минимального, начиная со следующего за найденным
min:=a[i];
for j:=i+1 to N do
if (a[j] mod 2=0) and (a[j] mod 4 <> 0) and (a[j]<min) then
min:=a[j];
//вывод результата
writeln;
write(min);
end.
Задача 5: Дан целочисленный массив из n элементов. Элементы массива могут принимать произвольные целые значения. Напишите программу, которая находит и выводит второй максимум массива (элемент, который в отсортированном по невозрастанию массиве стоял бы вторым). | |
Исходные данные: |
Результат: |
10 |
14 |
10 |
45 |
Мы знаем, как найти первый максимум, а в этой задаче нужно найти второй по величине максимум. Попробуем это сделать это за один проход по массиву. Нам нужны две переменные, max1 (максимальный элемент) и max2 (второй максимум). Сначала выбираем максимальный из первых двух элементов и записываем его значение в max1, а второй по величине записываем в max2.
Затем в цикле перебираем все элементы, начиная с 3-го до последнего. Если очередной элемент a[i] больше, чем max1, записываем значение max1 в max2 (предыдущий максимум становится вторым), а значение a[i] – в max1. Иначе, если a[i] больше, чем max2, записываем значение a[i] в max2. После завершения цикла выводим значение переменной max2.
program min6;
var a: array [1..100] of integer;
i, k,n, max1, max2: integer;
begin
//заполнение массива и вывод массива в строчку
readln(n);
for i:=1 to n do begin
a[i]:=random(0,100);
write(a[i],’ ‘);
end;
//начальные значения max1 и max2
if a[1] > a[2] then begin
max1:=a[1]; max2:=a[2]
end
else begin
max1:=a[2]; max2:=a[1]
end;
// поиск второго максимального
for i:=3 to N do
if a[i] > max1 then begin
max2:= max1;
max1:= a[i]
end
else
if a[i] > max2 then max2:=a[i];
//вывод результата
writeln;
writeln(max2);
end.
Задача 6: Дан целочисленный массив из 20 элементов. Элементы массива могут принимать целые значения от 1 до 10000 включительно. Напишите программу, позволяющую найти и вывести минимальный элемент массива, шестнадцатеричная запись которого содержит ровно две цифры, причём первая (старшая) цифра больше второй (младшей). Если таких чисел нет, нужно вывести ответ 0. | |
Исходные данные: |
Результат: |
20 |
14 |
10 |
45 |
Эта задача усложнена только тем, что элементы массива должны быть в диапазоне от 16 до 255. В этом случае первая цифра находится как результат деления нацело на 16, а вторая цифра – как остаток от деления на 16.
Кроме этого здесь массив можно объявить через константу n, так как размер массива задан явно: 20 элементов.
program z6;
//объявление массива через константу
const n=20;
var a: array [1..n] of integer;
i,min: integer;
begin
//заполнение массива и вывод массива в строчку
for i:=1 to n do begin
a[i]:=random(0,10000);
write(a[i],’ ‘);
end;
writeln;
min := 10001;
for i := 1 to n do begin
//для проверки правильности программы выведем две шестнадцатеричные цифры:
//write(a[i] div 16,a[i] mod 16,’ ‘);
if (16 <= a[i]) and (a[i] < 256) and (a[i] div 16 > a[i] mod 16) and (a[i] < min) then
min := a[i];
end;
writeln;
//вывод результата
if min = 10001 then
writeln(0)
else
writeln(min);
end.
Задачи для самостоятельного решения:
- Дан целочисленный массив из n элементов. Элементы могут принимать значения от 150 до 210 – рост учащихся выпускного класса. В волейбольную команду берут тех, чей рост не менее 170 см. Напишите программу, которая определяет и выводит минимальный рост игрока баскетбольной команды. Гарантируется, что хотя бы один ученик играет в баскетбольной команде.
- Дан целочисленный массив из n элементов. Элементы массива могут принимать целые значения от 0 до 100 – баллы учащихся выпускного класса за экзамен по информатике. Для получения положительной оценки за экзамен требовалось набрать не менее 50 баллов. Напишите программу, которая находит и выводит минимальный балл среди учащихся, получивших за экзамен положительную оценку. Известно, что в классе хотя бы один учащийся получил за экзамен положительную оценку.
- Дан целочисленный массив – сведения о температуре за каждый день октября. Элементы массива могут принимать целочисленные значение значения от -15 до 20. Напишите программу, которая находит и выводит максимальную температуру среди дней, когда были заморозки (температура опускалась ниже нуля). Гарантируется, что хотя бы один день в октябре была отрицательная температура.
- Дан целочисленный массив из n элементов, все элементы которого – неотрицательные числа, не превосходящие 10000. Напишите программу, которая находит и выводит минимальное трехзначное число, записанное в этом массиве. Если таких чисел нет, нужно вывести сообщение «Таких чисел нет».
- Дан целочисленный массив из n элементов. Элементы массива могут принимать целые значения от 1 до 10000 включительно. Напишите программу, позволяющую найти и вывести наибольший из элементов массива, шестнадцатеричная запись которого оканчивается на букву F. Если таких чисел нет, нужно вывести ответ 0.
- Дан целочисленный массив из n элементов. Элементы массива могут принимать произвольные целые значения. Напишите программу, которая находит и выводит номера двух элементов массива, сумма которых минимальна.
- Дан целочисленный массив из 20 элементов. Элементы массива могут принимать целые значения от 1 до 10000 включительно. Напишите программу, находящую минимальный элементов массива, шестнадцатеричная запись которого содержит ровно две цифры, причём вторая (младшая) цифра – это буква (от A до F). Если таких чисел нет, нужно вывести ответ 0.
Источники информации
- Угринович Н.Д. Информатика и информационные технологии. Учебник для 10-11 классов/ Н.Д. Угринович. – М.:Бином. Лаборатория знаний, 2005.
- Сайт К. Полякова http://kpolyakov.spb.ru/school/ege.htm
Вам дан несортированный массив с положительными и отрицательными элементами. Вы должны найти наименьшее положительное число, отсутствующее в массиве за время O (n), используя постоянное дополнительное пространство. Вы можете изменить исходный массив.
Примеры
Input: {2, 3, 7, 6, 8, -1, -10, 15} Output: 1 Input: { 2, 3, -7, 6, 8, 1, -10, 15 } Output: 4 Input: {1, 1, 0, -1, -2} Output: 2
Наивным методом решения этой проблемы является поиск всех натуральных чисел, начиная с 1 в данном массиве. Возможно, нам придется искать не более n + 1 чисел в данном массиве. Таким образом, это решение принимает O (n ^ 2) в худшем случае.
Мы можем использовать сортировку, чтобы решить ее в меньшей сложности. Мы можем отсортировать массив за O (nLogn) время. Как только массив отсортирован, все, что нам нужно сделать, — это линейное сканирование массива. Таким образом, этот подход занимает O (nLogn + n) время, которое равно O (nLogn).
Мы также можем использовать хеширование . Мы можем построить хеш-таблицу всех положительных элементов в данном массиве. После того, как хэш-таблица построена. Мы можем посмотреть в хеш-таблице все положительные целые числа, начиная с 1. Как только мы находим число, которого нет в хеш-таблице, мы возвращаем его. Этот подход может занять в среднем O (n) времени, но требует O (n) дополнительного пространства.
AO (n) время и O (1) дополнительное пространство решение:
Идея похожа на этот пост. Мы используем элементы массива в качестве индекса. Чтобы отметить наличие элемента x, мы меняем значение в индексе x на отрицательное . Но этот подход не работает, если есть неположительные (-ve и 0) числа. Таким образом, мы отделяем положительные числа от отрицательных в качестве первого шага, а затем применяем подход.
Ниже приведен двухшаговый алгоритм.
1) Отделите положительные числа от других, т. Е. Переместите все неположительные числа в левую сторону. В следующем коде функция segregate () выполняет эту часть.
2) Теперь мы можем игнорировать неположительные элементы и рассматривать только ту часть массива, которая содержит все положительные элементы. Обходим массив, содержащий все положительные числа и, чтобы отметить наличие элемента x, мы меняем знак значения в индексе x на отрицательный. Мы снова обходим массив и печатаем первый индекс, который имеет положительное значение . В следующем коде функция findMissingPositive () выполняет эту часть. Обратите внимание, что в findMissingPositive мы вычли 1 из значений, так как индексы начинаются с 0 в C.
C ++
#include <bits/stdc++.h>
using
namespace
std;
void
swap(
int
* a,
int
* b)
{
int
temp;
temp = *a;
*a = *b;
*b = temp;
}
int
segregate(
int
arr[],
int
size)
{
int
j = 0, i;
for
(i = 0; i < size; i++) {
if
(arr[i] <= 0) {
swap(&arr[i], &arr[j]);
j++;
}
}
return
j;
}
int
findMissingPositive(
int
arr[],
int
size)
{
int
i;
for
(i = 0; i < size; i++) {
if
(
abs
(arr[i]) - 1 < size && arr[
abs
(arr[i]) - 1] > 0)
arr[
abs
(arr[i]) - 1] = -arr[
abs
(arr[i]) - 1];
}
for
(i = 0; i < size; i++)
if
(arr[i] > 0)
return
i + 1;
return
size + 1;
}
int
findMissing(
int
arr[],
int
size)
{
int
shift = segregate(arr, size);
return
findMissingPositive(arr + shift, size - shift);
}
int
main()
{
int
arr[] = { 0, 10, 2, -10, -20 };
int
arr_size =
sizeof
(arr) /
sizeof
(arr[0]);
int
missing = findMissing(arr, arr_size);
cout <<
"The smallest positive missing number is "
<< missing;
return
0;
}
С
#include <stdio.h>
#include <stdlib.h>
void
swap(
int
* a,
int
* b)
{
int
temp;
temp = *a;
*a = *b;
*b = temp;
}
int
segregate(
int
arr[],
int
size)
{
int
j = 0, i;
for
(i = 0; i < size; i++) {
if
(arr[i] <= 0) {
swap(&arr[i], &arr[j]);
j++;
}
}
return
j;
}
int
findMissingPositive(
int
arr[],
int
size)
{
int
i;
for
(i = 0; i < size; i++) {
if
(
abs
(arr[i]) - 1 < size && arr[
abs
(arr[i]) - 1] > 0)
arr[
abs
(arr[i]) - 1] = -arr[
abs
(arr[i]) - 1];
}
for
(i = 0; i < size; i++)
if
(arr[i] > 0)
return
i + 1;
return
size + 1;
}
int
findMissing(
int
arr[],
int
size)
{
int
shift = segregate(arr, size);
return
findMissingPositive(arr + shift, size - shift);
}
int
main()
{
int
arr[] = { 0, 10, 2, -10, -20 };
int
arr_size =
sizeof
(arr) /
sizeof
(arr[0]);
int
missing = findMissing(arr, arr_size);
printf
(
"The smallest positive missing number is %d "
, missing);
getchar
();
return
0;
}
Джава
import
java.util.*;
class
Main {
static
int
segregate(
int
arr[],
int
size)
{
int
j =
0
, i;
for
(i =
0
; i < size; i++) {
if
(arr[i] <=
0
) {
int
temp;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
j++;
}
}
return
j;
}
static
int
findMissingPositive(
int
arr[],
int
size)
{
int
i;
for
(i =
0
; i < size; i++) {
int
x = Math.abs(arr[i]);
if
(x -
1
< size && arr[x -
1
] >
0
)
arr[x -
1
] = -arr[x -
1
];
}
for
(i =
0
; i < size; i++)
if
(arr[i] >
0
)
return
i +
1
;
return
size +
1
;
}
static
int
findMissing(
int
arr[],
int
size)
{
int
shift = segregate(arr, size);
int
arr2[] =
new
int
[size - shift];
int
j =
0
;
for
(
int
i = shift; i < size; i++) {
arr2[j] = arr[i];
j++;
}
return
findMissingPositive(arr2, j);
}
public
static
void
main(String[] args)
{
int
arr[] = {
0
,
10
,
2
, -
10
, -
20
};
int
arr_size = arr.length;
int
missing = findMissing(arr, arr_size);
System.out.println(
"The smallest positive missing number is "
+ missing);
}
}
C #
using
System;
class
main {
static
int
segregate(
int
[] arr,
int
size)
{
int
j = 0, i;
for
(i = 0; i < size; i++) {
if
(arr[i] <= 0) {
int
temp;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
j++;
}
}
return
j;
}
static
int
findMissingPositive(
int
[] arr,
int
size)
{
int
i;
for
(i = 0; i < size; i++) {
if
(Math.Abs(arr[i]) - 1 < size && arr[ Math.Abs(arr[i]) - 1] > 0)
arr[ Math.Abs(arr[i]) - 1] = -arr[ Math.Abs(arr[i]) - 1];
}
for
(i = 0; i < size; i++)
if
(arr[i] > 0)
return
i + 1;
return
size + 1;
}
static
int
findMissing(
int
[] arr,
int
size)
{
int
shift = segregate(arr, size);
int
[] arr2 =
new
int
[size - shift];
int
j = 0;
for
(
int
i = shift; i < size; i++) {
arr2[j] = arr[i];
j++;
}
return
findMissingPositive(arr2, j);
}
public
static
void
Main()
{
int
[] arr = { 0, 10, 2, -10, -20 };
int
arr_size = arr.Length;
int
missing = findMissing(arr, arr_size);
Console.WriteLine(
"The smallest positive missing number is "
+ missing);
}
}
Выход:
The smallest positive missing number is 1
Обратите внимание, что этот метод изменяет исходный массив. Мы можем изменить знак элементов в выделенном массиве, чтобы вернуть тот же набор элементов. Но мы все еще теряем порядок элементов. Если мы хотим сохранить исходный массив таким, какой он был, то мы можем создать копию массива и запустить этот подход для временного массива.
Другой подход: в этой задаче мы создали список, полный 0 с размером значения max () нашего данного массива. Теперь, когда мы сталкиваемся с любым положительным значением в нашем исходном массиве, мы меняем значение индекса нашего списка на 1. Итак, после того, как мы закончим, мы просто перебираем наш измененный список, первый 0, с которым мы сталкиваемся, его (значение индекса + 1) должен быть наш ответ, так как индекс в Python начинается с 0.
Ниже приведена реализация вышеуказанного подхода:
C ++
#include <bits/stdc++.h>
using
namespace
std;
int
firstMissingPos(
int
A[],
int
n)
{
bool
present[n + 1] = {
false
};
for
(
int
i = 0; i < n; i++) {
if
(A[i] > 0 && A[i] <= n)
present[A[i]] =
true
;
}
for
(
int
i = 1; i <= n; i++)
if
(!present[i])
return
i;
return
n + 1;
}
int
main()
{
int
A[] = { 0, 10, 2, -10, -20 };
int
size =
sizeof
(A) /
sizeof
(A[0]);
cout << firstMissingPos(A, size);
}
Джава
import
java.util.Arrays;
public
class
GFG {
static
int
solution(
int
[] A)
{
int
m = Arrays.stream(A).max().getAsInt();
if
(m <
1
)
{
return
1
;
}
if
(A.length ==
1
) {
if
(A[
0
] ==
1
) {
return
2
;
}
else
{
return
1
;
}
}
int
i =
0
;
int
[] l =
new
int
[m];
for
(i =
0
; i < A.length; i++) {
if
(A[i] >
0
) {
if
(l[A[i] -
1
] !=
1
)
{
l[A[i] -
1
] =
1
;
}
}
}
for
(i =
0
; i < l.length; i++)
{
if
(l[i] ==
0
) {
return
i +
1
;
}
}
return
i +
2
;
}
public
static
void
main(String[] args)
{
int
A[] = {
0
,
10
,
2
, -
10
, -
20
};
System.out.println(solution(A));
}
}
Python 3
def
solution(A):
m
=
max
(A)
if
m <
1
:
return
1
if
len
(A)
=
=
1
:
return
2
if
A[
0
]
=
=
1
else
1
l
=
[
0
]
*
m
for
i
in
range
(
len
(A)):
if
A[i] >
0
:
if
l[A[i]
-
1
] !
=
1
:
l[A[i]
-
1
]
=
1
for
i
in
range
(
len
(l)):
if
l[i]
=
=
0
:
return
i
+
1
return
i
+
2
A
=
[
0
,
10
,
2
,
-
10
,
-
20
]
print
(solution(A))
C #
using
System;
using
System.Linq;
class
GFG {
static
int
solution(
int
[] A)
{
int
m = A.Max();
if
(m < 1) {
return
1;
}
if
(A.Length == 1) {
if
(A[0] == 1) {
return
2;
}
else
{
return
1;
}
}
int
i = 0;
int
[] l =
new
int
[m];
for
(i = 0; i < A.Length; i++) {
if
(A[i] > 0) {
if
(l[A[i] - 1] != 1) {
l[A[i] - 1] = 1;
}
}
}
for
(i = 0; i < l.Length; i++) {
if
(l[i] == 0) {
return
i + 1;
}
}
return
i + 2;
}
public
static
void
Main()
{
int
[] A = { 0, 10, 2, -10, -20 };
Console.WriteLine(solution(A));
}
}
PHP
<?php
function
solution(
$A
){
$m
= max(
$A
);
if
(
$m
< 1)
{
return
1;
}
if
(sizeof(
$A
) == 1)
{
if
(
$A
[0] == 1)
return
2 ;
else
return
1 ;
}
$l
=
array_fill
(0,
$m
, NULL);
for
(
$i
= 0;
$i
< sizeof(
$A
);
$i
++)
{
if
(
$A
[
$i
] > 0)
{
if
(
$l
[
$A
[
$i
] - 1] != 1)
{
$l
[
$A
[
$i
] - 1] = 1;
}
}
}
for
(
$i
= 0;
$i
< sizeof(
$l
);
$i
++)
{
if
(
$l
[
$i
] == 0)
return
$i
+1;
}
return
$i
+2;
}
$A
=
array
(0, 10, 2, -10, -20);
echo
solution(
$A
);
return
0;
?>
Выход:
1
Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
Рекомендуемые посты:
- Найти наименьшее положительное число, отсутствующее в несортированном массиве | Набор 2
- Найти наименьшее положительное число, отсутствующее в несортированном массиве | Набор 3
- Найдите наименьшее положительное число, отсутствующее в несортированном массиве: реализация хеширования
- Найдите наименьшее пропущенное число
- Наименьшее простое число отсутствует в массиве
- Найдите наименьшее положительное целочисленное значение, которое не может быть представлено как сумма любого подмножества данного массива
- Найдите наименьшее положительное число, которое не может быть представлено заданными цифрами
- k-й отсутствующий элемент в несортированном массиве
- Найти пропущенное число в другом массиве, который является перемешанной копией
- Найти пропущенное число в отсортированном массиве ограниченного диапазона
- K’th самый маленький / самый большой элемент в несортированном массиве | Комплект 1
- kth самый маленький / самый большой в малом диапазоне несортированный массив
- K’th самый маленький / самый большой элемент в несортированном массиве | Набор 2 (ожидаемое линейное время)
- K’th самый маленький / самый большой элемент в несортированном массиве | Набор 3 (наихудший случай линейного времени)
- Найти недостающее целое число в массиве, если указано среднее
Найти наименьшее положительное число, отсутствующее в несортированном массиве | Комплект 1
0.00 (0%) 0 votes