Как найти второй минимум в массиве

Найти два наименьших (минимальных) элемента массива

Просмотров 7.5к. Обновлено 15 октября 2021

В одномерном массиве целых чисел определить два наименьших элемента. Они могут быть как равны между собой (оба являться минимальными), так и различаться.

Сначала можно найти минимальный элемент массива. После этого искать второй минимум, исключив их поиска первый с помощью if. Данный способ рассматривается здесь по отношению к двум наибольшим элементам.

Сложнее задачу решить, используя один цикл перебора.

Предположим, что двумя наименьшими элементами массива являются первый и второй элемент. Присвоим их индексы переменным m1 и m2. При этом, если первый элемент меньше второго, то его индекс присвоим m1, иначе m1 получит значение второго элемента, а m2 первого.

Начнем перебирать массив в цикле, начиная с третьего элемента. Если он меньше элемента, чей индекс хранится в m1, то присвоим индекс текущего элемента m1. Иначе (если значение по индексу m1 меньше, чем по индексу i) будем проверять, не меньше ли значение по индексу i, того что по индексу m2.

Есть один не очевидный нюанс. Допустим, в m1 указывало на значение 5, а m2 — на 10. Очередной элемент равен 3. Мы меняем m1, и забываем о числе 5. Однако оно может оказаться как раз вторым минимумом массива.

Поэтому в программе при изменении значения m1 надо предусмотреть проверку, не меньше ли теряемое значение, чем то, что хранится по индексу m2.

Pascal


const
N = 10;
var
a: array[1..N] of integer;
i, min1, min2, buff: byte;
begin
randomize;
for i:=1 to N do begin
a[i] := random(100);
write(a[i]:4);
end;
writeln;

if a[1] < a[2] then begin
min1 := 1;
min2 := 2;
end
else begin
min1 := 2;
min2 := 1;
end;

for i:=3 to N do
if a[i] < a[min1] then begin
buff := min1;
min1 := i;
if a[buff] < a[min2] then
min2 := buff;
end
else
if a[i] < a[min2] then
min2 := i;

writeln('№', min1:2,': ', a[min1]:2);
writeln('№', min2:2,': ', a[min2]:2);
end.



8 66 40 40 0 14 50 74 93 71
№ 5: 0
№ 1: 8

Язык Си


#include < stdio.h>
#define N 10
main() {
int a[N];
int i, min1, min2, buff;
srand(time(NULL));
for (i=0; i< N; i++) {
a[i] = rand() % 100;
printf("%3d", a[i]);
}
printf("n");

if (a[0] < a[1]) {
min1 = 0;
min2 = 1;
} else {
min1 = 1;
min2 = 0;
}

for (i=2; i< N; i++) {
if (a[i] < a[min1]) {
buff = min1;
min1 = i;
if (a[buff] < a[min2]) min2 = buff;
} else {
if (a[i] < a[min2]) min2 = i;
}
}

printf("№%2d:%3dn",min1+1,a[min1]);
printf("№%2d:%3dn",min2+1,a[min2]);
}



97 20 88 29 20 43 87 19 33 26
№ 8: 19
№ 5: 20

Python

найти два минимальных элемента массива python


from random import random
N = 10
a = []
for i in range(N):
a.append(int(random()*100))
print("%3d" % a[i], end='')
print()

if a[0] > a[1]:
min1 = 0
min2 = 1
else:
min1 = 1
min2 = 0

for i in range(2,N):
if a[i] < a[min1]:
b = min1
min1 = i
if a[b] < a[min2]:
min2 = b
elif a[i] < a[min2]:
min2 = i

print("№%3d:%3d" % (min1+1, a[min1]))
print("№%3d:%3d" % (min2+1, a[min2]))

# Вариант 2

from random import randint

array = [randint(1, 20) for i in range(10)]
print(array)

min1 = min(array)
array.remove(min1)
min2 = min(array)

print(min1)
print(min2)



14 3 40 56 42 43 89 69 64 72
№ 1: 14
№ 2: 3

КуМир


алг два минимальных
нач
цел N = 10
цел таб arr[1:N]
цел i,m1,m2,b
нц для i от 1 до N
arr[i] := irand(10,100)
вывод arr[i]:3
кц
вывод нс

если arr[1] < arr[2] то
m1 := 1
m2 := 2
иначе
m1 := 2
m2 := 1
все

нц для i от 3 до N
если arr[i] < arr[m1] то
b := m1
m1 := i
если arr[b] < arr[m2] то
m2 := b
все
иначе
если arr[i] < arr[m2] то
m2 := i
все
все
кц
вывод "№",m1:2,":",arr[m1]:3,нс
вывод "№",m2:2,":",arr[m2]:3,нс
кон



