这里的空间复杂度是否为O(n)?因为如果k增加5,我的变量p也会增加5。
现在所有这个方法都是将节点置于k。例如:1-> 5-> 3,当k = 2时,节点为5.
public ListNode reverseKGroup(ListNode head, int k) {
int p = 1;
while (p < k) {
if (head.next == null) {
return head;
}
head = head.next;
p++;
}
return head
}
答案 0 :(得分:4)
严格考虑您的算法,它具有空间复杂度O(1)。您的输入是列表的标题和数字k
,但您的算法不会消耗任何空间,而不仅仅是参考head
和数字p
。在我看来,现有列表并不属于您方法的复杂性。但是,您的时间复杂度为O(N)。
---在评论中回答Theo的问题:
p
是一个数字(在这种情况下是基本类型int,所以需要4个字节 - 常量大小)。如果p
增加,这并不意味着,它需要更多空间,但存储的数字更高。例如。 p = 5意味着设置了以下字节:&#34; 0,0,0,5&#34; ,对于p = 257,设置字节:&#34; 0,0,1,2&#34;。
我假设,JVM以大端字节顺序存储日期,因此第一个零表示更大的字节。使用小端,字节顺序将颠倒。
当然,你是对的,对于非常大的N
,不需要32位长的整数。因此,严格考虑这一事实,O(log(N))位是存储最多N
的数字所必需的。
例如。数字2 ^ 186需要存储187位(一个1和186个零)。
但实际上,与#34;通常&#34;数据,你不要指望这么大的数额。由于只有超过32位寄存器(一个int
个数字),您需要有2 ^ 32个数据条目(1个条目= 4个字节用于下一个引用,至少4个字节用于值Object
引用,对象大小本身=至少8个字节),即2 ^ 35字节= 32千兆字节。因此,当使用数字时,它通常被认为是恒定的空间复杂度。这取决于任务和环境。
答案 1 :(得分:1)
根据您是否认为预先存在的结构是空间复杂性的一部分,空间复杂度为O(1)或O(N),其中N是要操作的列表的长度,因为您不添加任何新的节点,仅引用现有节点。
k仅对时间复杂性有影响。
答案 2 :(得分:0)
此算法使用的唯一空间是int p
的空间,无论输入如何,它都是常量,因此空间复杂度为O(1)。时间复杂度确实是O(N)。