7

试图用谷歌搜索它,但没有运气。如何在复杂度最小的数组中找到第二个最大数?

代码或想法会有很大帮助。

我可以遍历一个数组并在此之后查找最大数,我有最大数,然后再次循环该数组以以相同的方式找到第二个。

但可以肯定的是,它没有效率。

4

18 回答 18

29

您可以对数组进行排序并选择第二个索引处的项目,但是下面的 O(n) 循环会快得多。

int[] myArray = new int[] { 0, 1, 2, 3, 13, 8, 5 };
int largest = int.MinValue;
int second = int.MinValue;
foreach (int i in myArray)
{
 if (i > largest)
 {
  second = largest;
  largest = i;
 }
else if (i > second)
    second = i;
}

System.Console.WriteLine(second);

或者

试试这个(使用 LINQ):

int secondHighest = (from number in test
                             orderby number descending
                             select number).Distinct().Skip(1).First()

如何在 Visual C# 中获取数组中的第二大数字?

于 2013-02-11T10:41:06.263 回答
1
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];
}
于 2014-08-13T00:12:57.373 回答
1

用 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
        }

输出:最大数:177,次大数:101

于 2018-11-20T16:49:45.773 回答
0
 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();   
    }

即使您在数组中具有项目的声誉,这也将起作用

于 2018-03-14T04:49:44.193 回答
0
           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);
于 2018-10-29T06:25:32.940 回答
0
/* 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]))
于 2019-05-31T20:43:07.397 回答
0
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");
}
于 2019-08-23T07:31:00.660 回答
0
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();
于 2021-06-03T07:49:33.020 回答
0

蟒蛇 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
于 2022-01-16T18:16:27.993 回答
-1

这不像你的结构是一棵树......它只是一个简单的数组,对吧?

最好的解决方案是对数组进行排序。并根据降序或升序,分别显示第二个或倒数第二个元素。

另一种选择是使用一些内置方法来获得初始最大值。弹出该元素,然后再次搜索最大值。不懂C#,所以不能直接给出代码。

于 2013-02-11T10:42:21.280 回答
-1

您想要对数字进行排序,然后只取第二大的数字。这是一个不考虑效率的片段:

var numbers = new int[] { 3, 5, 1, 5, 4 };
var result=numbers.OrderByDescending(x=>x).Distinct().Skip(1).First();
于 2013-02-11T10:44:46.483 回答
-1
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();
        }   
    }
}
于 2015-07-27T07:01:14.487 回答
-1

我正在提供 JavaScript 中的解决方案,它需要 o(n/2) 复杂度才能找到最高和第二高的数字。
这是有效的提琴手链接

    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];

       }
   }

}   
于 2015-11-04T15:04:02.173 回答
-1

这还不错:

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();

它的复杂性相当低,因为它最多只能对三个元素进行排序

于 2015-11-14T06:48:58.007 回答
-1

我的解决方案如下。

    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];
          }

     }
于 2016-11-28T07:11:46.463 回答
-2

对数组进行排序并取倒数第二个值?

于 2013-02-11T10:41:04.313 回答
-2
 var result = (from elements in inputElements
    orderby elements descending
    select elements).Distinct().Skip(1).Take(1);
 return result.FirstOrDefault();
于 2015-09-11T21:25:05.883 回答
-2
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();
        }
    }
}
于 2016-11-04T17:19:44.140 回答