65 32 24 86 65 58 67 55 33 96
№ 3: 24
№ 2: 32

Basic-256


N = 10
dim arr(N)
for i=0 to N-1
arr[i] = int(rand*100)
print arr[i] + " ";
next i
print

if arr[0] < arr[1] then
m1 = 0
m2 = 1
else
m1 = 1
m2 = 0
endif

for i=2 to N-1
if arr[i] < arr[m1] then
b = m1
m1 = i
if arr[b] < arr[m2] then
m2 = b
endif
else
if arr[i] < arr[m2] then
m2 = i
endif
endif
next i

print (m1+1) + ": " + arr[m1]
print (m2+1) + ": " + arr[m2]



81 7 25 71 23 9 56 91 73 64
2: 7
6: 9

Write an efficient C++/C program to find the smallest and second smallest element in an array.

Example:

Input:  arr[] = {12, 13, 1, 10, 34, 1}
Output: The smallest element is 1 and 
        second Smallest element is 10

Approach 1:

A Simple Solution is to sort the array in increasing order. The first two elements in the sorted array would be the two smallest elements. In this approach, if the smallest element is present more than one time then we will have to use a loop for printing the unique smallest and second smallest elements. 

Below is the implementation of the above approach:

C#

using System;

public class GFG {

    static public void Main()

    {

        int[] arr = { 111, 13, 25, 9, 34, 1 };

        int n = arr.Length;

        Array.Sort(arr);

        Console.WriteLine("smallest element is " + arr[0]);

        Console.WriteLine("second smallest element is "

                          + arr[1]);

    }

}

C++

#include <bits/stdc++.h>

using namespace std;

int main()

{

    int arr[] = { 111, 13, 25, 9, 34, 1 };

    int n = sizeof(arr) / sizeof(arr[0]);

    sort(arr, arr + n);

    cout << "smallest element is " << arr[0] << endl;

    cout << "second smallest element is " << arr[1];

    return 0;

}

Java

import java.io.*;

import java.util.*;

class GFG {

    public static void main(String args[])

    {

        int arr[] = { 111, 13, 25, 9, 34, 1 };

        int n = arr.length;

        Arrays.sort(arr);

        System.out.println("smallest element is " + arr[0]);

        System.out.println("second smallest element is "

                           + arr[1]);

    }

}

Python3

arr = [111, 13, 25, 9, 34, 1]

n = len(arr)

arr.sort()

print("smallest element is "+str(arr[0]))

print("second smallest element is "+str(arr[1]))

Javascript

<script>

let arr = [111, 13, 25, 9, 34, 1];

let n = arr.length;

arr.sort();

document.write("smallest element is "+arr[0],"</br>");

document.write("second smallest element is "+arr[1],"</br>");

</script>

Output

smallest element is 1
second smallest element is 9

Time complexity: O(N*logN)
Auxiliary space: O(1)

Approach 2A: 

A Better Solution is to scan the array twice. In the first traversal find the minimum element. Let this element be x. In the second traversal, find the smallest element greater than x.

Using this method, we can overcome the problem of Method 1 which occurs when the smallest element is present in an array more than one time.

The above solution requires two traversals of the input array. 

C++

#include <bits/stdc++.h>

using namespace std;

int main()

{

    int arr[] = {12, 13, 1, 10, 34, 1};

    int n = sizeof(arr) / sizeof(arr[0]);

    int smallest = INT_MAX;

    for (int i = 0; i < n; i++)

    {

        if (arr[i] < smallest)

        {

            smallest = arr[i];

        }

    }

    cout << "smallest element is: " << smallest << endl;

    int second_smallest = INT_MAX;

    for (int i = 0; i < n; i++)

    {

        if (arr[i] < second_smallest && arr[i] > smallest)

        {

            second_smallest = arr[i];

        }

    }

    cout << "second smallest element is: " << second_smallest << endl;

    return 0;

}

Java

import java.io.*;

class GFG {

    public static void main(String args[])

    {

        int arr[] = { 12, 13, 1, 10, 34, 1 };

        int n = arr.length;

        int smallest = Integer.MAX_VALUE;

        for (int i = 0; i < n; i++) {

            if (arr[i] < smallest) {

                smallest = arr[i];

            }

        }

        System.out.println("smallest element is: "

                           + smallest);

        int second_smallest = Integer.MAX_VALUE;

        for (int i = 0; i < n; i++) {

            if (arr[i] < second_smallest

                && arr[i] > smallest) {

                second_smallest = arr[i];

            }

        }

        System.out.println("second smallest element is: "

                           + second_smallest);

    }

}

