四数相加II+赎金信+三数之和+四数之和+两数相加

四数相加II

class Solution:
    def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:
        #使用哈希法的经典题目.四个数组是独立的因此只需要考虑最后相加为0的元祖就行了,不用考虑重复的元素。
        map_=dict()
        for i in nums1:
            for j in nums2:
                if i+j in map_:
                    map_[i+j]+=1
                else:
                    map_[i+j]=1
        count=0
        for i in nums3:
            for j in nums4:
                key=-i-j
                if key in map_:
                    count=count+map_[key]
        return count

赎金信

class Solution:
    def canConstruct(self, ransomNote: str, magazine: str) -> bool:
        record=[0]*26
        for i in magazine:
            record[ord(i)-ord('a')]+=1
        for j in ransomNote:
            if record[ord(j)-ord('a')]==0:
                return False
            else:
                record[ord(j)-ord('a')]-=1
        return True

三数之和

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        #使用双指针方法较好
        ans=[]
        n=len(nums)
        nums.sort()
        for i in range(n):
            left=i+1
            right=n-1
            if nums[i]>0:
                break
            if i>=1 and nums[i]==nums[i-1]:
                continue
            while left<right:
                total=nums[i]+nums[left]+nums[right]
                if total<0:
                    left+=1
                elif total>0:
                    right-=1
                else:
                    ans.append([nums[i],nums[left],nums[right]])
                    while left!=right and nums[left]==nums[left+1]: left+=1 #出去b
                    while left!=right and nums[right]==nums[right-1]:right-=1 #去重c
                    left+=1
                    right-=1
        return ans

四数之和

class Solution:
    def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
        nums.sort()
        n=len(nums)
        ans=[]
        for i in range(n):
            if i>0 and nums[i]==nums[i-1]:continue
            for k in range(i+1,n):
                if k>i+1 and nums[k]==nums[k-1]:continue
                left=k+1
                right=n-1
                while left<right:
                    total=nums[i]+nums[k]+nums[left]+nums[right]
                    if total<target:
                        left+=1
                    elif total>target:
                        right-=1
                    else:
                        ans.append([nums[i],nums[k],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 ans

两数相加`

class Solution:
    def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
        #初始化链表
        head=tree=ListNode()
        temp=val=0
        while temp or l1 or l2:
            val=temp
            if l1:
                val=l1.val + val
                l1=l1.next
            if l2:
                val=l2.val+val
                l2=l2.next
            temp=val // 10 #取商
            val=val % 10 #取余
            #实现链表的连接
            tree.next = ListNode(val)
            tree = tree.next
        return head.next
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值