📜  查找数组中的第二大元素

📅  最后修改于: 2022-05-13 01:57:46.904000             🧑  作者: Mango

查找数组中的第二大元素

给定一个整数数组,我们的任务是编写一个程序来有效地找到数组中的第二大元素。
例子:

Input: arr[] = {12, 35, 1, 10, 34, 1}
Output: The second largest element is 34.
Explanation: The largest element of the 
array is 35 and the second 
largest element is 34

Input: arr[] = {10, 5, 10}
Output: The second largest element is 5.
Explanation: The largest element of 
the array is 10 and the second 
largest element is 5

Input: arr[] = {10, 10, 10}
Output: The second largest does not exist.
Explanation: Largest element of the array 
is 10 there is no second largest element

简单的解决方案
方法:想法是对数组进行降序排序,然后从排序后的数组中返回不等于最大元素的第二个元素。

C++14
// C++ program to find second largest
// element in an array
 
#include 
using namespace std;
 
/* Function to print the second largest elements */
void print2largest(int arr[], int arr_size)
{
    int i, first, second;
 
    /* There should be atleast two elements */
    if (arr_size < 2) {
        printf(" Invalid Input ");
        return;
    }
 
    // sort the array
    sort(arr, arr + arr_size);
 
    // start from second last element
    // as the largest element is at last
    for (i = arr_size - 2; i >= 0; i--) {
        // if the element is not
        // equal to largest element
        if (arr[i] != arr[arr_size - 1]) {
            printf("The second largest element is %d\n", arr[i]);
            return;
        }
    }
 
    printf("There is no second largest element\n");
}
 
/* Driver program to test above function */
int main()
{
    int arr[] = { 12, 35, 1, 10, 34, 1 };
    int n = sizeof(arr) / sizeof(arr[0]);
    print2largest(arr, n);
    return 0;
}


Java
// Java program to find second largest
// element in an array
import java.util.*;
class GFG{
 
// Function to print the
// second largest elements
static void print2largest(int arr[],
                          int arr_size)
{
  int i, first, second;
 
  // There should be
  // atleast two elements
  if (arr_size < 2)
  {
    System.out.printf(" Invalid Input ");
    return;
  }
 
  // Sort the array
  Arrays.sort(arr);
 
  // Start from second last element
  // as the largest element is at last
  for (i = arr_size - 2; i >= 0; i--)
  {
    // If the element is not
    // equal to largest element
    if (arr[i] != arr[arr_size - 1])
    {
      System.out.printf("The second largest " +
                        "element is %d\n", arr[i]);
      return;
    }
  }
 
  System.out.printf("There is no second " +
                    "largest element\n");
}
 
// Driver code
public static void main(String[] args)
{
  int arr[] = {12, 35, 1, 10, 34, 1};
  int n = arr.length;
  print2largest(arr, n);
}
}
 
// This code is contributed by gauravrajput1


Python3
# Python3 program to find second
# largest element in an array
 
# Function to print the
# second largest elements
def print2largest(arr,
                  arr_size):
  
  # There should be
  # atleast two elements
  if (arr_size < 2):  
    print(" Invalid Input ")
    return
  
  # Sort the array
  arr.sort
  
  # Start from second last
  # element as the largest
  # element is at last
  for i in range(arr_size-2,
                 -1, -1):
  
    # If the element is not
    # equal to largest element
    if (arr[i] != arr[arr_size - 1]) :
     
      print("The second largest element is",
            arr[i])
      return
  
  print("There is no second largest element")
 
# Driver code
arr = [12, 35, 1, 10, 34, 1]
n = len(arr)
print2largest(arr, n)
 
# This code is contributed by divyeshrabadiya07


C#
// C# program to find second largest
// element in an array
using System;
 
class GFG{
 
// Function to print the
// second largest elements
static void print2largest(int []arr,
                          int arr_size)
{
  int i;
 
  // There should be
  // atleast two elements
  if (arr_size < 2)
  {
    Console.Write(" Invalid Input ");
    return;
  }
 
  // Sort the array
  Array.Sort(arr);
 
  // Start from second last element
  // as the largest element is at last
  for(i = arr_size - 2; i >= 0; i--)
  {
       
    // If the element is not
    // equal to largest element
    if (arr[i] != arr[arr_size - 1])
    {
      Console.Write("The second largest " +
                    "element is {0}\n", arr[i]);
      return;
    }
  }
 
  Console.Write("There is no second " +
                "largest element\n");
}
 
// Driver code
public static void Main(String[] args)
{
  int []arr = { 12, 35, 1, 10, 34, 1 };
  int n = arr.Length;
   
  print2largest(arr, n);
}
}
 
