【发布时间】: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 块之后。请务必在调试后删除该行代码。 -
我试图想出一种愚蠢但“自然”的方法来使这个自然成为二次方,而不是表面上将其夸大为二次方复杂度,因为这个问题确实希望在线性时间内解决。也许一种足够自然地愚蠢的方法,没有表面上变得愚蠢的聪明东西,就是对数据进行冒泡排序,然后输出第一个和最后一个元素之间的差异。那将是一个自然愚蠢的解决方案,而不是表面上愚蠢的解决方案,我认为教授会更欣赏自然愚蠢。
-
好主意!我将改为这样做。谢谢!