Python

import sys

arr = [12, 13, 1, 10, 34, 1]

n = len(arr)

smallest = sys.maxint

for i in range(n):

    if(arr[i] < smallest):

        smallest = arr[i]

print('smallest element is: ' + str(smallest))

second_smallest = sys.maxint

for i in range(n):

    if(arr[i] < second_smallest and arr[i] > smallest):

        second_smallest = arr[i]

print('second smallest element is: ' + str(second_smallest))

C#

using System;

public class GFG

{

  static public void Main ()

  {

    int[] arr = { 12, 13, 1, 10, 34, 1 };

    int n = arr.Length;

    int smallest = Int32.MaxValue;

    for (int i = 0; i < n; i++)

    {

      if (arr[i] < smallest)

      {

        smallest = arr[i];

      }

    }

    Console.WriteLine("smallest element is: " + smallest);

    int second_smallest = Int32.MaxValue;

    for (int i = 0; i < n; i++)

    {

      if (arr[i] < second_smallest && arr[i] > smallest)

      {

        second_smallest = arr[i];

      }

    }

    Console.WriteLine("second smallest element is: " + second_smallest);

  }

}

Javascript

<script>

function solution( arr, arr_size)

{

  let first = Number.MAX_VALUE,

        second = Number.MAX_VALUE;

  if (arr_size < 2)

  {

    document.write(" Invalid Input ");

    return;

  }

  for (let i = 0; i < arr_size ; i ++)

  {

    if (arr[i] < first){

      first = arr[i];

    }

  }

   for (let i = 0; i < arr_size ; i ++){

    if (arr[i] < second && arr[i] > first){

      second = arr[i];

    }

  }

  if (second == Number.MAX_VALUE )

    document.write("There is no second smallest elementn");

  else

    document.write("The smallest element is " + first + " and second "+

      "Smallest element is " + second +'n');

}

  let arr = [ 12, 13, 1, 10, 34, 1 ];

  let n = arr.length;

  solution(arr, n);

</script>

Output

smallest element is: 1
second smallest element is: 10

Time complexity: O(N)
Auxiliary space: O(1)

Approach 2B:

Efficient Solution can find the minimum two elements in one traversal. Below is the complete algorithm.

Algorithm: 

1. Initialize both first and second smallest as INT_MAX

first = second = INT_MAX

2. Loop through all the elements.

  • If the current element is smaller than first, then update first and second
  • Else if the current element is smaller than second then update second.

Below is the implementation of the above approach:

C

#include <limits.h> /* For INT_MAX */

#include <stdio.h>

void print2Smallest(int arr[], int arr_size)

{

    int i, first, second;

    if (arr_size < 2) {

        printf(" Invalid Input ");

        return;

    }

    first = second = INT_MAX;

    for (i = 0; i < arr_size; i++) {

        if (arr[i] < first) {

            second = first;

            first = arr[i];

        }

        else if (arr[i] < second && arr[i] != first)

            second = arr[i];

    }

    if (second == INT_MAX)

        printf("There is no second smallest elementn");

    else

        printf("The smallest element is %d and second "

               "Smallest element is %dn",

               first, second);

}

int main()

{

    int arr[] = { 12, 13, 1, 10, 34, 1 };

    int n = sizeof(arr) / sizeof(arr[0]);

    print2Smallest(arr, n);

    return 0;

}

C#

using System;

class GFG {

    static void print2Smallest(int[] arr)

    {

        int first, second, arr_size = arr.Length;

        if (arr_size < 2) {

            Console.Write(" Invalid Input ");

            return;

        }

        first = second = int.MaxValue;

        for (int i = 0; i < arr_size; i++) {

            if (arr[i] < first) {

                second = first;

                first = arr[i];

            }

            else if (arr[i] < second && arr[i] != first)

                second = arr[i];

        }

        if (second == int.MaxValue)

            Console.Write("There is no second"

                          + "smallest element");

        else

            Console.Write("The smallest element is " + first

                          + " and second Smallest"

                          + " element is " + second);

    }

    public static void Main()

    {

        int[] arr = { 12, 13, 1, 10, 34, 1 };

        print2Smallest(arr);

    }

}

C++

#include <bits/stdc++.h>

using namespace std;

void print2Smallest(int arr[], int arr_size)

{

    int i, first, second;

    if (arr_size < 2) {

        cout << " Invalid Input ";

        return;

    }

    first = second = INT_MAX;

    for (i = 0; i < arr_size; i++) {

        if (arr[i] < first) {

            second = first;

            first = arr[i];

        }

        else if (arr[i] < second && arr[i] != first)

            second = arr[i];

    }

    if (second == INT_MAX)

        cout << "There is no second smallest elementn";

    else

        cout << "The smallest element is " << first

             << " and second "

                "Smallest element is "

             << second << endl;

}

