今天是算法训练营的第三天;
写了454. 四数相加 II这道题目
力扣链接
代码随想录链接
代码如下:
class Solution:
def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:
# 使用字典存储nums1和nums2中的元素及其和
hashmap = dict()
for n1 in nums1:
for n2 in nums2:
# if n1 + n2 in hashmap:
# hashmap[n1+n2] += 1
# else:
# hashmap[n1+n2] = 1
# 上面的四行代码可以改写为下面的代码,同一个意思
hashmap[n1+n2] = hashmap.get(n1 + n2, 0) + 1
# 如果 -(n3 + n4)存在于hashmap,那么就将结果++
count = 0
for n3 in nums3:
for n4 in nums4:
key1 = -(n3+n4)
if key1 in hashmap: # 如果hashmap这个字典中的键,和key1相对应的话,那就说明可以相加为0
count += hashmap[key1]
return count
通过Python字典这个数据结构的键值对的形式,来解题。
拓展:
Python中的dict和C里面的map相同点和不同点总结
在Python和C++中,dict和map是用于存储键值对的数据结构,但在语法和实现上存在一些差异。下面是dict和C++中的map的相同点和不同点,并附带示例说明:
相同点:
-
存储键值对:dict和map都用于存储键值对,通过键来访问对应的值。
-
动态性:它们都支持动态地添加、删除和修改键值对。
不同点:
-
语言和语法:dict是Python的内置数据类型,在Python中直接使用,而map是C++标准库中的容器,需要包含相应的头文件和使用命名空间。
-
内存管理:Python的dict使用动态内存分配和垃圾回收机制,不需要手动管理内存。而C++中的map使用动态内存分配和自动析构,也可以手动管理内存。
-
键和值的类型:Python的dict可以存储各种类型的键和值,包括不同的数据类型和对象。C++中的map通常需要明确指定键和值的类型,可以使用自定义类型作为键和值。
下面两个示例分别展示了使用dict和map存储键值对,并进行一些操作。在Python示例中,我们创建了一个字典person,包含了姓名、年龄和职业等键值对。然后,我们通过访问键来获取对应的值,使用print函数输出结果。接着,我们添加了一个新的键值对、修改了一个值,并删除了一个键值对。最后,使用pprint.pprint函数打印出字典的内容。
在C++示例中,我们使用了std::map容器来存储键值对。我们添加了两个键值对,修改了一个值,并删除了一个键值对。最后,通过for循环遍历map,打印出键值对的内容。
需要注意的是,C++中的示例使用了C++标准库中的map容器,实际使用中还可以使用其他容器,如unordered_map等。这里的示例只是为了演示与Python中dict的比较。
Python中的dict示例:
# 导入模块
import pprint
# 创建字典
person = {
'name': 'John',
'age': 30,
'city': 'New York'
}
# 访问字典中的值
print(person['name']) # 输出: John
# 添加新的键值对
person['occupation'] = 'Engineer'
# 修改值
person['age'] = 35
# 删除键值对
del person['city']
# 遍历字典
pprint.pprint(person)
C++中的map示例:
#include <iostream>
#include <map>
int main() {
// 创建map
std::map<std::string, int> person;
// 添加键值对
person["name"] = 30;
person["age"] = 30;
// 修改值
person["age"] = 35;
// 删除键值对
person.erase("name");
// 遍历map
for (const auto& kv : person) {
std::cout << kv.first << ": " << kv.second << std::endl;
}
return 0;
}```