【发布时间】:2021-02-17 05:15:36
【问题描述】:
我已经测试了这个问题的基于字符串和基于地图的实现。第一个运行时间为 12 毫秒,而第二个运行时间为 1 毫秒,两者使用几乎相同的空间。两种风格的实现结构看起来是一样的。 所以,我想知道为什么两者之间存在很大的运行时差异。 以下是两种实现方式:
class Solution {
public boolean canFormArray(int[] arr, int[][] pieces) {
// string based
String str = "";
for (int i=0; i<arr.length; i++) {
str = str + arr[i] + "#";
}
for (int i=0; i<pieces.length; i++) {
String str2 = "";
for (int j=0; j<pieces[i].length; j++) {
str2 = str2 + pieces[i][j] + "#";
}
if (!str.contains(str2)) {
return false;
}
}
return true;
// map based
HashMap<Integer, Integer> map = new HashMap<>();
for (int i=0; i<arr.length; i++) {
map.put(arr[i], i);
}
for (int i=0; i<pieces.length; i++) {
if (!map.containsKey(pieces[i][0])) {
return false;
}
int index = map.get(pieces[i][0]);
for (int j=1; j<pieces[i].length; j++) {
if (!map.containsKey(pieces[i][j])) {
return false;
}
if (map.get(pieces[i][j]) != index+1) {
return false;
}
index++;
}
}
return true;
}
}
【问题讨论】:
-
HashMap.get 和 HashMap.containsKey 都是 O(1),而 String.containsKey 是 O(n)。