代码随想录算法训练营第6天—哈希表02 | *454.四数相加II、383. 赎金信、*15. 三数之和、18. 四数之和

*454.四数相加II

题目链接/文章讲解/视频讲解:https://programmercarl.com/0454.%E5%9B%9B%E6%95%B0%E7%9B%B8%E5%8A%A0II.html

  • 考点
    • 哈希结构(字典)
  • 我的思路
    • 三层for循环分别遍历前三个数组,在第三层循环里查找前三个数组元素和的相反数是否在第四个数组中,如果在,就计数加1,最后返回计数值
  • 视频讲解关键点总结
    • 一、由于暴力遍历的解法时间复杂度过高,因此将四个数组两两为一对进行处理,从而降低时间复杂度
      • 前两个数组,把它们的元素两两配对求和,并统计每个和值出现的次数(因为题目里允许重复的情况)
      • 后两个数组,两两元素配对求和再求相反数之后查询其是否在前两个数组所求的和值里出现过
    • 二、字典的运用:由于在一的第一个步骤里,有储存和值及其出现次数的需求(需要键值对),同时在第二个步骤里又有多次查询元素的需求(哈希结构查询速度快),因此想到运用哈希结构字典
  • 我的思路的问题
    • 一、没有理解题目里找元组的内含
      • 找元组的内含在于数值重复但是位置不相同的组合也会被计数
      • 因此,我的算法将会遗漏一些数值重复的情况
    • 二、没有把时间复杂度压缩到最低
      • 使用视频讲解的思路可以把时间复杂度压缩到n方,而我的思路是n的三次方
  • 代码书写问题
  • 可执行代码
class Solution(object):
    def fourSumCount(self, nums1, nums2, nums3, nums4):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :type nums3: List[int]
        :type nums4: List[int]
        :rtype: int
        """
        nums = 0
        my_dict = {}
        for data in nums1:
            for data_ in nums2:
                if data + data_ not in my_dict:
                    my_dict[data + data_] = 1
                else:
                    my_dict[data + data_] += 1
        for data in nums3:
            for data_ in nums4:
                if -(data + data_) in my_dict:
                    nums += my_dict[-(data + data_)]
        return nums

383. 赎金信

题目链接/文章讲解:https://programmercarl.com/0383.%E8%B5%8E%E9%87%91%E4%BF%A1.html

  • 考点
    • 哈希结构(数组)
  • 我的思路
    • 先把第一个字符串的字符依次保存在列表中
    • 之后遍历第二个字符串,判断其字符是否出现在列表中,如果出现,移除该字符
    • 最后如果列表长度为0,说明满足要求,返回true,否则false
  • 视频讲解关键点总结
    • 未看视频
    • 文字讲解关键点在于通过小写字母只有20个且对应于Unicode编码来将其(哈希)映射到一个26维大小的列表上
  • 我的思路的问题
    • 虽然使用了列表(数组)结构,也避免了嵌套循环、降低了时间复杂度,但实际上没有做哈希映射
  • 代码书写问题
  • 可执行代码
class Solution(object):
    def canConstruct(self, ransomNote, magazine):
        """
        :type ransomNote: str
        :type magazine: str
        :rtype: bool
        """
        datalist = []
        for data in ransomNote:
            datalist.append(data)
        for data in magazine:
            if data in datalist:
                datalist.remove(data)
        if len(datalist) == 0:
            return True
        else:
            return False

*15. 三数之和

题目链接/文章讲解/视频讲解:https://programmercarl.com/0015.%E4%B8%89%E6%95%B0%E4%B9%8B%E5%92%8C.html

  • 考点
    • 去重
    • 双指针或哈希法
  • 我的思路
    • 只实现了哈希法,即两层for循环确定a,b的和值,之后在剩余部分用哈希结构查找是否有-(a+b)
  • 视频讲解关键点总结
    • 哈希法在寻找三元组时很方便,但是去重的逻辑不太好写,因此本题使用双指针的方式进行解决
    • 一、数组排序(方便后续的三元组搜索和去重逻辑)
    • 二、实现三元组的搜索,首先for循环,定义i遍历数组,循环内,定义左右指针,分别指向i+1和数组最后一个元素,如果i、left、right指针指向值的和小于0,则左指针+1,若大于0,则right-1,若等于0,记录当前三元组,之后利用小循环继续遍历left和right指针寻找是否有合适的三元组
    • 三、去重,题目要求两两三元组之间不能数值完全相同,因此分别进行i和left、right的去重
      • 在外层循环的最前面进行i的去重,即找到与上一元素不同的i再继续后续操作(如果去重条件为找到与下一元素不同的i再继续后续操作,会导致遗漏一些满足要求的三元组)
      • 在二的双重循环的内层循环的最后进行left和right的去重判断,如果left和后续right之前的元素相等,把left移动到right之前、且与当前left不同的那个元素位置上;如果right和前面的、left后面的元素相同,把right移动到left之后、且与当前left不同的那个元素位置上
  • 我的思路的问题
    • 没有思考去重的逻辑
  • 代码书写问题
  • 可执行代码
class Solution(object):
    def threeSum(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        nums.sort()
        if nums[0] > 0:
            return []
        my_list = []
        for i, data in enumerate(nums[:len(nums) - 2]):
            if i > 0 and data == nums[i - 1]:
                continue
            left = i + 1
            right = len(nums) - 1
            while left < right:
                if data + nums[left] + nums[right] > 0:
                    right -= 1
                    continue
                elif data + nums[left] + nums[right] < 0:
                    left += 1
                    continue
                else:
                    my_list.append([data, 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 my_list

你可能感兴趣的:(Leetcode,代码随想录(Python),算法,散列表,哈希算法,python)