代码随想录算法训练营第七天

45 阅读2分钟

383.赎金信

本题和字母异位词有异曲同工之妙。只需要查看字典中有没有哪个key的value是小于0的(有的元素被多减去了),就可以判断

class Solution:
    def canConstruct(self, ransomNote: str, magazine: str) -> bool:
        record=dict()
        for i in magazine:
            record[i]=record.get(i,0)+1
        for i in ransomNote:
            record[i]=record.get(i,0)-1
        for key in record.keys():
            if record[key]<0:
                return False
        return True

四数相加Ⅱ

  1. 遍历A和B数组,统计出两个数组元素之和,和出现的次数,放到字典中
  2. 定义一个cnt,统计0-n3-n4出现的次数
  3. 遍历C和D数组,找到如果 0-(n3+n4) 在map中出现过的话,就用count把map中key对应的value也就是出现次数统计出来。
  4. 返回统计值cnt
class Solution:
    def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:
        record=dict()
        for n1 in nums1:
            for n2 in nums2:
                if n1+n2 in record:
                    record[n1+n2]+=1
                else:
                    record[n1+n2]=1
        cnt=0 #用来统计n1+n2+n3+n4的数量
        for n3 in nums3:
            for n4 in nums4:
                if 0-(n3+n4) in record:
                    cnt+=record[0-(n3+n4)]
        return cnt

三数之和

本题并不像上一题可以利用哈希表的想法,但是可以利用一下双指针的思路;除此之外,因为要求不能有重复的元素,所以还要考虑去重的影响。

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        res=[]
        nums.sort()
        for i in range(len(nums)):
            if nums[i]>0:
                return res
            if i>0 and nums[i]==nums[i-1]:
                continue
            left=i+1;right=len(nums)-1
            while left < right:
                if nums[i]+nums[left]+nums[right]<0:
                    left+=1
                elif nums[i]+nums[left]+nums[right]>0:
                    right-=1
                else:
                    res.append([nums[i],nums[left],nums[right]])
                while right > left and nums[right]==nums[right-1]:
                    right-=1
                while right > left and nums[left]==nums[left+1]:
                    left+=1
                right-=1
                left+=1
        return res

倒数第二行和第三行的操作是在三数之和等于0时去寻找新的可能,因为当三数之和满足要求时,只移动一个指针是肯定无法满足要求的

四数之和