1. 两数之和
方法一:哈希表
用时:8m36s
思路
第一次遍历用哈希表记录,第二次遍历判断。
- 时间复杂度: O ( n ) O(n) O(n)。
- 空间复杂度: O ( n ) O(n) O(n)。
C++代码
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int size = nums.size();
unordered_map<int, int> hashMap;
for (int i = 0; i < size; ++i) hashMap[nums[i]] = i;
for (int i = 0; i < size; ++i) {
if (hashMap.find(target - nums[i]) != hashMap.end() && hashMap[target - nums[i]] != i) return {i, hashMap[target - nums[i]]};
}
return {0, 0};
}
};
看完讲解的思考
无。
代码实现遇到的问题
无。
454. 四数相加 II
方法一:哈希表
用时:40m33s
思路
用哈希表先记录前两个数组所有可能的和以及和的数量,然后双层for循环遍历另外两个数组,查找哈希表中有没有满足条件的和,若有则加上该和的数量。
- 时间复杂度: O ( n 2 ) O(n^2) O(n2)。
- 空间复杂度: O ( n 2 ) O(n^2) O(n2)。
C++代码
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
unordered_map<int, int> hashMap;
int size = nums1.size();
int res = 0;
for (int i = 0; i < size; ++i) {
for (int j = 0; j < size; ++j) {
++hashMap[nums1[i] + nums2[j]];
}
}
for (int i = 0; i < size; ++i) {
for (int j = 0; j < size; ++j) {
if (hashMap.find(0 - nums3[i] - nums4[j]) != hashMap.end()) {
res += hashMap[0 - nums3[i] - nums4[j]];
}
}
}
return res;
}
};
看完讲解的思考
无。
代码实现遇到的问题
一开始想着用两个哈希表分别记录前两个数组之和以及后两个数组之和,然后再遍历哈希表,计数加上两个val的乘积。
但是这样的时间复杂度是
O
(
n
2
+
n
2
+
n
2
)
O(n^2+n^2+n^2)
O(n2+n2+n2),空间复杂度是
O
(
n
2
+
n
2
)
O(n^2+n^2)
O(n2+n2),而方法一的时间复杂度是
O
(
n
2
+
n
2
)
O(n^2+n^2)
O(n2+n2),空间复杂度是
O
(
n
2
)
O(n^2)
O(n2)。
383. 赎金信
方法一:哈希表
用时:3m13s
思路
哈希表。由于字符串只有小写字母,所以可以用数组代替哈希表实现,运行时间更短。
- 时间复杂度: O ( n + m ) O(n+m) O(n+m)。
- 空间复杂度: O ( c ) O(c) O(c)。
C++代码
// 用哈希表实现
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
unordered_map<char, int> hashMap;
for (char& c : magazine) ++hashMap[c];
for (char& c : ransomNote) {
if (hashMap.find(c) == hashMap.end()) return false;
else if (--hashMap[c] < 0) return false;
}
return true;
}
};
// 用数组实现
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
int map[26] = {0};
for (char& c : magazine) ++map[c - 'a'];
for (char& c : ransomNote) {
if (map[c - 'a'] == 0) return false;
--map[c - 'a'];
}
return true;
}
};
看完讲解的思考
无。
代码实现遇到的问题
无。
最后的碎碎念
今天题目比较简单。