int main()

{

    int arr[] = { 12, 13, 1, 10, 34, 1 };

    int n = sizeof(arr) / sizeof(arr[0]);

    print2Smallest(arr, n);

    return 0;

}

Java

import java.io.*;

class SecondSmallest {

    static void print2Smallest(int arr[])

    {

        int first, second, arr_size = arr.length;

        if (arr_size < 2) {

            System.out.println(" Invalid Input ");

            return;

        }

        first = second = Integer.MAX_VALUE;

        for (int i = 0; i < arr_size; i++) {

            if (arr[i] < first) {

                second = first;

                first = arr[i];

            }

            else if (arr[i] < second && arr[i] != first)

                second = arr[i];

        }

        if (second == Integer.MAX_VALUE)

            System.out.println("There is no second"

                               + "smallest element");

        else

            System.out.println("The smallest element is "

                               + first

                               + " and second Smallest"

                               + " element is " + second);

    }

    public static void main(String[] args)

    {

        int arr[] = { 12, 13, 1, 10, 34, 1 };

        print2Smallest(arr);

    }

}

Python3

import math

def print2Smallest(arr):

    arr_size = len(arr)

    if arr_size < 2:

        print("Invalid Input")

        return

    first = second = math.inf

    for i in range(0, arr_size):

        if arr[i] < first:

            second = first

            first = arr[i]

        elif (arr[i] < second and arr[i] != first):

            second = arr[i]

    if (second == math.inf):

        print("No second smallest element")

    else:

        print('The smallest element is', first, 'and',

              ' second smallest element is', second)

arr = [12, 13, 1, 10, 34, 1]

print2Smallest(arr)

PHP

<?php

function print2Smallest($arr, $arr_size)

{

    $INT_MAX = 2147483647;

    if ($arr_size < 2)

    {

        echo(" Invalid Input ");

        return;

    }

    $first = $second = $INT_MAX;

    for ($i = 0; $i < $arr_size ; $i ++)

    {

        if ($arr[$i] < $first)

        {

            $second = $first;

            $first = $arr[$i];

        }

        else if ($arr[$i] < $second &&

                 $arr[$i] != $first)

            $second = $arr[$i];

    }

    if ($second == $INT_MAX)

        echo("There is no second smallest elementn");

    else

        echo "The smallest element is ",$first

             ," and second Smallest element is "

                                     , $second;

}

$arr = array(12, 13, 1, 10, 34, 1);

$n = count($arr);

print2Smallest($arr, $n)

?>

Javascript

<script>

function print2Smallest( arr, arr_size)

{

    let i, first, second;

    if (arr_size < 2)

    {

        document.write(" Invalid Input ");

        return;

    }

    first=Number.MAX_VALUE ;

    second=Number.MAX_VALUE ;

    for (i = 0; i < arr_size ; i ++)

    {

        if (arr[i] < first)

        {

            second = first;

            first = arr[i];

        }

        else if (arr[i] < second && arr[i] != first)

            second = arr[i];

    }

    if (second == Number.MAX_VALUE )

        document.write("There is no second smallest elementn");

    else

        document.write("The smallest element is " + first + " and second "+

            "Smallest element is " + second +'n');

}

    let arr = [ 12, 13, 1, 10, 34, 1 ];

    let n = arr.length;

    print2Smallest(arr, n);

</script>

Output

The smallest element is 1 and second Smallest element is 10

The same approach can be used to find the largest and second-largest elements in an array.

Time Complexity: O(n)
Auxiliary Space: O(1)

Approach 3:

A N*log(N) approach using Priority_queue data structure. You can read about Priority Queue in more detail here.

C#

using System;

using System.Collections.Generic;

class GFG {

    static void Main(string[] args)

    {

        int[] arr = { 2, 5, 7, 3, 9, 10, 11, 1 };

        int n = arr.Length;

        PriorityQueue<int> pq = new PriorityQueue<int>();

        for (int i = 0; i < n; i++) {

            pq.Enqueue(arr[i]);

        }

        int t = pq.Peek();

        pq.Dequeue();

        int w = pq.Peek();

        Console.WriteLine("smallest element : " + t);

        Console.WriteLine("second smallest element : " + w);

    }

}

public class PriorityQueue<T> where T : IComparable<T> {

    private List<T> data;

    public PriorityQueue() { this.data = new List<T>(); }

    public void Enqueue(T item)