// This code is contributed by Amit Katiyar


Javascript


C++14
// C++ program to find the second largest element in the array
#include 
using namespace std;
 
 
int secondLargest(int arr[], int n) {
    int largest = 0, secondLargest = -1;
 
    // finding the largest element in the array
    for (int i = 1; i < n; i++) {
        if (arr[i] > arr[largest])
            largest = i;
    }
 
    // finding the largest element in the array excluding
    // the largest element calculated above
    for (int i = 0; i < n; i++) {
        if (arr[i] != arr[largest]) {
            // first change the value of second largest
            // as soon as the next element is found
            if (secondLargest == -1)
                secondLargest = i;
            else if (arr[i] > arr[secondLargest])
                secondLargest = i;
        }
    }
    return secondLargest;
}
 
 
int main() {
    int arr[] = {10, 12, 20, 4};
    int n = sizeof(arr)/sizeof(arr[0]);
    int second_Largest = secondLargest(arr, n);
    if (second_Largest == -1)
        cout << "Second largest didn't exit\n";
    else
        cout << "Second largest : " << arr[second_Largest];
}


Java
// Java program to find second largest
// element in an array
class GFG{
 
// Function to print the second largest elements
static void print2largest(int arr[], int arr_size)
{
    int i, first, second;
 
    // There should be atleast two elements
    if (arr_size < 2)
    {
        System.out.printf(" Invalid Input ");
        return;
    }
 
    int largest = second = Integer.MIN_VALUE;
 
    // Find the largest element
    for(i = 0; i < arr_size; i++)
    {
        largest = Math.max(largest, arr[i]);
    }
 
    // Find the second largest element
    for(i = 0; i < arr_size; i++)
    {
        if (arr[i] != largest)
            second = Math.max(second, arr[i]);
    }
    if (second == Integer.MIN_VALUE)
        System.out.printf("There is no second " +
                          "largest element\n");
    else
        System.out.printf("The second largest " +
                          "element is %d\n", second);
}
 
// Driver code
public static void main(String[] args)
{
    int arr[] = { 12, 35, 1, 10, 34, 1 };
    int n = arr.length;
     
    print2largest(arr, n);
}
}
 
// This code is contributed by Amit Katiyar


Python3
# Python3 program to find
# second largest element
# in an array
 
# Function to print
# second largest elements
def print2largest(arr, arr_size):
 
    # There should be atleast
    # two elements
    if (arr_size < 2):
        print(" Invalid Input ");
        return;
 
    largest = second = -2454635434;
 
    # Find the largest element
    for i in range(0, arr_size):
        largest = max(largest, arr[i]);
 
    # Find the second largest element
    for i in range(0, arr_size):
        if (arr[i] != largest):
            second = max(second, arr[i]);
 
    if (second == -2454635434):
        print("There is no second " +
              "largest element");
    else:
        print("The second largest " +
              "element is \n", second);
 
# Driver code
if __name__ == '__main__':
   
    arr = [12, 35, 1,
           10, 34, 1];
    n = len(arr);
    print2largest(arr, n);
 
# This code is contributed by shikhasingrajput


C#
// C# program to find second largest
// element in an array
using System;
 
class GFG{
 
// Function to print the second largest elements
static void print2largest(int []arr, int arr_size)
{
    // int first;
    int i, second;
 
    // There should be atleast two elements
    if (arr_size < 2)
    {
        Console.Write(" Invalid Input ");
        return;
    }
 
    int largest = second = int.MinValue;
 
    // Find the largest element
    for(i = 0; i < arr_size; i++)
    {
        largest = Math.Max(largest, arr[i]);
    }
 
    // Find the second largest element
    for(i = 0; i < arr_size; i++)
    {
        if (arr[i] != largest)
            second = Math.Max(second, arr[i]);
    }
     
    if (second == int.MinValue)
        Console.Write("There is no second " +
                      "largest element\n");
    else
        Console.Write("The second largest " +
                      "element is {0}\n", second);
}
 
// Driver code
public static void Main(String[] args)
{
    int []arr = { 12, 35, 1, 10, 34, 1 };
    int n = arr.Length;
     
    print2largest(arr, n);
}
}
 
