为什么这个O(n^2)代码的执行速度比O(n)快?
我已经为两种方法编写了代码,以找出LeetCode上字符串中的第一个唯一字符。
问题陈述:给定一个字符串,找到其中的第一个非重复字符并返回其索引。如果它不存在,则返回 -1。
示例测试用例:
s = “leetcode” 返回 0。
s = “loveleetcode”,返回 2。
方法1(O(n))(如果我错了,请纠正我):
class Solution {
public int firstUniqChar(String s) {
HashMap<Character,Integer> charHash = new HashMap<>();
int res = -1;
for (int i = 0; i < s.length(); i++) {
Integer count = charHash.get(s.charAt(i));
if (count == null){
charHash.put(s.charAt(i),1);
}
else {
charHash.put(s.charAt(i),count + 1);
}
}
for (int i = 0; i < s.length(); i++) {
if (charHash.get(s.charAt(i)) == 1) {
res = i;
break;
}
}
return res;
}
}
方法 2 (O(n^2)):
class Solution {
public int firstUniqChar(String s) {
char[] a = s.toCharArray();
int res = -1;
for(int i=0; i<a.length;i++){
if(s.indexOf(a[i])==s.lastIndexOf(a[i])) {
res = i;
break;
}
}
return res;
}
}
在方法2中,我认为复杂性应该是O(n^2),因为indexOf在这里在O(n*1)中执行。
但是当我在LeetCode上执行这两个解决方案时,我得到的运行时为19 ms,方法2的运行时为92 ms。我很困惑;为什么会这样?
我假设LeetCode针对最佳,最差和平均情况对小和大输入值进行测试。
更新:
我知道O(n^2算法)可以在某些n<n1中表现得更好。在这个问题中,我想了解为什么在这种情况下会发生这种情况。即方法1的哪个部分使其变慢。