    {

        data.Add(item);

        int ci = data.Count - 1;

        while (ci > 0) {

            int pi = (ci - 1) / 2;

            if (data[ci].CompareTo(data[pi]) >= 0)

                break;

            T tmp = data[ci];

            data[ci] = data[pi];

            data[pi] = tmp;

            ci = pi;

        }

    }

    public T Dequeue()

    {

        int li = data.Count - 1;

        T frontItem = data[0];

        data[0] = data[li];

        data.RemoveAt(li);

        --li;

        int pi = 0;

        while (true) {

            int ci = pi * 2 + 1;

            if (ci > li)

                break;

            int rc = ci + 1;

            if (rc <= li

                && data[rc].CompareTo(data[ci]) < 0)

                ci = rc;

            if (data[pi].CompareTo(data[ci]) <= 0)

                break;

            T tmp = data[pi];

            data[pi] = data[ci];

            data[ci] = tmp;

            pi = ci;

        }

        return frontItem;

    }

    public T Peek()

    {

        T frontItem = data[0];

        return frontItem;

    }

    public int Count

    {

        get { return data.Count; }

    }

}

C++

#include <bits/stdc++.h>

using namespace std;

int main()

{

    int arr[] = { 2, 5, 7, 3, 9, 10, 11, 1 };

    int n = sizeof(arr) / sizeof(arr[0]);

    priority_queue<int, vector<int>, greater<int> >

        pq;

    for (int i = 0; i < n; i++) {

        pq.push(arr[i]);

    }

    int t = pq.top();

    pq.pop();

    int w = pq.top();

    cout << "smallest element : " << t << endl;

    cout << "second smallest element : " << w << endl;

    return 0;

}

Java

import java.util.*;

class GFG {

    public static void main(String[] args)

    {

        int arr[] = { 2, 5, 7, 3, 9, 10, 11, 1 };

        int n = arr.length;

        PriorityQueue<Integer> pq

            = new PriorityQueue<Integer>();

        for (int i = 0; i < n; i++) {

            pq.add(arr[i]);

        }

        int t = pq.peek();

        pq.poll();

        int w = pq.peek();

        System.out.println("smallest element : " + t);

        System.out.println("second smallest element : "

                           + w);

    }

}

Python3

from queue import PriorityQueue

arr = [2, 5, 7, 3, 9, 10, 11, 1]

n = len(arr)

pq = PriorityQueue()

for i in range(0, n):

    pq.put(arr[i])

t = pq.get() 

w = pq.get()

print("smallest element :", t)

print("second smallest element :", w)

Javascript

class PriorityQueue {

  constructor() {

    this.values = [];

  }

  enqueue(val, priority) {

    this.values.push({ val, priority });

    this.sort();

  }

  dequeue() {

    return this.values.shift();

  }

  sort() {

    this.values.sort((a, b) => a.priority - b.priority);

  }

  get top() {

    return this.values[0].val;

  }

  get secondTop() {

    return this.values[1].val;

  }

}

const arr = [2, 5, 7, 3, 9, 10, 11, 1];

const pq = new PriorityQueue();

for (let i = 0; i < arr.length; i++) {

  pq.enqueue(arr[i], arr[i]);

}

const t = pq.top;

pq.dequeue();

const w = pq.top;

console.log("smallest element: ", t);

console.log("second smallest element: ", w);

Output

smallest element : 1
second smallest element : 2

Time Complexity: O(n*log(n))
In a priority queue time for adding each element is O(logn) and we are adding all the elements so the total time taken by the priority queue will be O(n*logn)

Auxiliary Space: O(n)

The extra space is used to store the elements in the priority queue.

Related Article: Minimum and Second minimum elements using minimum comparisons

Approach 4: Using list properties

Algorithm:

  • Step 1: Declare a  new list
  • Step 2: Check length of the original list is more than 2 or not.
  • Step 3: Append the smallest element from the original list into new list.
  • Step 4: Count the number times smallest element appeared in the original list, then run a loop to remove all the smallest elements from the original list.
  • Step 5: After removing all smallest elements, now find for 2nd smallest element using min function.
  • Step 6: return new list which contains the smallest element and 2nd smallest element.

Example:

C++

#include <bits/stdc++.h>

using namespace std;

vector<int> print2Smallest(vector<int> arr)

{

    vector<int> lst;

    if (unordered_set<int>(arr.begin(), arr.end()).size()

        == 1) {

        return { -1, -1 };

    }

    lst.push_back(*min_element(

        arr.begin(), arr.end()));

    int p = *min_element(arr.begin(),

                         arr.end());

    int c = count(arr.begin(), arr.end(),

                  p);

    arr.erase(

        remove(arr.begin(), arr.end(), p),

        arr.end());

    lst.push_back(*min_element(

        arr.begin(),

        arr.end()));

    return lst;

}

