【问题标题】:Find Maximum Integer in Array?在数组中找到最大整数?
【发布时间】:2009-08-29 03:21:07
【问题描述】:

我有两个数组,一个非常大(超过一百万个条目),另一个数组很小(少于 1000 个条目),从数组中的所有条目中找到最大数量的最佳方法是什么?

谢谢。

【问题讨论】:

  • 遍历每个数组,跟踪迄今为止的最大值。这个问题有诀窍吗?您至少必须查看每个值才能找到最大值。
  • 我必须说,最近出现了用户名“rachel”的变体之多,令人惊讶。 :) 更严肃地说,这是一个非常相关的问题:stackoverflow.com/questions/1042507/…
  • @Agor - 三位名为“Rachel”的用户今天注册了......奇怪。
  • 啊,这是作业。一开始我并没有意识到这一点。
  • 没有证据表明这是作业 - 我正在取消标记它。

标签: algorithm arrays


【解决方案1】:

如果数组未排序,则必须进行线性搜索以找到每个数组中的最大值。如果数组排序,那么只需从每个数组中取出第一个或最后一个元素(取决于排序顺序)。

【讨论】:

    【解决方案2】:

    如果你想一想,如果你想找到最高的值,你必须检查所有的值。没有办法解决这个问题(除非对数组进行排序,这很容易 - 只需取每个数组的最后一个值(或第一个值,如果按降序排序)并取最大的值)。示例:

    int highest = array1[0]; // note: don't do this if the array could be empty
    for(int i = 1; i < array1.length; i++) {
        if(highest<array1[i]) highest = array1[i];
    }
    for(int i = 0; i < array2.length; i++) {
        if(highest<array2[i]) highest = array2[i];
    }  
    // highest is now the highest
    

    【讨论】:

      【解决方案3】:

      如果您的数组已经排序,您可以直接跳到最大值。

      如果您的数组未排序,则必须遍历整个列表,跟踪迄今为止看到的最大值。

      【讨论】:

        【解决方案4】:

        在这里,我给出了从 int 数组中查找最大值的简单代码。 我的逻辑是:- 数组是 int[] arr={8,5,6,7,3,4,9} 。首先取一个临时变量并将第一个 该变量中的值并假设这是最大值,即 tempValue=arr[0]。并且在 for 循环内部采用一个 if 块并检查第二个值是否大于第一个值。同样 if 块将自动检查其余值。最后将最大值赋值给临时变量,得到结果给定数组中最大值为9。

        public class MaxIntArray{
        
              public static void main(String[] args){
                
                
                int[] arr={8,5,6,7,3,4,9};
                
                int tempValue=arr[0];
        
                for(int i=0;i<arr.length;i++){
                    if(arr[i]>tempValue){
                        tempValue=arr[i];
                    }
                
                }
                System.out.println("\n Maximum Value in the Given Array = "+tempValue);
            
             }
        
        }
        

        输出是:

        Maximum Value in the Given Array = 9

        【讨论】:

        • 问题关心的是一个“(超过百万条目)”的案例,它是如何考虑到这方面的?
        • @emecas,arr.length 将检查数组中的所有条目。我已经给出了未排序数组的逻辑。即,需要像线性搜索一样逐个检查每个元素。
        【解决方案5】:

        对于未排序的数组,您可以使用值 0 初始化一个最大数变量(假设数组由正值组成),然后遍历数组中的所有项,在每次迭代时将较大的数分配给最大变量。

            int[] values = {8,3,7,10,5};
            max = 0; 
            for(int i = 0;i < values.length;i++){
             if(values[i] > max){
                max = values[i];
               }
            }
            System.out.println(max);
        

        【讨论】:

          【解决方案6】:

          减少以找到最大的数字:

          此示例使用 Swift。

          let max: UInt8 = [1,4,3].compactMap { $0 }.reduce(UInt8(0)) { $0 > $1 ? $0 : $1 } // 4
          

          【讨论】:

            【解决方案7】:

            这个解决方案是当你有一个对象数组,并且你希望从中找到一个属性的最大值。

            在这里,我们有一系列工作(具有各自的利润和截止日期),我们需要找到最赚钱的工作。

            class Job
            {
                int deadline; int profit;
                
                public Job(int deadline, int profit)
                {
                    this.profit = profit;
                    this.deadline = deadline;
                }
                
                
                public int getDeadline()
                {
                    return deadline;
                }
                
                public int getProfit()
                {
                    return profit;
                }
                
                public String toString()
                {
                    return "Job [deadline:"+this.deadline+" profit:"+this.profit+"]";
                }
            }
            

            找到最赚钱的工作的方法。

            static int jobSequenceWithMaxProfit(Job[] jobsAndProfits)
                {
                    List<Job> lst= Arrays.asList(jobsAndProfits);
                    int maxProfit= Collections.max(lst, (Job a1, Job a2)->{ return a1.getProfit()- a2.getProfit();}).getProfit();
                    
                    return maxProfit;
                }
            

            【讨论】:

              【解决方案8】:

              我们可以将您的操作次数或比较次数减少到 3(n/2-2)。从 2n(n 用于使用线性搜索查找最大数,n 用于最小值)。假设我们有一个元素数组 [1,9,8,7,4,5,1,4,7,8,1,6]。 将第一个元素设置为 Max=1,将下一个元素设置为 Min=9,现在同时对数组的下两个元素进行比较,然后与 Max 和 Min 进行比较。所以一次迭代只需要 3 次比较,但数组减少到 n/2。因此,比较的总数将是 3(n/2-2)。 示例:

              Max=arr[1];
              
              Min=arr[2];
              
              for(int i=3; i< arr.length;i=i+2)
              
              {
              
              if(arr[i]>arr[i+1]) 
              
              {
              
              if(Max < arr[i])
              
              Max=arr[i];
              
              if(Min > arr[i+1])
              
              Min=arr[i+1];
              
              }
              
              else 
              
              {
              
              if(Max < arr[i+1])
              
              Max=arr[i+1];
              
              if(Min > arr[i])
              
              Min=arr[i];
              
              }
              
              }
              

              【讨论】:

              • 实际上,对于 10 个元素 n-1 (10-1=9) 的未排序数组,需要进行比较。在您的情况下,需要进行 3(n/2-2) 即 3(10/2-2)=9 比较,两者都相等,对于 20 元素数组,您的方法需要 24 次比较,它有什么优势?跨度>
              • 此代码似乎不正确。如果数组的第一个元素是最小值,则此代码将找不到它。如果数组的第二个元素是最大值,这段代码也不会找到。
              猜你喜欢
              • 2016-06-24
              • 1970-01-01
              • 2015-07-04
              • 2015-10-30
              • 2016-05-25
              • 2022-11-21
              • 2017-03-14
              • 2013-06-22
              • 2018-08-27
              相关资源
              最近更新 更多