力扣1两数之和
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
a=[]
for i in range(len(nums)):
intentNum=target-nums[i]
for j in range (len(nums)):
if j!=i:#题目要求不可以两个序号为同一个
if(nums[j]==intentNum):#找到了两个数和为target
a=[i,j]
return a
return a
1.刚看到题目的时候就想如果直接暴力能通过这道题目不是再简单不过了,提交之后发现真的可以暴力。
2.去找了力扣上面的题解,发现python对于列表遍历两次还有另外一种更为巧妙的方法,如下代码:
for i in range(len(nums)):
res = target-nums[i]
if res in nums[i+1:]:
return [i, nums[i+1:].index(res)+i+1]
最后两行代码值得思考。
(1)首先是妙用了 element in List 这个存在于python中的集成,但是可能大家对于nums[i+1:]有问题,为什么保证一定是另外一个索引在第一个索引之后?一定是这样的,因为题目明示了可以考虑只有一个答案,所以无论是2+3=5还是3+2=5都可以,找到一组就可以return,根本不存在重复的问题。
(2)其次就是对于result列表的返回。直接返回nums.index(res)难道不可以吗?当然不行,因为如果target=6,而列表中恰恰存在两个3,那么返回的结果必然是[第一个3的索引,第一个3的索引]。所以实际上从nums[i+1:]开始index是因为不希望第二个找到的元素和第一个索引重复。
力扣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#value+1
else:
hashmap[n1+n2] = 1#默认dict初值为0
# 如果 -(n1+n2) 存在于nums3和nums4, 存入结果
count = 0#记录会有多少相加为0的结果
for n3 in nums3:
for n4 in nums4:
key = -(n3 + n4)
if key in hashmap:#相加为0那么定可以拆分成num和-num
count += hashmap[key]#找到了则把结果+1
return count
1.本题在思考的时候和以上这篇力扣的题解思路相同,是打算将nums1和nums2相加,再将nums3和nums4相加,然后对于哈希表相比较,因为如果直接比较,目测复杂度为O(n3)。但是要思考的问题是nums[i]+nums[j]的和如果放到列表中那将是指数级的(见题目下面的要求)。所以用列表定然是不可行,所以题解作者使用了dict字典,好处在于key:value中的key并不需要是索引序列,所以即使和很大也仅仅作为一个key值。dict字典体现了对于key值的随意性。
2.对于dict的用法可以参考:Python字典(dict)详解_python dict-CSDN博客