代码随想录打卡d7:三数之和、赎金信、四数相加II、四数之和

三数之和

刷题日期:2024-04-23
[[015.三数之和]]

思路

双指针法

算法思路

数组先排序, 使用for循环遍历子数组, 在子数组中双指针分别指向两端, 求和, 比0大则右指针左移, 比0小则左指针右移, 等于0则双指针同时向内移动

算法细节

1. 去重逻辑

在使用i遍历子数组的时候, 若碰到相同的元素则直接前进; 判断三数和为0时, j,k的移动也是如此, 遇到相同的元素继续移动

Code

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        nums.sort()
        result = []
        i = 0
        while i <= len(nums) - 3:
            j = i + 1
            k = len(nums) - 1
            while j < k:
                if nums[i] + nums[j] + nums[k]  == 0:
                    result.append([nums[i], nums[j], nums[k]])
                    k -= 1
                    j += 1
                    while j < k and nums[k + 1] == nums[k]:
                        k -= 1
                    while j < k and nums[j - 1] == nums[j]:
                        j += 1
                elif nums[i] + nums[j] + nums[k]  > 0:
                    k -= 1                   
                elif nums[i] + nums[j] + nums[k]  < 0:
                    j += 1
            while nums[i + 1] == nums[i] and i < len(nums) - 3:
                i += 1
            i += 1
        return result

赎金信

刷题日期:2024-04-23
[[383. 赎金信]]

思路

哈希表

算法思路

magazine构建dict, 遍历ransomNote的每个字符, 如果dict没出现直接返回False, 若出现则判断dict中键的值, 若等于0则返回False, 遍历完则返回True

算法细节

1.

Code

class Solution:
    def canConstruct(self, ransomNote: str, magazine: str) -> bool:
        dict_mag = {}

        for i in range(len(magazine)):
            if magazine[i] in dict_mag:
                dict_mag[magazine[i]] += 1
            else:
                dict_mag[magazine[i]] = 1
                
        for i in range(len(ransomNote)):
            if ransomNote[i] in dict_mag:
                if dict_mag[ransomNote[i]] > 0:
                    dict_mag[ransomNote[i]] -= 1
                else:
                    return False
            else:
                return False
        
        return True

四数相加II

刷题日期:2024-04-23
[[454.四数相加]]

思路

哈希表

算法思路

和两数之和类似, 但是将四个数组两两看作一个, 先遍历1,2数组, 把和及出现次数放到dict中, 再遍历3,4数组, 若(0-3,4数组的和)在dict出现, 则累加出现次数, 返回出现次数的和

算法细节

1.

Code

class Solution:
    def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:
        count = 0

        dict_1 = {}
        for i in nums1:
            for j in nums2:
                if i + j in dict_1:
                    dict_1[i + j] += 1
                else:
                    dict_1[i + j] = 1

        for i in nums3:
            for j in nums4:
                if (0 - i - j) in dict_1:
                    count += dict_1[0 - i - j]
        
        return count

四数之和

刷题日期:2024-04-23
[[018.四数之和]]

思路

与三数之和类似

算法思路

三数之和使用一个for循环限定双指针移动范围, 四数之和需要使用两个for循环

算法细节

1.

Code

class Solution:
    def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
        nums.sort()
        result = []
        i = 0
        l = len(nums) - 1

        while i < len(nums) - 3:
            l = i + 1
            while l < len(nums) - 2:
                j = l + 1
                k = len(nums) - 1
                while j < k:
                    if nums[i] + nums[j] + nums[k] + nums[l] == target:
                        result.append([nums[i], nums[l], nums[j], nums[k]])
                        k -= 1
                        j += 1
                        while j < k and nums[k + 1] == nums[k]:
                            k -= 1
                        while j < k and nums[j - 1] == nums[j]:
                            j += 1
                    elif nums[i] + nums[j] + nums[k] + nums[l] > target:
                        k -= 1
                    elif nums[i] + nums[j] + nums[k] + nums[l] < target:
                        j += 1               
                while nums[l + 1] == nums[l] and l < len(nums) - 2:
                    l += 1
                l += 1
            while nums[i + 1] == nums[i] and i < len(nums) - 3:
                i += 1
            i += 1
        return result
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值