Tried to googled it but with no luck.
How can I find the second maximum number in an array with the smallest complexity?
code OR idea will be much help.
I can loop through an array and look for the maximum number
after that, I have the maximum number and then loop the array again to find the second the same way.
But for sure it is not efficient.
asked Feb 11, 2013 at 10:38
4
Answer in C# :
static void Main(string[] args)
{
//let us define array and vars
var arr = new int[]{ 100, -3, 95,100,95, 177,-5,-4,177,101 };
int biggest =0, secondBiggest=0;
for (int i = 0; i < arr.Length; ++i)
{
int arrItem = arr[i];
if(arrItem > biggest)
{
secondBiggest = biggest; //always store the prev value of biggest
//to second biggest...
biggest = arrItem;
}
else if (arrItem > secondBiggest && arrItem < biggest) //if in our
//iteration we will find a number that is bigger than secondBiggest and smaller than biggest
secondBiggest = arrItem;
}
Console.WriteLine($"Biggest Number:{biggest}, SecondBiggestNumber:
{secondBiggest}");
Console.ReadLine(); //make program wait
}
Output : Biggest Number:177, SecondBiggestNumber:101
answered Nov 20, 2018 at 16:49
Eran PeledEran Peled
7575 silver badges6 bronze badges
public static int F(int[] array)
{
array = array.OrderByDescending(c => c).Distinct().ToArray();
switch (array.Count())
{
case 0:
return -1;
case 1:
return array[0];
}
return array[1];
}
answered Aug 13, 2014 at 0:12
Haithem KAROUIHaithem KAROUI
1,5034 gold badges17 silver badges39 bronze badges
static void Main(string[] args)
{
int[] myArray = new int[] { 0, 11, 2, 15, 16, 8, 16 ,8,15};
int Smallest = myArray.Min();
int Largest = myArray.Max();
foreach (int i in myArray)
{
if(i>Smallest && i<Largest)
{
Smallest=i;
}
}
System.Console.WriteLine(Smallest);
Console.ReadLine();
}
This will work even if you have reputation of items in an array
answered Mar 14, 2018 at 4:49
int[] arr = {-10, -3, -3, -6};
int h = int.MinValue, m = int.MinValue;
foreach (var t in arr)
{
if (t == h || t == m)
continue;
if (t > h)
{
m = h;
h = t;
}
else if(t > m )
{
m = t;
}
}
Console.WriteLine("High: {0} 2nd High: {1}", h, m);
//or,
m = arr.OrderByDescending(i => i).Distinct().Skip(1).First();
Console.WriteLine("High: {0} 2nd High: {1}", h, m);
answered Oct 29, 2018 at 6:25
nahidnahid
8110 bronze badges
2
/* we can use recursion */
var counter = 0;
findSecondMax = (arr)=> {
let max = Math.max(...arr);
counter++;
return counter == 1 ? findSecondMax(arr.slice(0,arr.indexOf(max)).concat(arr.slice(arr.indexOf(max)+1))) : max;
}
console.log(findSecondMax([1,5,2,3,0]))
answered May 31, 2019 at 20:43
deepak_paldeepak_pal
1591 silver badge5 bronze badges
static void Main(string[] args){
int[] arr = new int[5];
int i, j,k;
Console.WriteLine("Enter Array");
for (i = 0; i < 5; i++) {
Console.Write("element - {0} : ", i);
arr[i] = Convert.ToInt32(Console.ReadLine());
}
Console.Write("nElements in array are: ");
j=arr[0];
k=j;
for (i = 1; i < 5; i++) {
if (j < arr[i])
{
if(j>k)
{
k=j;
}
j=arr[i];
}
}
Console.WriteLine("First Greatest element: "+ j);
Console.WriteLine("Second Greatest element: "+ k);
Console.Write("n");
}
41 72 6c
1,5905 gold badges17 silver badges29 bronze badges
answered Aug 23, 2019 at 7:31
UmeshDixitUmeshDixit
71 silver badge4 bronze badges
int max = 0;
int secondmax = 0;
int[] arr = { 2, 11, 15, 1, 7, 99, 6, 85, 4 };
for (int r = 0; r < arr.Length; r++)
{
if (max < arr[r])
{
max = arr[r];
}
}
for (int r = 0; r < arr.Length; r++)
{
if (secondmax < arr[r] && arr[r] < max)
{
secondmax = arr[r];
}
}
Console.WriteLine(max);
Console.WriteLine(secondmax);
Console.Read();
Josef
2,7492 gold badges21 silver badges23 bronze badges
answered Jun 3, 2021 at 7:49
Python 36>=
def sec_max(array: list) -> int:
_max_: int = max(array)
second: int = 0
for element in array:
if second < element < _max_:
second = element
else:
continue
return second
answered Jan 16, 2022 at 18:16
Using below code we can find out second highest number, even array contains multiple max numbers
// int[] myArray = { 25, 25, 5, 20, 50, 23, 10 };
public static int GetSecondHighestNumberForUniqueNumbers(int[] numbers)
{
int highestNumber = 0, Seconhight = 0;
List<int> numberList = new List<int>();
for (int i = 0; i < numbers.Length; i++)
{
//For loop should move forward only for unique items
if (numberList.Contains(numbers[i]))
continue;
else
numberList.Add(numbers[i]);
//find higest number
if (highestNumber < numbers[i])
{
Seconhight = highestNumber;
highestNumber = numbers[i];
} //find second highest number
else if (Seconhight < numbers[i])
{
Seconhight = numbers[i];
}
}
answered Apr 17, 2022 at 11:04
It’s not like that your structure is a tree…It’s just a simple array, right?
The best solution is to sort the array. And depending on descending or ascending, display the second or the 2nd last element respectively.
The other alternative is to use some inbuilt methods, to get the initial max. Pop that element, and then search for the max again. Don’t know C#, so can’t give the direct code.
answered Feb 11, 2013 at 10:42
Pratik BothraPratik Bothra
2,6322 gold badges29 silver badges44 bronze badges
1
You’d want to sort the numbers, then just take the second largest. Here’s a snippet without any consideration of efficiency:
var numbers = new int[] { 3, 5, 1, 5, 4 };
var result=numbers.OrderByDescending(x=>x).Distinct().Skip(1).First();
answered Feb 11, 2013 at 10:44
This isn’t too bad:
int[] myArray = new int[] { 0, 1, 2, 3, 13, 8, 5 };
var secondMax =
myArray.Skip(2).Aggregate(
myArray.Take(2).OrderByDescending(x => x).AsEnumerable(),
(a, x) => a.Concat(new [] { x }).OrderByDescending(y => y).Take(2))
.Skip(1)
.First();
It’s fairly low on complexity as it only every sorts a maximum of three elements
answered Nov 14, 2015 at 6:48
EnigmativityEnigmativity
112k11 gold badges89 silver badges172 bronze badges
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int size;
Console.WriteLine("Enter the size of array");
size = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Enter the element of array");
int[] arr = new int[size];
for (int i = 0; i < size; i++)
{
arr[i] = Convert.ToInt32(Console.ReadLine());
}
int length = arr.Length;
Program program = new Program();
program.SeconadLargestValue(arr, length);
}
private void SeconadLargestValue(int[] arr, int length)
{
int maxValue = 0;
int secondMaxValue = 0;
for (int i = 0; i < length; i++)
{
if (arr[i] > maxValue)
{
secondMaxValue = maxValue;
maxValue = arr[i];
}
else if(arr[i] > secondMaxValue)
{
secondMaxValue = arr[i];
}
}
Console.WriteLine("First Largest number :"+maxValue);
Console.WriteLine("Second Largest number :"+secondMaxValue);
Console.ReadLine();
}
}
}
answered Jul 27, 2015 at 7:01
1
My solution below.
class Program
{
static void Main(string[] args)
{
Program pg = new Program();
Console.WriteLine("*****************************Program to Find 2nd Highest and 2nd lowest from set of values.**************************");
Console.WriteLine("Please enter the comma seperated numbers : ");
string[] val = Console.ReadLine().Split(',');
int[] inval = Array.ConvertAll(val, int.Parse); // Converts Array from one type to other in single line or Following line
// val.Select(int.Parse)
Array.Sort(inval);
Console.WriteLine("2nd Highest is : {0} n 2nd Lowest is : {1}", pg.Return2ndHighest(inval), pg.Return2ndLowest(inval));
Console.ReadLine();
}
//Method to get the 2nd lowest and 2nd highest from list of integers ex 1000,20,-10,40,100,200,400
public int Return2ndHighest(int[] values)
{
if (values.Length >= 2)
return values[values.Length - 2];
else
return values[0];
}
public int Return2ndLowest(int[] values)
{
if (values.Length > 2)
return values[1];
else
return values[0];
}
}
answered Nov 28, 2016 at 7:11
1
I am giving solution that’s in JavaScript, it takes o(n/2) complexity to find the highest and second highest number.
here is the working Fiddler Link
var num=[1020215,2000,35,2,54546,456,2,2345,24,545,132,5469,25653,0,2315648978523];
var j=num.length-1;
var firstHighest=0,seoncdHighest=0;
num[0] >num[num.length-1]?(firstHighest=num[0],seoncdHighest=num[num.length-1]):(firstHighest=num[num.length-1], seoncdHighest=num[0]);
j--;
for(var i=1;i<=num.length/2;i++,j--)
{
if(num[i] < num[j] )
{
if(firstHighest < num[j]){
seoncdHighest=firstHighest;
firstHighest= num[j];
}
else if(seoncdHighest < num[j] ) {
seoncdHighest= num[j];
}
}
else {
if(firstHighest < num[i])
{
seoncdHighest=firstHighest;
firstHighest= num[i];
}
else if(seoncdHighest < num[i] ) {
seoncdHighest= num[i];
}
}
}
answered Nov 4, 2015 at 15:04
Praveen M PPraveen M P
11.2k7 gold badges33 silver badges41 bronze badges
Sort the array and take the second to last value?
answered Feb 11, 2013 at 10:41
Captain KenpachiCaptain Kenpachi
6,9407 gold badges47 silver badges68 bronze badges
1
var result = (from elements in inputElements
orderby elements descending
select elements).Distinct().Skip(1).Take(1);
return result.FirstOrDefault();
QuantumLicht
2,1033 gold badges23 silver badges32 bronze badges
answered Sep 11, 2015 at 21:25
1
namespace FindSecondLargestNumber
{
class Program
{
static void Main(string[] args)
{
int max=0;
int smax=0;
int i;
int[] a = new int[20];
Console.WriteLine("enter the size of the array");
int n = int.Parse(Console.ReadLine());
Console.WriteLine("elements");
for (i = 0; i < n; i++)
{
a[i] = int.Parse(Console.ReadLine());
}
for (i = 0; i < n; i++)
{
if ( a[i]>max)
{
smax = max;
max= a[i];
}
else if(a[i]>smax)
{
smax=a[i];
}
}
Console.WriteLine("max:" + max);
Console.WriteLine("second max:"+smax);
Console.ReadLine();
}
}
}
Whit Waldo
4,6544 gold badges45 silver badges68 bronze badges
answered Nov 4, 2016 at 17:19
2
Помогите. Задача описана в первых комментариях кода.
Никак не могу понять, как найти два максимальных элемента массива и их индекс.
Например, массив у нас пусть будет {10, -2, 3, 9, 7, 6, 2, -10, 9, 10}
Нужно чтобы показало элементы A[0] = 10 и A[9] = 10.
И ещё, поясните почему рандом постоянно генерирует одни и те же значения при компиляции.
// Задача: заполнить массив из 10 элементов случайными числами
// в интервале [-10..10] и найти в нем
// два максимальных элемента и их номера.
#include <iostream>
#include <cstdlib>
using namespace std;
// Функция, возвращает случайное число в заданном диапазоне [a,b].
int random (int min, int max)
{
max++;
return abs(rand()%(max-min))+min;
}
int main()
{
const int N = 10;
int A[N], i, element, first_max_element, second_max_element, random_number_is, iMAX1, iMAX2;
cout<<"Enter 5 elements of array.nn";
// Заполняем массив рандомными числами.
for(i =0; i<N; i++)
{
random_number_is = random(-10,10);
A[i] = {random_number_is};
cout<<"Random A["<<i<<"]: "<< random_number_is<<"n";
}
// Вычисляем первый максимальный элемент массива.
first_max_element = A[0];
iMAX1 = 0;
for(i=0; i<N; i++)
{
if(A[i] > first_max_element)
{
first_max_element = A[i];
iMAX1 = i;
}
}
// Вычисляем второй максимальный элемент массива.
second_max_element = A[0];
iMAX2 = 0;
for(i=0; i<N; i++)
{
if(A[i] > second_max_element && iMAX1 != iMAX2)
{
second_max_element = A[i];
iMAX2 = i;
}
}
cout<<"nFirst max element of array is: "<<"A["<<iMAX1<<"]: "<<first_max_element;
cout<<"nSecond max element of array is: "<<"A["<<iMAX2<<"]: "<<second_max_element;
}
Паскаль. В линейном массиве найти два максимальных элемента.
Профи
(638),
закрыт
11 лет назад
Дополнен 11 лет назад
заполнение массива случайными числами
Дополнен 11 лет назад
нужна программа, я одно максимальное число нашла, а как найти сразу два максимальных элемента???
Руслан Синкевич
Профи
(787)
11 лет назад
Самый простой вариант – сделать второй проход, запомнив индекс максимального элемента, который был установлен в предыдущем проходе. При втором проходе просто пропустить его, выполнив проверку (к примеру if not i=2 then if a(i) > max then max:=a(i) )
var
max1, ind, max2, i : integer;
a : array [1..100] of integer;
begin
randomize;
for i:=1 to 100 do
a(i) := random(200);
max1 := a(i);
for i:=2 to 100 do
if a(i) > max1 then begin max1 := a(i); ind = i; end;
max2 := a(i);
for i:=2 to 100 do
if (a(i) > max2) and (i <> ind) then max2 := a(i);
writeln(‘max1=’, max1, ‘ max2=’, max2);
end.
Примерно так. Писал по памяти, нет под рукой компилятора. (i) замените на квадратные скобки.
dosmot dosmot
Мастер
(1739)
11 лет назад
После того, как одно максимальное число найдено, ищите второе точно так же, но при этом сравнивайте с первым (его занести в отдельную переменную) . Т. е. оно должно получиться больше всех чисел в массиве, кроме первого числа.
****** ******
Ученик
(199)
6 лет назад
код С#
________
using System;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Random rnd = new Random();
int[] initArr = new int[10000];
for (int i = 0; i < initArr.Length; i++)
{
initArr[i] = rnd.Next(-1000, 1000);
}
var outArr = Sort(initArr, 10);
}
private static int[] Sort(int[] array, int count)
{
int[] outArr = new int[count];
for (int i = 0; i < outArr.Length; i++)
{
int[] sorted = new int[count];
for (int j = 0; j < array.Length; j++)
{
if (!sorted.Contains(array[j]) && array[j] == array.Max())
{
outArr[i] = array[j];
array[j] = 0;
}
}
}
return (int[]) outArr.Reverse();
}
}
}
Выбирает из массива А массив максимальных чисел Б. В массиве А числа могут повторяться и поэтмоу также считаются максимальными. Требует доработки, т. к. 5 элементов из 10000 массива выберет за 6 сек. А если надо будет выбрать 1000?? Прикрути linq и возможно будет тебе праздник, но не факт, скорее всего еще медленее станет работать
ver6959 0 / 0 / 0 Регистрация: 14.07.2015 Сообщений: 4 |
||||
1 |
||||
Найти второй максимальный элемент в массиве23.04.2017, 17:58. Показов 13329. Ответов 9 Метки нет (Все метки)
Здравствуйте! Подскажите, пожалуйста, как найти второй максимальный элемент в массиве? Спасибо. Моя попытка:
0 |
FreeYourMind 147 / 147 / 104 Регистрация: 13.11.2016 Сообщений: 557 |
||||
23.04.2017, 20:37 |
2 |
|||
Сообщение было отмечено ver6959 как решение Решение
второй максимальный элемент то есть в массиве есть второй элемент равный максимальному? или тот, что максимально близкий к мексимальному? Добавлено через 37 минут
1 |
повар1 783 / 590 / 317 Регистрация: 24.02.2017 Сообщений: 2,087 |
||||
23.04.2017, 21:36 |
3 |
|||
0 |
0 / 0 / 0 Регистрация: 14.07.2015 Сообщений: 4 |
|
23.04.2017, 21:44 [ТС] |
4 |
Второй элемент, который равен максимальному. Добавлено через 2 минуты
0 |
повар1 783 / 590 / 317 Регистрация: 24.02.2017 Сообщений: 2,087 |
||||
23.04.2017, 21:54 |
5 |
|||
Добавь счетчик количества выводов элементов массива
1 |
0 / 0 / 0 Регистрация: 14.07.2015 Сообщений: 4 |
|
23.04.2017, 21:56 [ТС] |
6 |
второй элемент равный максимальному
0 |
повар1 783 / 590 / 317 Регистрация: 24.02.2017 Сообщений: 2,087 |
||||
23.04.2017, 21:57 |
7 |
|||
0 |
yxelan 4 / 4 / 6 Регистрация: 08.01.2012 Сообщений: 27 |
||||
23.04.2017, 22:45 |
8 |
|||
0 |
Dani 1404 / 646 / 135 Регистрация: 11.08.2011 Сообщений: 2,299 Записей в блоге: 2 |
||||
23.04.2017, 23:05 |
9 |
|||
0 |
147 / 147 / 104 Регистрация: 13.11.2016 Сообщений: 557 |
|
24.04.2017, 19:21 |
10 |
ver6959, сделайте счетчик.. или сделайте отдельный цикл для вывода массива а для поиска элементов другой и там в ифе (который ищет второй индекс) делайте break;
0 |
Когда в списке много элементов, нам может понадобиться найти максимальный или минимальный элемент, и Python значительно упростил нам задачу.
В этой статье мы расскажем, как можно найти второе по величине число в списке Python с помощью следующих принципов:
- Сортировка списка и печать предпоследнего числа списка.
- Удаление максимального элемента.
- Нахождение максимального элемента.
- Перемещение по списку.
Давайте разберем первый подход.
Сортировка списка и печать предпоследнего числа
Следующая программа показывает, как это можно сделать на Python.
Пример –
#program to find the second largest number of list # declaring the list list_val = [20, 30, 40, 25, 10] # sorting the list list_val.sort() #displaying the second last element of the list print("The second largest element of the list is:", list_val[-2])
Выход:
The second largest element of the list is: 30
Объяснение –
- Мы объявили список, из которого хотим изъять второй элемент, начиная с конца списка.
- После этого мы использовали метод сортировки, чтобы все элементы нашего списка располагались в порядке возрастания.
- Теперь мы используем отрицательную индексацию, так как второе по величине число будет на предпоследней позиции.
Второй метод – получить второй по величине элемент списка, удалив максимальный элемент.
Давайте посмотрим, как мы можем это сделать.
Удаление максимального элемента
Пример –
#program to find the second largest number of list # declaring the list list_val = [20, 30, 40, 25, 10] # new_list is a set of list1 res_list = set(list_val) #removing the maximum element res_list.remove(max(res_list)) #printing the second largest element print(max(res_list))
Выход:
30
Объяснение –
Давайте разберемся, что мы сделали в вышеуказанной программе:
- Мы объявили список, из которого хотим изъять второй по величине элемент.
- После этого мы использовали метод set, чтобы взять все уникальные элементы списка.
- Теперь мы используем max(), чтобы получить максимальное значение из списка, а затем удаляем его.
- После этого мы печатаем максимум результирующего списка, который даст нам второе по величине число.
В третьем методе мы будем использовать цикл for и и с его помощью найдем второй максимум из списка.
Нахождение максимального элемента
Пример –
# declaring empty list list_val = [] # user provides the number of elements to be added in the list num_list = int(input("Enter number of elements in list: ")) for i in range(1, num_list + 1): element = int(input("Enter the elements: ")) list_val.append(element) # sort the list list_val.sort() # print second largest element print("Second largest element is:", list_val[-2])
Выход:
Enter number of elements in list: 5 Enter the elements: 10 Enter the elements: 20 Enter the elements: 30 Enter the elements: 40 Enter the elements: 50 The second largest element is: 40
Объяснение –
- Мы объявили пустой список, в который будем вставлять элементы.
- После этого мы просим пользователя предоставить нам количество элементов, которые мы хотели бы добавить в наш список.
- Используем метод сортировки, чтобы все элементы нашего списка располагались в порядке возрастания.
- Теперь мы применим отрицательную индексацию, так как второе по величине число будет на второй последней позиции.
Перемещение по списку
В последней программе мы пройдемся по списку, чтобы найти наибольшее число, а затем с помощью условных операторов найдем второе по величине число в списке.
Следующая программа это проиллюстрирует:
def calc_largest(arr): second_largest = arr[0] largest_val = arr[0] for i in range(len(arr)): if arr[i] > largest_val: largest_val = arr[i] for i in range(len(arr)): if arr[i] > second_largest and arr[i] != largest_val: second_largest = arr[i] return second_largest print(calc_largest([20, 30, 40, 25, 10]))
Выход:
30
Объяснение –
Давайте разберемся, что мы сделали в вышеуказанной программе:
- Первый шаг – создать функцию, которая проверяет наибольшее число из списка, просматривая его.
- В следующем цикле for мы снова просматриваем список для поиска наибольшего числа, но на этот раз исключаем предыдущий, так как здесь наша цель – найти вторую по величине функцию.
- Наконец, мы передаем наш список в функцию.
Итак, в этой статье у нас была возможность подумать нестандартно и открыть для себя несколько новых способов разработки логики поиска второго по величине числа в Python.
Изучаю Python вместе с вами, читаю, собираю и записываю информацию опытных программистов.