为了账号安全,请及时绑定邮箱和手机立即绑定

leetcode 561 的时间复杂度

leetcode 561 的时间复杂度

Helenr 2022-08-03 16:21:12
问题是:给定一个2n个整数的数组,你的任务是将这些整数分组为n对整数,比如(a1,b1),(a2,b2),...,(an,bn),这使得从1到n的所有i的min(ai,bi)之和尽可能大。提供的解决方案如下:public class Solution {    public int arrayPairSum(int[] nums) {        int[] arr = new int[20001];        int lim = 10000;        for (int num: nums)            arr[num + lim]++;        int d = 0, sum = 0;        for (int i = -10000; i <= 10000; i++) {            sum += (arr[i + lim] + 1 - d) / 2 * i;            d = (2 + arr[i + lim] - d) % 2;        }        return sum;    }} 我认为说时间复杂度是O(n)是不公平的。虽然 O(n+K) K = 20001 是一个常数,似乎可以省略,但 n 也小于 K。如果是这样,为什么我不能说时间复杂度是O(1)?
查看完整描述

1 回答

?
繁星淼淼

TA贡献1775条经验 获得超11个赞

对于 ALL n,渐近复杂度测量为 n 的函数。我们关心的是当n变大时会发生什么。真的,真的很大。

也许在实践中,n将永远很小。好。

但是,当你为算法给出一个复杂性度量时,根据定义,你是在说随着n的增长会发生什么。并且不断增长。当它发生时,它将使K相形见绌。

所以O(n)是的。

澄清:

的确,问题规范说:

n 是一个正整数,在 [1, 10000] 的范围内。

数组中的所有整数都将在 [-10000, 10000] 的范围内。

但请记住,这只是针对这个问题!给出硬编码 K 值的解决方案。正如你所注意到的,这里使用的算法确实应该写成O(n + K)。这个K不是一个常数因子,可能不应该被删除。

然而,对于渐近复杂性(Big-O,Big-Theta等),即使使用任意但有限的K,您仍然可以找到常量k和N,使得对于所有n>N,kn>该算法中所需的运算次数,这就是Big-O定义。这就是为什么你会看到很多人说O(n)。

希望有所帮助。


查看完整回答
反对 回复 2022-08-03
  • 1 回答
  • 0 关注
  • 96 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号