int main()

{

    vector<int> arr = { 12, 13, 1, 10, 34, 1 };

    vector<int> res = print2Smallest(arr);

    for (int i = 0; i < res.size(); i++) {

        cout << res[i] << " ";

    }

    return 0;

}

Java

import java.util.*;

public class Main {

    public static List<Integer>

    print2Smallest(List<Integer> arr)

    {

        List<Integer> lst

            = new ArrayList<>();

        if (new HashSet<Integer>(arr).size()

            == 1) {

            return Arrays.asList(-1, -1);

        }

        lst.add(Collections.min(

            arr));

        int p = Collections.min(arr);

        int c = Collections.frequency(

            arr, p);

        arr.removeAll(Collections.singleton(

            p));

        lst.add(Collections.min(

            arr));

        return lst;

    }

    public static void main(String[] args)

    {

        List<Integer> arr = new ArrayList<>(

            Arrays.asList(12, 13, 1, 10, 34, 1));

        List<Integer> res = print2Smallest(arr);

        for (int i = 0; i < res.size(); i++) {

            System.out.print(res.get(i) + " ");

        }

    }

}

Python3

def print2Smallest(arr):

    lst = [] 

    if len(set(arr)) == 1

        return [-1, -1]           

    lst.append(min(arr)) 

    p = min(arr) 

    c = arr.count(p) 

    for i in range(c):

        arr.remove(p)             

    lst.append(min(arr)) 

    return lst

arr = [12, 13, 1, 10, 34, 1]

print(print2Smallest(arr))

Javascript

function print2Smallest(arr) {

  let lst = [];

  if (new Set(arr).size === 1) {

    return [-1, -1];

  }

  lst.push(Math.min(...arr));

  let p = Math.min(...arr);

  let c = arr.filter((el) => el === p).length;

  for (let i = 0; i < c; i++) {

    arr.splice(arr.indexOf(p), 1);

  }

  lst.push(Math.min(...arr));

  return lst;

}

let arr = [12, 13, 1, 10, 34, 1];

console.log(print2Smallest(arr));

C#

using System;

using System.Collections.Generic;

using System.Linq;

public class MainClass {

    public static List<int> Print2Smallest(List<int> arr) {

        List<int> lst = new List<int>();

        if (new HashSet<int>(arr).Count == 1) {

            return new List<int> {-1, -1};

        }

        lst.Add(arr.Min());

        int p = arr.Min();

        int c = arr.Count(x => x == p);

        arr.RemoveAll(x => x == p);

        lst.Add(arr.Min());

        return lst;

    }

    public static void Main() {

        List<int> arr = new List<int>{12, 13, 1, 10, 34, 1};

        List<int> res = Print2Smallest(arr);

        foreach (int i in res) {

            Console.Write(i + " ");

        }

    }

}

Time Complexity: O(N)
Auxiliary Space: O(1)

Please write comments if you find any bug in the above program/algorithm or other ways to solve the same problem.

Last Updated :
13 Apr, 2023

Like Article

Save Article

Необходимо найти два min значения в массиве случайных числе.
Код написан под swift.

var list = [Int] ()
var n: Int = 8

for i in 1...n
{
   let list = Int(arc4random_uniform(70))
   print (list)
}

func getMin1Min2(numbers:Int...) -> (min1:Int, min2:Int)
{
var min1 = numbers[0]
var min2 = numbers[0]

for number in numbers
{
if number < min1 {min1 = number}

Дальше попытка найти 2-ое минимальное значение, но увы

if number > min1
        {if number < min2
            {min2 = number}
        }
}
return (min1, min2)
}

завершаться задача должна поиском двух мин. значений в рандомном массиве, но увы не знаю как использовать созданный массив и функцию …

var value = getMin1Min2 (list)

задан 28 мая 2016 в 18:08

mrSpaceDandy's user avatar

1

Для начала, Вы не заполняете массив. Вот создаете массив:

let n = 8
var arr = [Int]()
for _ in 0..<n {
    arr.append(Int(arc4random_uniform(70)))
}
print(arr)

Далее ищете 2 минимальных элемента в массиве, предлагаю просто отсортировать массив по возрастанию и возвращать первые 2 элемента:

func getMin1Min2(numbers:[Int]) -> (min1:Int, min2:Int){
    let sortedNumbers = numbers.sort({$0 < $1})
    return sortedNumbers.count > 1 ? (sortedNumbers[0], sortedNumbers[1]) : (sortedNumbers[0], sortedNumbers[0])
}

