454.四数相加II
解题思路:
- 四个数相加,先用两个循环让两个数相加,写入字典,再循环另外两个数组,判断0-和是否在第一个字典中,如果在,则count+=dict[key],注意不是count+1,因为重复的也算。
-
class Solution: def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int: dict={} k = 0 for i in nums1: for j in nums2: dict[i+j]= dict.get(i+j,0)+1 count = 0 for k in nums3: for l in nums4: mid =0 - (k+l) if mid in dict: count += dict[mid] return count
383. 赎金信
- 解题思路:首先记录杂志中每个字母出现的个数到字典中
- 再循环赎金信中的字母,如果不在则返回假,注意还有一种情况是字母用完即count[key]=0
- 如果存在,则count[key]-=1需要用掉一个字母;
-
class Solution: def canConstruct(self, ransomNote: str, magazine: str) -> bool: count = {} for s in magazine: count[s]=count.get(s,0)+1 for s in ransomNote: if s not in count or count[s]==0: return False count[s]-=1 return True
15. 三数之和
-
class Solution: def threeSum(self, nums: List[int]) -> List[List[int]]: nums= sorted(nums) count=[] for i in range(len(nums)): if nums[i]>0: return count if i>0 and nums[i]==nums[i-1]: continue left = i+1 right = len(nums)-1 while left<right: sum = nums[i]+nums[left]+nums[right] if sum > 0: right -= 1 elif sum < 0: left += 1 else: count.append([nums[i],nums[left],nums[right]]) while left<right and nums[left]==nums[left+1]: left +=1 while left<right and nums[right]==nums[right-1]: right -=1 right -=1 left +=1 return count
- 18. 四数之和
- 解题关键:在三数之和的基础上套两层for循环,注意第二层for循环的去重条件
-
class Solution: def fourSum(self, nums: List[int], target: int) -> List[List[int]]: nums = sorted(nums) result = [] n = len(nums) for i in range(n): if i >0 and nums[i]==nums[i-1]: continue for j in range(i+1,n): if j >i+1 and nums[j]==nums[j-1]: continue left = j+1 right = n-1 while left<right: sums= nums[i]+nums[j]+nums[left]+nums[right] if sums>target: right-=1 elif sums<target: left+=1 else: result.append([nums[i],nums[j],nums[left],nums[right]]) while left<right and nums[left]==nums[left+1]: left+=1 while left<right and nums[right]==nums[right-1]: right-=1 left += 1 right -=1 return result