// This code is contributed by Amit Katiyar


Javascript


C
// C program to find second largest
// element in an array
 
#include 
#include 
 
/* Function to print the second largest elements */
void print2largest(int arr[], int arr_size)
{
    int i, first, second;
 
    /* There should be atleast two elements */
    if (arr_size < 2) {
        printf(" Invalid Input ");
        return;
    }
 
    first = second = INT_MIN;
    for (i = 0; i < arr_size; i++) {
        /* If current element is greater than first
           then update both first and second */
        if (arr[i] > first) {
            second = first;
            first = arr[i];
        }
 
        /* If arr[i] is in between first and
           second then update second  */
        else if (arr[i] > second && arr[i] != first)
            second = arr[i];
    }
    if (second == INT_MIN)
        printf("There is no second largest element\n");
    else
        printf("The second largest element is %d", second);
}
 
/* Driver program to test above function */
int main()
{
    int arr[] = { 12, 35, 1, 10, 34, 1 };
    int n = sizeof(arr) / sizeof(arr[0]);
    print2largest(arr, n);
    return 0;
}


C++
// C++ program to find the second largest element
 
#include 
using namespace std;
 
// returns the index of second largest
// if second largest didn't exist return -1
int secondLargest(int arr[], int n) {
    int first = 0, second = -1;
    for (int i = 1; i < n; i++) {
        if (arr[i] > arr[first]) {
            second = first;
            first = i;
        }
        else if (arr[i] < arr[first]) {
            if (second == -1 || arr[second] < arr[i])
                second = i;
        }
    }
    return second;
}
 
int main() {
    int arr[] = {10, 12, 20, 4};
    int index = secondLargest(arr, sizeof(arr)/sizeof(arr[0]));
    if (index == -1)
        cout << "Second Largest didn't exist";
    else
        cout << "Second largest : " << arr[index];
}


Java
// JAVA Code for Find Second largest
// element in an array
class GFG {
 
    /* Function to print the second largest
    elements */
    public static void print2largest(int arr[],
                                     int arr_size)
    {
        int i, first, second;
 
        /* There should be atleast two elements */
        if (arr_size < 2) {
            System.out.print(" Invalid Input ");
            return;
        }
 
        first = second = Integer.MIN_VALUE;
        for (i = 0; i < arr_size; i++) {
            /* If current element is greater than
            first then update both first and second */
            if (arr[i] > first) {
                second = first;
                first = arr[i];
            }
 
            /* If arr[i] is in between first and
               second then update second  */
            else if (arr[i] > second && arr[i] != first)
                second = arr[i];
        }
 
        if (second == Integer.MIN_VALUE)
            System.out.print("There is no second largest"
                             + " element\n");
        else
            System.out.print("The second largest element"
                             + " is " + second);
    }
 
    /* Driver program to test above function */
    public static void main(String[] args)
    {
        int arr[] = { 12, 35, 1, 10, 34, 1 };
        int n = arr.length;
        print2largest(arr, n);
    }
}
// This code is contributed by Arnav Kr. Mandal.


Python3
# Python program to
# find second largest
# element in an array
 
 
# Function to print the
# second largest elements
def print2largest(arr, arr_size):
 
    # There should be atleast
        # two elements
    if (arr_size < 2):
     
        print(" Invalid Input ")
        return
     
 
    first = second = -2147483648
    for i in range(arr_size):
     
        # If current element is
                # smaller than first
        # then update both
                # first and second
        if (arr[i] > first):
         
            second = first
            first = arr[i]
         
 
        # If arr[i] is in
                # between first and
        # second then update second
        elif (arr[i] > second and arr[i] != first):
            second = arr[i]
     
    if (second == -2147483648):
        print("There is no second largest element")
    else:
        print("The second largest element is", second)
 
 
# Driver program to test
# above function
arr = [12, 35, 1, 10, 34, 1]
n = len(arr)
 
print2largest(arr, n)
 
# This code is contributed
# by Anant Agarwal.


