7

グーグルで検索しようとしましたが、うまくいきませんでした。最小の複雑さで配列内の 2 番目の最大数を見つけるにはどうすればよいですか?

コードまたはアイデアは大いに役立ちます。

配列をループして、その後最大数を探すことができます。最大数を取得してから、配列を再度ループして、同じ方法で2番目を見つけます。

しかし、効率的でないことは確かです。

4

18 に答える 18

29

配列をソートして 2 番目のインデックスの項目を選択することもできますが、次の 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#の配列で2番目に大きい数値を取得するには?

于 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 に答える
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
 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 に答える
-1

あなたの構造がツリーであるというわけではありません...単純な配列ですよね?

最善の解決策は、配列をソートすることです。降順または昇順に応じて、それぞれ 2 番目または最後から 2 番目の要素を表示します。

もう 1 つの方法は、いくつかの組み込みメソッドを使用して、初期最大値を取得することです。その要素をポップしてから、最大値を再度検索します。C# がわからないので、直接コードを示すことはできません。

于 2013-02-11T10:42:21.280 に答える
-1

数字を並べ替えてから、2 番目に大きいものだけを取得します。効率を考慮しないスニペットを次に示します。

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

以下の私の解決策。

    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

配列を並べ替えて、最後から 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 に答える