这段代码来自Cracking the Coding采访书。
public static boolean isUniqueChars2(String str) {
boolean[] char_set = new boolean[256];
for (int i = 0; i < str.length(); i++) {
int val = str.charAt(i);
if (char_set[val]) return false;
char_set[val] = true;
}
return true;
}
作者提到了,
时间复杂度为O(n),其中n是字符串的长度,和 空间复杂度为O(n)。
我理解时间复杂度为O(n)但我不明白空间复杂度怎么可能是O(n)
我的想法: 无论输入(str)大小是多少,char_set都将保持大小为256的数组。 即使“str”的长度为100,000,char_set仍然是256个元素的数组。 所以我想,由于此函数的内存要求不随输入的大小而变化并保持为常数256,因此空间复杂度是恒定的,即O(1)。
有人可以解释,如果我错了(以及为什么?)
非常感谢你。
答案 0 :(得分:0)
它有点复杂,我想:
在两次遇到某个字符之前的最大迭代次数是字符串构建的字母大小。
如果这个大小是有限的,时间复杂度是O(1),如果不是,布尔数组不能是有限大小,因此,空间复杂度将是O(n)。
答案 1 :(得分:0)
该示例中的空间复杂度为O(N),因为该字符串作为参数接收;我们并不确切知道它的大小,并且考虑到空间复杂性对算法时间内存消耗的建议,它会根据&#34; str&#34;的大小而变化。 。因为应该使用N.
如果我有例如:
,则完全相同public void someMethod(int a[], char s, int w){...}
因为&#34; a []&#34;它将是O(N); (我们不知道它的大小)。
另一方面:
public void someMethod(char s, int a, int x){...}
它将是O(1)(常数)。由于我们已经知道为必要属性分配的内存。
希望它有所帮助。