C#
// C# Code for Find Second largest
// element in an array
using System;
 
class GFG {
 
    // Function to print the
    // second largest elements
    public static void print2largest(int[] arr,
                                     int arr_size)
    {
        int i, first, second;
 
        // There should be atleast two elements
        if (arr_size < 2) {
            Console.WriteLine(" Invalid Input ");
            return;
        }
 
        first = second = int.MinValue;
        for (i = 0; i < arr_size; i++) {
            // If current element is smaller than
            // first then update both first and second
            if (arr[i] > first) {
                second = first;
                first = arr[i];
            }
 
            // If arr[i] is in between first
            // and second then update second
            else if (arr[i] > second && arr[i] != first)
                second = arr[i];
        }
 
        if (second == int.MinValue)
            Console.Write("There is no second largest"
                          + " element\n");
        else
            Console.Write("The second largest element"
                          + " is " + second);
    }
 
    // Driver Code
    public static void Main(String[] args)
    {
        int[] arr = { 12, 35, 1, 10, 34, 1 };
        int n = arr.Length;
        print2largest(arr, n);
    }
}
 
// This code is contributed by Parashar.


PHP
 $first)
        {
            $second = $first;
            $first = $arr[$i];
        }
 
        // If arr[i] is in
        // between first and
        // second then update
        // second
        else if ($arr[$i] > $second &&
                 $arr[$i] != $first)
            $second = $arr[$i];
    }
    if ($second == PHP_INT_MIN)
        echo("There is no second largest element\n");
    else
        echo("The second largest element is " . $second . "\n");
}
 
// Driver Code
$arr = array(12, 35, 1, 10, 34, 1);
$n = sizeof($arr);
print2largest($arr, $n);
 
// This code is contributed by Ajit.
?>


Javascript


输出
The second largest element is 34

复杂性分析:

  • 时间复杂度: O(n log n)。
    对数组进行排序所需的时间是 O(n log n)。
  • 辅助空间: O(1)。
    因为不需要额外的空间。

更好的解决方案:
方法:方法是遍历数组两次。

在第一次遍历中找到最大元素。

在第二次遍历中找到剩余的最大元素,不包括前一个最大元素。

C++14

// C++ program to find the second largest element in the array
#include 
using namespace std;
 
 
int secondLargest(int arr[], int n) {
    int largest = 0, secondLargest = -1;
 
    // finding the largest element in the array
    for (int i = 1; i < n; i++) {
        if (arr[i] > arr[largest])
            largest = i;
    }
 
    // finding the largest element in the array excluding
    // the largest element calculated above
    for (int i = 0; i < n; i++) {
        if (arr[i] != arr[largest]) {
            // first change the value of second largest
            // as soon as the next element is found
            if (secondLargest == -1)
                secondLargest = i;
            else if (arr[i] > arr[secondLargest])
                secondLargest = i;
        }
    }
    return secondLargest;
}
 
 
int main() {
    int arr[] = {10, 12, 20, 4};
    int n = sizeof(arr)/sizeof(arr[0]);
    int second_Largest = secondLargest(arr, n);
    if (second_Largest == -1)
        cout << "Second largest didn't exit\n";
    else
        cout << "Second largest : " << arr[second_Largest];
}

Java

// Java program to find second largest
// element in an array
class GFG{
 
// Function to print the second largest elements
static void print2largest(int arr[], int arr_size)
{
    int i, first, second;
 
    // There should be atleast two elements
    if (arr_size < 2)
    {
        System.out.printf(" Invalid Input ");
        return;
    }
 
    int largest = second = Integer.MIN_VALUE;
 
    // Find the largest element
    for(i = 0; i < arr_size; i++)
    {
        largest = Math.max(largest, arr[i]);
    }
 
    // Find the second largest element
    for(i = 0; i < arr_size; i++)
    {
        if (arr[i] != largest)
            second = Math.max(second, arr[i]);
    }
    if (second == Integer.MIN_VALUE)
        System.out.printf("There is no second " +
                          "largest element\n");
    else
        System.out.printf("The second largest " +
                          "element is %d\n", second);
}
 
// Driver code
public static void main(String[] args)
{
    int arr[] = { 12, 35, 1, 10, 34, 1 };
    int n = arr.length;
     
    print2largest(arr, n);
}
}
 