И проверка:

print(getMin1Min2(arr))

ответ дан 29 мая 2016 в 5:05

VAndrJ's user avatar

VAndrJVAndrJ

15.8k1 золотой знак18 серебряных знаков35 бронзовых знаков

Вариант 1: сделай копию массива, найди в нем минимум и удали его. Потом найди минимум еще раз.
Для не очень больших массивов подойдет.

Вариант 2: находишь первый минимум (запоминаешь его индекс).
Еще раз ищешь минимум в массиве, но уже не сравниваешь элемент с найденным индексом.

var myMin = MAX_INT
for i in 0..myArray.count {
    if (myArray[i] < myMin && i != indexOfFirstMin ){
        myMin = myArray[i]
    }
}

Denis's user avatar

Denis

8,86010 золотых знаков30 серебряных знаков55 бронзовых знаков

ответ дан 14 июн 2016 в 12:18

Валентин's user avatar

ВалентинВалентин

1,1056 серебряных знаков6 бронзовых знаков

0

Студворк — интернет-сервис помощи студентам

Уважаемые программисты!,помогите, пожалуйста, з задачей,срочно нужно…я уже просил об этом в предыдущей теме ,но никто так и робочего кода не выложил.
Задача такая : найти 2 минимума в массиве А с N элементов.(Пример в массиве А(-1,4,0,3,12,6) – это будут -1 и 0)
вот мой код :

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
program n20;
var
a:array[1..100] of integer;
i,min1,min2,n:integer;
begin
writeln('vvedit rozmir massiva');
readln(n);
randomize;
writeln('massiv');
for i:=1 to n do begin
a[i]:=random(100)-50;
write(a[i],' ');
end;
writeln;
min1:=a[1];
for i:=n downto 2 do
if (min1>a[i]) xor (min1=min2) then begin
min2:=min1;
min1:=a[i];
end;
writeln('1 minimalnyj element ',min1);
writeln('2 minimalnyj element ',min2);
end.

но цикл обработывает только те элементы,которые правее 1 максимуму,то есть если 2 максимум по индексу левее 1 максимума,оно эго не выводит
помогите переделать алгоритм ,или если ошибки критичны сделать иный,буду очень признателен.

Добавлено через 2 минуты
п.с если цикл for i:=n downto do 1 заменить на for i:=1 to n do ,то цикл будет проходить только элементы до 1 максимума

Найти первый, второй и третий минимальные элементы в массиве

30.12.2019Массивы, Поиск, Школьное программирование

Найти первый, второй и третий минимальные элементы в массиве в O (n).

Примеры:

Input : 9 4 12 6
Output : First min = 4
         Second min = 6
         Third min = 9

Input : 4 9 1 32 12
Output : First min = 1
         Second min = 4
         Third min = 9

Первый подход : сначала мы можем использовать обычный метод, который сортирует массив, а затем печатать первый, второй и третий элемент массива. Временная сложность этого решения составляет O (n Log n).

Второй подход : временная сложность этого решения O (n).

Алгоритм-

First take an element
then if array[index] < Firstelement
        Thirdelement = Secondelement
        Secondelement = Firstelement
        Firstelement = array[index]
     else if array[index] < Secondelement
        Thirdelement = Secondelement
        Secondelement = array[index]
     else if array[index] < Thirdelement
        Thirdelement = array[index]

then print all the element 

C ++

#include<iostream>
#define MAX 100000

using namespace std;

int Print3Smallest(int array[], int n)

{

    int firstmin = MAX, secmin = MAX, thirdmin = MAX;

    for (int i = 0; i < n; i++)

    {

        if (array[i] < firstmin)

        {

            thirdmin = secmin;

            secmin = firstmin;

            firstmin = array[i];

        }

        else if (array[i] < secmin)

        {

            thirdmin = secmin;

            secmin = array[i];

        }

        else if (array[i] < thirdmin)

            thirdmin = array[i];

    }

    cout << "First min = " << firstmin << "n";

    cout << "Second min = " << secmin << "n";

    cout << "Third min = " << thirdmin << "n";

}

int main()

{

    int array[] = {4, 9, 1, 32, 12};

    int n = sizeof(array) / sizeof(array[0]);

    Print3Smallest(array, n);

    return 0;

}

Джава

import java.util.*;

public class GFG

{

    static void Print3Smallest(int array[], int n)

