【问题标题】:How to write a O(n^2) method that finds the largest distance between two points如何编写一个 O(n^2) 方法来找到两点之间的最大距离
【发布时间】:2015-11-14 04:53:15
【问题描述】:

我有一个数组int [] nums = {5, 1, 6, 10, 4, 7, 3, 9, 2}

我想在 O(n^2) 时间内找到该数组中最小和最大数字之间的距离。根据分配的要求,它需要 O(n^2) 时间。为此,我正在编写一个名为quadratic 的方法。到目前为止,我已经想出了下面的代码。

public static int quadratic(int[] nums) {

    int max = nums[0];
    int min = nums[0];

    for (int i = 0; i < nums.length; i++) {
        for (int j = 0; j < nums.length; j++) {

            if (nums[i] > nums[j])
                max = nums[i];
            else if (nums[i] < nums[j])
                min = nums[i];  
            }
        }

    int maxDifference = max - min;
    return maxDifference; 
}

问题是,当我使用上述数组运行该方法时,我得到的最大差异为 0。我希望为 9,因为最大的数字是 10,最小的数字是 1。10 - 1 = 9。

我的问题是,谁能告诉我如何更改我的代码,以便正确计算最小和最大数字之间的最大距离?

【问题讨论】:

  • 解甚至可以是 O(2n);那么它实际上需要 O(n^2) 吗?
  • 在这种情况下,这个特定的任务需要 O(n^2)。
  • 这是一个简单的调试技巧(虽然这不是最好的方法),在 for 循环中打印出以下内容:i,j,nums[i],nums[j],min,max。最好将它放在 if-else 块之后。请务必在调试后删除该行代码。
  • 我试图想出一种愚蠢但“自然”的方法来使这个自然成为二次方,而不是表面上将其夸大为二次方复杂度,因为这个问题确实希望在线性时间内解决。也许一种足够自然地愚蠢的方法,没有表面上变得愚蠢的聪明东西,就是对数据进行冒泡排序,然后输出第一个和最后一个元素之间的差异。那将是一个自然愚蠢的解决方案,而不是表面上愚蠢的解决方案,我认为教授会更欣赏自然愚蠢。
  • 好主意!我将改为这样做。谢谢!

标签: java arrays algorithm


【解决方案1】:

您正在覆盖最大值和最小值。

if (nums[i] > nums[j])
    max = nums[i];
else if (nums[i] < nums[j])
    min = nums[i];  
}

您需要将当前数字与已设置的最大值/最小值进行比较。相反,您将当前数字与另一个数字进行比较,然后在条件为真时覆盖 max/min。在此示例中,有一次 10 是最大值,但后来您检查了if(9&gt;2),这是真的,因此您将max = 10 更改为max = 9

这里是 O(n^2) 时间,外部循环完全没用。

public static int quadratic(int[] nums) {

    int max = Integer.MIN_VALUE;
    int min = Integer.MAX_VALUE;

    for (int i = 0; i < nums.length; i++) {
        for (int j = 0; j < nums.length; j++) {

            if (nums[j] > max)
                max = nums[j];
            if (nums[j] < min)
                min = nums[j];  
            }
        }
    System.out.println(max + " " + min);
    int maxDifference = max - min;
    return maxDifference; 
}

【讨论】:

  • 谢谢!这完美地解释了它。
【解决方案2】:

对于数字(相对于平面上的点),您可以在线性时间内做到这一点。找到最大值,找到最小值,然后减去。因此,不需要嵌套循环。

【讨论】:

  • 这个特定任务实际上需要在 O(n^2) 时间内完成。
猜你喜欢
  • 2012-09-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-01
  • 1970-01-01
  • 2013-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多