// This code is contributed by Amit Katiyar

Python3

# Python3 program to find
# second largest element
# in an array
 
# Function to print
# second largest elements
def print2largest(arr, arr_size):
 
    # There should be atleast
    # two elements
    if (arr_size < 2):
        print(" Invalid Input ");
        return;
 
    largest = second = -2454635434;
 
    # Find the largest element
    for i in range(0, arr_size):
        largest = max(largest, arr[i]);
 
    # Find the second largest element
    for i in range(0, arr_size):
        if (arr[i] != largest):
            second = max(second, arr[i]);
 
    if (second == -2454635434):
        print("There is no second " +
              "largest element");
    else:
        print("The second largest " +
              "element is \n", second);
 
# Driver code
if __name__ == '__main__':
   
    arr = [12, 35, 1,
           10, 34, 1];
    n = len(arr);
    print2largest(arr, n);
 
# This code is contributed by shikhasingrajput

C#

// C# program to find second largest
// element in an array
using System;
 
class GFG{
 
// Function to print the second largest elements
static void print2largest(int []arr, int arr_size)
{
    // int first;
    int i, second;
 
    // There should be atleast two elements
    if (arr_size < 2)
    {
        Console.Write(" Invalid Input ");
        return;
    }
 
    int largest = second = int.MinValue;
 
    // Find the largest element
    for(i = 0; i < arr_size; i++)
    {
        largest = Math.Max(largest, arr[i]);
    }
 
    // Find the second largest element
    for(i = 0; i < arr_size; i++)
    {
        if (arr[i] != largest)
            second = Math.Max(second, arr[i]);
    }
     
    if (second == int.MinValue)
        Console.Write("There is no second " +
                      "largest element\n");
    else
        Console.Write("The second largest " +
                      "element is {0}\n", second);
}
 
// Driver code
public static void Main(String[] args)
{
    int []arr = { 12, 35, 1, 10, 34, 1 };
    int n = arr.Length;
     
    print2largest(arr, n);
}
}
 
// This code is contributed by Amit Katiyar

Javascript


输出
Second largest : 12

复杂性分析:

  • 时间复杂度: O(n)。
    需要对数组进行两次遍历。
  • 辅助空间: O(1)。
    因为不需要额外的空间。

高效的解决方案
方法:在一次遍历中找到第二大元素。
以下是执行此操作的完整算法:

1) Initialize the first as 0(i.e, index of arr[0] element
2) Start traversing the array from array[1],
   a) If the current element in array say arr[i] is greater
      than first. Then update first and second as,
      second = first
      first = arr[i]
   b) If the current element is in between first and second,
      then update second to store the value of current variable as
      second = arr[i]
3) Return the value stored in second.

C

// C program to find second largest
// element in an array
 
#include 
#include 
 
/* Function to print the second largest elements */
void print2largest(int arr[], int arr_size)
{
    int i, first, second;
 
    /* There should be atleast two elements */
    if (arr_size < 2) {
        printf(" Invalid Input ");
        return;
    }
 
    first = second = INT_MIN;
    for (i = 0; i < arr_size; i++) {
        /* If current element is greater than first
           then update both first and second */
        if (arr[i] > first) {
            second = first;
            first = arr[i];
        }
 
        /* If arr[i] is in between first and
           second then update second  */
        else if (arr[i] > second && arr[i] != first)
            second = arr[i];
    }
    if (second == INT_MIN)
        printf("There is no second largest element\n");
    else
        printf("The second largest element is %d", second);
}
 
/* Driver program to test above function */
int main()
{
    int arr[] = { 12, 35, 1, 10, 34, 1 };
    int n = sizeof(arr) / sizeof(arr[0]);
    print2largest(arr, n);
    return 0;
}

C++

// C++ program to find the second largest element
 
#include 
using namespace std;
 
// returns the index of second largest
// if second largest didn't exist return -1
int secondLargest(int arr[], int n) {
    int first = 0, second = -1;
    for (int i = 1; i < n; i++) {
        if (arr[i] > arr[first]) {
            second = first;
            first = i;
        }
        else if (arr[i] < arr[first]) {
            if (second == -1 || arr[second] < arr[i])
                second = i;
        }
    }
    return second;
}
 
