关于「LeetCode-977. 有序数组的平方」官方题解空间复杂度的争论

题目链接:977. 有序数组的平方 - 力扣(LeetCode) (leetcode-cn.com)

官方题解:有序数组的平方 - 有序数组的平方 - 力扣(LeetCode) (leetcode-cn.com)

class Solution {
    public int[] sortedSquares(int[] nums) {
        int n = nums.length;
        int[] ans = new int[n];
        for (int i = 0, j = n - 1, pos = n - 1; i <= j;) {
            if (nums[i] * nums[i] > nums[j] * nums[j]) {
                ans[pos] = nums[i] * nums[i];
                ++i;
            } else {
                ans[pos] = nums[j] * nums[j];
                --j;
            }
            --pos;
        }
        return ans;
    }
}

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/squares-of-a-sorted-array/solution/you-xu-shu-zu-de-ping-fang-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

官方给出的空间复杂度描述是

空间复杂度:O(1)。除了存储答案的数组以外,我们只需要维护常量空间。

我认为不合理,开辟了新的数组作为返回值,应该是O(n)的空间复杂度,O(1)必须是inplace操作,只在原有nums上进行改动,评论区中对此也进行了争辩,官方给出的解释是:

Hi 大家好,这里又是官方题解作者。看到大家在下面讨论方法二三的空间复杂度是多少,这里就给出一个详细的说明。

首先,我在方法一的空间复杂度部分明确说明了:除了存储答案的数组以外,我们需要O(logn) 的栈空间进行排序。也就是说,存储答案的数组需要的空间为 O(n),而除此之外,还需要 O(logn) 的空间作为排序的栈空间。同时,方法二和方法三也默认了空间复杂度是「存储答案的数组以外」的结果,所以空间复杂度为 O(1)。

我认为我们没有必要纠结到底返回答案到底需不需要算在空间复杂度里面。有一点是我经常提起的:力扣的题目要把它当成面试题来看。在面试中,如果你作为面试者碰到了这个题,那么一定要 (1) 和面试官沟通并确认清楚 (2) 给出尽可能全面的答案。说空间复杂度是 O(n) 还是 O(1) 都没有问题,只要你和面试官说明原因就好。

我非常不赞同此处关于 “空间复杂度是「存储答案的数组以外」的结果” 的描述

  1. 新开的数组并不是只用于「储存答案」,不额外开这个数组,这个算法根本没法完成。
  2. 既然我们承认归并排序空间复杂度是 O(n),那么此处凭什么是 O(1) 呢?如果一定要说用来「储存答案」了,那归并排序最后也可到把数据都存到辅助数组里。

在维基百科查阅了关于空间复杂度的清晰定义:

The space complexity of an algorithm or a computer program is the amount of memory space required to solve an instance of the computational problem as a function of characteristics of the input. It is the memory required by an algorithm until it executes completely.[1]

根据这段描述,“空间复杂度是算法在运行过程中所需要的内存空间大小”,此段代码空间复杂度就是 O(n)。如果描述是“【额外】空间复杂度是O(1)”,可以理解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值