    {

            int firstmin = Integer.MAX_VALUE;

            int secmin = Integer.MAX_VALUE; 

            int thirdmin = Integer.MAX_VALUE;

            for (int i = 0; i < n; i++)

            {

                if (array[i] < firstmin)

                {

                    thirdmin = secmin;

                    secmin = firstmin;

                    firstmin = array[i];

                }

                else if (array[i] < secmin)

                {

                    thirdmin = secmin;

                    secmin = array[i];

                }

                else if (array[i] < thirdmin)

                    thirdmin = array[i];

            }

            System.out.println("First min = " + firstmin );

            System.out.println("Second min = " + secmin );

            System.out.println("Third min = " + thirdmin );

    }

    public static void main(String[] args)

    {

            int array[] = {4, 9, 1, 32, 12};

            int n = array.length;

            Print3Smallest(array, n);

    }

      
}

python3

MAX = 100000

def Print3Smallest(arr, n):

    firstmin = MAX

    secmin = MAX

    thirdmin = MAX

    for i in range(0, n):

        if arr[i] < firstmin:

            thirdmin = secmin

            secmin = firstmin

            firstmin = arr[i]

        elif arr[i] < secmin:

            thirdmin = secmin

            secmin = arr[i]

        elif arr[i] < thirdmin:

            thirdmin = arr[i]

    print("First min = ", firstmin)

    print("Second min = ", secmin)

    print("Third min = ", thirdmin)

arr = [4, 9, 1, 32, 12]

n = len(arr)

Print3Smallest(arr, n)

C #

using System;

class GFG

{

static void Print3Smallest(int []array, int n)

    {

            int firstmin = int.MaxValue;

            int secmin = int.MaxValue; 

            int thirdmin = int.MaxValue;

            for (int i = 0; i < n; i++)

            {

                if (array[i] < firstmin)

                {

                    thirdmin = secmin;

                    secmin = firstmin;

                    firstmin = array[i];

                }

                else if (array[i] < secmin)

                {

                    thirdmin = secmin;

                    secmin = array[i];

                }

                else if (array[i] < thirdmin)

                    thirdmin = array[i];

            }

            Console.WriteLine("First min = " + firstmin );

            Console.WriteLine("Second min = " + secmin );

            Console.WriteLine("Third min = " + thirdmin );

    }

    static void Main()

    {

    int []array = new int[]{4, 9, 1, 32, 12};

    int n = array.Length;

    Print3Smallest(array, n);

    }

}

PHP

<?php

function Print3Smallest($array, $n)

{

    $MAX = 100000;

    $firstmin = $MAX;

    $secmin = $MAX;

    $thirdmin = $MAX;

    for ($i = 0; $i < $n; $i++)

    {

        if ($array[$i] < $firstmin)

        {

            $thirdmin = $secmin;

            $secmin = $firstmin;

            $firstmin = $array[$i];

        }

        else if ($array[$i] < $secmin)

        {

            $thirdmin = $secmin;

            $secmin = $array[$i];

        }

        else if ($array[$i] < $thirdmin)

            $thirdmin = $array[$i];

    }

    echo "First min = ".$firstmin."n";

    echo "Second min = ".$secmin."n";

    echo "Third min = ".$thirdmin."n";

}

    $array= array(4, 9, 1, 32, 12);

    $n = sizeof($array) / sizeof($array[0]);

    Print3Smallest($array, $n);

  

?>

Выход:

First min = 1
Second min = 4
Third min = 9

Рекомендуемые посты:

  • Найдите минимальное значение, чтобы назначить все элементы массива, чтобы произведение массива стало больше
  • Найти минимальные изменения, необходимые в массиве, чтобы он содержал k различных элементов
  • Рекурсивные программы для поиска минимальных и максимальных элементов массива
  • Найдите минимальное количество элементов, которые должны быть удалены, чтобы сделать массив хорошим
  • Найти минимальное количество операций, необходимых для выравнивания всех элементов массива
  • Отразите минимальные знаки элементов массива, чтобы получить минимально возможную сумму положительных элементов
  • Найти исходный массив из зашифрованного массива (массив сумм других элементов)
  • Найти элементы больше, чем половина элементов в массиве
  • Сумма всех минимально встречающихся элементов в массиве
  • Минимальное значение среди AND элементов каждого подмножества массива
  • Удалите минимальные элементы из массива так, чтобы max <= 2 * min
  • Удалите минимальные элементы из массива, так что 2 * min станет больше, чем max
  • Найти минимальную разницу между любыми двумя элементами
  • Найти минимальные элементы после рассмотрения всех возможных преобразований
  • Найдите минимальную сумму, такую, чтобы был взят один из каждых трех последовательных элементов

Найти первый, второй и третий минимальные элементы в массиве

0.00 (0%) 0 votes

Добавить комментарий