int main() {
    int arr[] = {10, 12, 20, 4};
    int index = secondLargest(arr, sizeof(arr)/sizeof(arr[0]));
    if (index == -1)
        cout << "Second Largest didn't exist";
    else
        cout << "Second largest : " << arr[index];
}

Java

// JAVA Code for Find Second largest
// element in an array
class GFG {
 
    /* Function to print the second largest
    elements */
    public static void print2largest(int arr[],
                                     int arr_size)
    {
        int i, first, second;
 
        /* There should be atleast two elements */
        if (arr_size < 2) {
            System.out.print(" Invalid Input ");
            return;
        }
 
        first = second = Integer.MIN_VALUE;
        for (i = 0; i < arr_size; i++) {
            /* If current element is greater than
            first then update both first and second */
            if (arr[i] > first) {
                second = first;
                first = arr[i];
            }
 
            /* If arr[i] is in between first and
               second then update second  */
            else if (arr[i] > second && arr[i] != first)
                second = arr[i];
        }
 
        if (second == Integer.MIN_VALUE)
            System.out.print("There is no second largest"
                             + " element\n");
        else
            System.out.print("The second largest element"
                             + " is " + second);
    }
 
    /* Driver program to test above function */
    public static void main(String[] args)
    {
        int arr[] = { 12, 35, 1, 10, 34, 1 };
        int n = arr.length;
        print2largest(arr, n);
    }
}
// This code is contributed by Arnav Kr. Mandal.

Python3

# Python program to
# find second largest
# element in an array
 
 
# Function to print the
# second largest elements
def print2largest(arr, arr_size):
 
    # There should be atleast
        # two elements
    if (arr_size < 2):
     
        print(" Invalid Input ")
        return
     
 
    first = second = -2147483648
    for i in range(arr_size):
     
        # If current element is
                # smaller than first
        # then update both
                # first and second
        if (arr[i] > first):
         
            second = first
            first = arr[i]
         
 
        # If arr[i] is in
                # between first and
        # second then update second
        elif (arr[i] > second and arr[i] != first):
            second = arr[i]
     
    if (second == -2147483648):
        print("There is no second largest element")
    else:
        print("The second largest element is", second)
 
 
# Driver program to test
# above function
arr = [12, 35, 1, 10, 34, 1]
n = len(arr)
 
print2largest(arr, n)
 
# This code is contributed
# by Anant Agarwal.

C#

// C# Code for Find Second largest
// element in an array
using System;
 
class GFG {
 
    // Function to print the
    // second largest elements
    public static void print2largest(int[] arr,
                                     int arr_size)
    {
        int i, first, second;
 
        // There should be atleast two elements
        if (arr_size < 2) {
            Console.WriteLine(" Invalid Input ");
            return;
        }
 
        first = second = int.MinValue;
        for (i = 0; i < arr_size; i++) {
            // If current element is smaller than
            // first then update both first and second
            if (arr[i] > first) {
                second = first;
                first = arr[i];
            }
 
            // If arr[i] is in between first
            // and second then update second
            else if (arr[i] > second && arr[i] != first)
                second = arr[i];
        }
 
        if (second == int.MinValue)
            Console.Write("There is no second largest"
                          + " element\n");
        else
            Console.Write("The second largest element"
                          + " is " + second);
    }
 
    // Driver Code
    public static void Main(String[] args)
    {
        int[] arr = { 12, 35, 1, 10, 34, 1 };
        int n = arr.Length;
        print2largest(arr, n);
    }
}
 
// This code is contributed by Parashar.

PHP

 $first)
        {
            $second = $first;
            $first = $arr[$i];
        }
 
        // If arr[i] is in
        // between first and
        // second then update
        // second
        else if ($arr[$i] > $second &&
                 $arr[$i] != $first)
            $second = $arr[$i];
    }
    if ($second == PHP_INT_MIN)
        echo("There is no second largest element\n");
    else
        echo("The second largest element is " . $second . "\n");
}
 
// Driver Code
$arr = array(12, 35, 1, 10, 34, 1);
$n = sizeof($arr);
print2largest($arr, $n);
 
// This code is contributed by Ajit.
?>

Javascript


输出:

Second largest : 34

复杂性分析:

  • 时间复杂度: O(n)。
    只需要遍历一次数组。
  • 辅助空间: O(1)。
    因为不需要额外的空间。