两个数组的交集

两个数组的交集

在这里插入图片描述

def intersection(nums1: list[int], nums2: list[int]) -> list[int]:
    res = []
    nums1 = set(nums1)
    nums2 = set(nums2)
    if len(nums1) <= len(nums2):
        for i in nums1:
            if i in nums2:
                res.append(i)
    else:
        for i in nums2:
            if i in nums1:
                res.append(i)
    return res

nums1 = [4,9,5]
nums2 = [9,4,9,8,4]
print(intersection(nums1,nums2))

最简版本:

def intersection(nums1: list[int], nums2: list[int]) -> list[int]:
    return list(set(nums1) & set(nums2))

下面这种:

count1 = [0]*1001
        count2 = [0]*1001
        result = []
        for i in range(len(nums1)):
            count1[nums1[i]]+=1
        for j in range(len(nums2)):
            count2[nums2[j]]+=1
        for k in range(1001):
            if count1[k]*count2[k]>0:
                result.append(k)
        return result

不过这种效率肯定是最低的

两个数组的交集 II

在这里插入图片描述

def intersect(self, nums1: list[int], nums2: list[int]) -> list[int]:
    nums1.sort()
    nums2.sort()
    left,right = 0,0
    res = []
    while left < len(nums1) and right < len(nums2):
        if nums1[left] < nums2[right]:
            left += 1
        elif nums1[left] > nums2[right]:
            right += 1
        else:
            res.append(nums1[left])
            left += 1
            right += 1
    return res

感觉题解里这个解法挺不错的

快乐数

在这里插入图片描述

def isHappy(n: int) -> bool:
    def get_sum(n):
        lis = list(str(n))
        Sum = 0
        for i in lis:
            Sum += int(i) ** 2
        return Sum

    res = [n]
    n = get_sum(n)
    while 1:
        if n == 1:
            return True
        else:
            if n in res:
                return False
            res.append(n)
            n = get_sum(n)

精简高效版:

def isHappy(n: int) -> bool:
    res = [n]
    while n != 1:
        n = sum(int(i) ** 2 for i in str(n))
        if n in res:
            return False
        res.append(n)
    return True

两数之和

在这里插入图片描述

def twoSum(nums, target):
    d = {i:x for i,x in enumerate(nums)}
    sort_d = sorted(d.items(),key=lambda x:x[1]) # 列表里面装数组
    nums.sort()
    left = 0
    right = len(nums) - 1

    while left <= right:
        if nums[left] + nums[right] < target:
            left += 1
        elif nums[left] + nums[right] > target:
            right -= 1
        else:
            return [sort_d[left][0],sort_d[right][0]]

三数之和

在这里插入图片描述

def threeSum(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[left] + nums[right] < -nums[i]:
                left += 1
            elif nums[left] + nums[right] > -nums[i]:
                right -= 1
            else:
                res.append([nums[left],nums[right],nums[i]])
                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 res

nums = [-1,0,1,2,-1,-4]
print(threeSum(nums))

四数之和

在这里插入图片描述

def fourSum(nums: list[int], target: int) -> list[list[int]]:
    length = len(nums)
    if length < 4:
        return []
    nums.sort()
    res = []

    for i in range(length - 3):
        if i > 0 and nums[i] == nums[i - 1]:
            continue
        if nums[i] + nums[i + 1] + nums[i + 2] + nums[i + 3] > target:
            break
        if nums[i] + nums[length - 1] + nums[length - 2] + nums[length - 3] < target:
            continue
        temp = target - nums[i]
        for j in range(i + 1, length - 2):
            if j > i + 1 and nums[j] == nums[j - 1]:
                continue
            left = j + 1
            right = length - 1
            while left < right:
                Sum = nums[j] + nums[left] + nums[right]
                if Sum < temp:
                    left += 1
                elif Sum > temp:
                    right -= 1
                else:
                    res.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 res

两数,三数,四数之和都挺类似的,就是限制条件多加点就行

四数相加 Ⅱ

在这里插入图片描述

def fourSumCount(nums1: list[int], nums2: list[int], nums3: list[int], nums4: list[int]) -> int:
    hashmap = dict()
    for n1 in nums1:
        for n2 in nums2:
            if n1 + n2 in hashmap:
                hashmap[n1 + n2] += 1
            else:
                hashmap[n1 + n2] = 1

    count = 0
    for n3 in nums3:
        for n4 in nums4:
            key = - n3 - n4
            if key in hashmap:
                count += hashmap[key]

    return count

nums1 = [1,2]
nums2 = [-2,-1]
nums3 = [-1,2]
nums4 = [0,2]

print(fourSumCount(nums1,nums2,nums3,nums4))

或者:

def fourSumCount(nums1: list[int], nums2: list[int], nums3: list[int], nums4: list[int]) -> int:
    rec, cnt = defaultdict(lambda :0),0
    for i in nums1:
        for j in nums2:
            rec[i + j] += 1

    for i in nums3:
        for j in nums4:
            cnt += rec.get(-(i + j),0) # 从字典 rec 中获取键为 -(i + j) 的值,如果该键不存在,则返回默认值 0

defaultdictget((i + j),0)

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值