【问题标题】:Finding the 3 largest numbers in an array/list of n numbers without the sorting在没有排序的情况下在 n 个数字的数组/列表中查找 3 个最大的数字
【发布时间】:2015-05-29 03:56:41
【问题描述】:

当我做作业时,当我必须在数字列表中找到最大的 3 个数字(未指定数据结构)时,我会感到非常困惑。我对我必须做的事情感到非常震惊。有什么帮助吗?

【问题讨论】:

  • for-loop 开始,遍历列表,使用Math.max 之类的方式将每个值与三个“最大”值/变量(应初始化为0)进行比较跨度>
  • @MadProgrammer 我认为这些值应该初始化为数组的最小值,而不是0。在所有数字都是负数的情况下,在0 处初始化是行不通的。
  • @saadq 这是真的,我只考虑正数。你可以改用Integer.MIN_VALUE,那么你就不需要知道数组的范围...

标签: java arrays max


【解决方案1】:

你可以保留三个变量来存储三个最大值,并遍历数组:

你需要处理三种情况:

  • 当当前元素大于最大元素时。需要相应地更新第二和第三大。

  • 当当前元素大于第二大元素时。需要更新第三大。

  • 当当前元素大于第三大时。

我的code 如果你还卡住了

for(int i : array)
    if(i > largest)
      //Do smt
    else if(i > second)
      //Do smt
    else if(i > third)
      //Do smt

【讨论】:

  • 从长远来看,如果您为某人完成家庭作业,对谁有帮助?
  • @yshavit 无论如何,他仍然需要理解这段代码。如果一个人一直懒惰并且不想改进,我认为我无能为力:)
  • @yshavit 如果我很懒,我什至不会在这个论坛上提问。我可以简单地用我的朋友程序复制。当我在这里提出疑问时,我通常会得到很多答案(逻辑)。这不是学吗???作为一个初学者,我相信对于我所做的所有程序来说,学习的不仅仅是逻辑。这就是我问的原因
  • @RangaGanesh 这很难说得通,只有你自己知道,只要你觉得进步和学习smt,就可以了。看解决方案是可以的,我想,我总是在卡住的时候看解决方案,然后,在理解它之后,我尝试提出自己的解决方案,这是在这种情况下学习的最好方法,所以我鼓励您在阅读我的文章后提出自己的想法:)
  • 起初我想用一个 max 函数来解决这个问题,一旦调用该函数,它就会返回一个最大值。在找到该最大值后,我应该从用于存储值的数据结构中删除该值。然后递归调用该函数以查找 n 个最大值。但是有3次for循环的问题将要执行。但是在我在这个论坛上问了这个问题之后,我明白了我想执行 3 次 for 循环。
【解决方案2】:
    int firstNumber=5;
    int secondNumber=3;
    int thirdNumber=4;

    int largestNumber=(firstNumber>secondNumber)?firstNumber:(secondNumber>thirdNumber)?secondNumber:thirdNumber;
    System.out.println("largestNumber : "+largestNumber);

【讨论】:

  • OP 不是要求3 largest numbers in an array list of n numbers 吗?为什么你给出 3 个数字中最大的数字?
【解决方案3】:

真正简单的方法:

    List<Number> numbers = new ArrayList<Number>();
    numbers.add(5);
    numbers.add(4);
    numbers.add(3);
    numbers.add(2);
    numbers.add(1);
    numbers.add(6);

    SortedSet<Number> sortedNumbers= new TreeSet<Number>();
    sortedNumbers.addAll(numbers);
    SortedSet<Number> subSet = sortedNumbers.subSet(sortedNumbers.size()-2, sortedNumbers.size()+1);
    for (Number subSet1 : subSet) {
        System.out.println(""+subSet1);
    }

【讨论】:

  • 您对集合的使用不包括可能也是最大的重复数字(如果有)。 OP 没有具体说明数字列表是不同的。
【解决方案4】:

我在 Python3 中的 leetcode 解决方案,时间复杂度为 O(N)。

class Solution:
    def thirdMax(self, A: List[int]) -> int:
        sm=float('-inf')
        fm=float('-inf')
        tm=float('-inf')
        N=len(A)
        i=0
        while i<N:
            
            if A[i]>fm:
                tm=sm
                sm=fm
                fm=A[i]
            elif A[i]>sm and A[i]<fm:
                tm=sm
                sm=A[i]
            elif (A[i]>tm and A[i]<sm):
                tm=A[i]
            
            i+=1
            
             
        return tm if tm != float('-inf') else fm

【讨论】:

    猜你喜欢
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    • 2013-12-31
    • 1970-01-01
    • 2020-05-13
    相关资源
    最近更新 更多