我正在解决LeetCode上的一个问题,但是还没有人能够解释我的问题。
给定一个任意的ransom note字符串和另一个包含来自所有杂志的字母的字符串,编写一个函数,如果可以从杂志构造ransom note,该函数将返回true;否则,它将返回false。
杂志串中的每个字母只能在你的赎金纸条中使用一次。
注意:您可以假设两个字符串都只包含小写字母。
canConstruct("a", "b") -> false
canConstruct("aa", "ab") -> false
canConstruct("aa", "aab") -> true
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
if(ransomNote.size() > magazine.size()) return false;
unordered_map<char, int> m;
for(int i = 0; i < magazine.size(); i++)
m[magazine[i]]++;
for(int i = 0; i < ransomNote.size(); i++)
{
if(m[ransomNote[i]] <= 0) return false;
m[ransomNote[i]]--;
}
return true;
}
};
bool canConstruct(string ransomNote, string magazine) {
int lettersLeft = ransomNote.size(); // Remaining # of letters to be found in magazine
int arr[26] = {0};
for (int j = 0; j < ransomNote.size(); j++) {
arr[ransomNote[j] - 'a']++; // letter - 'a' gives a value of 0 - 25 for each lower case letter a-z
}
int i = 0;
while (i < magazine.size() && lettersLeft > 0) {
if (arr[magazine[i] - 'a'] > 0) {
arr[magazine[i] - 'a']--;
lettersLeft--;
}
i++;
}
if (lettersLeft == 0) {
return true;
} else {
return false;
}
}
这两者都具有相同的复杂性,并且使用相同的结构来解决问题,但我不明白为什么其中一个所花费的时间几乎是另一个的两倍。查询向量的时间是O(1),但对于unordered_map也是如此。向其中一个添加入口/键也是同样的情况。
拜托,有人能解释一下为什么运行时间变化这么大吗?
首先要注意的是,虽然查询
其次,由于
本质上,就复杂性而言,
第二种方法使用纯C数组,其中对元素的访问是一个简单的指针解引用。但
由于这些原因,难怪数组版本会比
只有当您拥有大量的键时,您才会看到