代码随想录算法-day6

  • 哈希表理论基础
  • LeetCode 242.有效的字母异位词
  • LeetCode 349. 两个数组的交集
  • LeetCode 202. 快乐数
  • LeetCode 1. 两数之和

前言

最近比较忙,作业拉下好多,要加紧补上!


哈希表理论基础

1-学前疑问

  • 什么是哈希表,它的内部实现原理是什么样的?
  • 为什么需要哈希表,它有什么优势?
    答:可以快速判断一个元素是否出现在集合当中
  • 解释一下哈希函数
    答:哈希函数就是将元素映射成哈希表中索引的法则,是哈希表设计的核心环节
  • 理解哈希碰撞
    答:由于dataSize大于tableSize或者哈希函数设计不当,不同的元素经哈希函数映射后会得到相同的索引,有封闭寻址法和开放寻址法等消解方法。
  • 常见哈希表的类型、实现方法和区别
    答:三个经典的哈希表解释数组array、集合set与映射map

2-学习中

  • 如何理解“数组解释哈希表”
  • 如何理解哈希表是“牺牲了空间换取了时间”
  • set和map分别是什么操作

3-学后总结


LeetCode 242.有效的字母异位词

题目链接/文章讲解/视频讲解

242-1 原始想法

要注意,“字母异位词”指的是仅包含相同字母且每种字母的数量也相同的两个字符串。

242-2 随想录提醒

这里不需要考虑字母出现的顺序,所以可以维护size均为26的数组record1和record2,用于记录字符串中各个字母的数量,并将两个字符串的record进行比较。

242-3 最终题解

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        record = [0] * 26
        for i in s:
            record[ord(i) - ord('a')] += 1 # 使用字母相对a的位置计算其在record中的索引
        for i in t:
            record[ord(i) - ord('a')] -= 1
        return True if record == [0]*26 else False

242-4 Debug过程

代码还是比较容易写的,这里主要讲下python中的内置函数ord(),它用于将单个字符转化为Unicode的形式(默认转化为十进制格式),可以参照这篇博客另一篇博客对Unicode、ASCII和UTF-x做了详细介绍。


LeetCode 349. 两个数组的交集

题目链接/文章讲解/视频讲解

349-1 原始想法

349-2 随想录提醒

主要就是使用数组自制哈希表(仔细看题目提示,nums元素的数值和其size都小于1000)或者直接借用现成的数据结构(python中是字典dict和集合set)

349-3 最终题解

这里主要记录使用数组自制哈希表的方法,和随想录官方答案一样,进行了多次循环。

class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        arr1, arr2 = [0]*1001, [0]*1001
        result = []
        for i in nums1: arr1[i] += 1
        for j in nums2: arr2[j] += 1
        for k in range(1001):
            if arr1[k]*arr2[k]>0: 
                result.append(k) 
        return result

349-4 Debug过程


LeetCode 202. 快乐数

题目链接/文章讲解

202-1 原始想法

这题……看看就好,不要太当真了,图个“快乐”U•ェ•*U。

202-2 随想录提醒

随想录是这么说的,但我感觉这背后应该有数论的证明(所以对这题不用太纠结了):

题目中说了会无限循环,那么也就是说求和的过程中,sum会重复出现,这对解题很重要!

202-3 最终题解

class Solution:
    def isHappy(self, n: int) -> bool:
        checkedSum = set()
        if n==1: return True
        else:
            while n not in checkedSum:
                checkedSum.add(n)
                n = sum(int(i)**2 for i in str(n))
            return True if n==1 else False

202-4 Debug过程


LeetCode 1. 两数之和

题目链接/文章讲解/视频讲解

1-1 原始想法

如何表示“和”这一概念,这是该题的难点

1-2 随想录提醒

这题可以转化成这样想:对于数组nums中的任一元素i,需要寻找target-i是否存在于数组中。当然,直接这样编码就和多重循环的暴力解法无异,但可以引入哈希的思想,将每个遍历过的元素储存于哈希表中,发挥哈希表利于判断一个元素是否存在的优势,就可以解决问题,将问题时间复杂度降低为O(n)
同时要注意,本题构建哈希表时应当采用map的基本结构(对于于python的字典dict),既去重的存储数值,又要保存下标的信息。

1-3 最终题解

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        checked = dict()
        for idx, n in enumerate(nums):
            finder = target - n
            if finder in checked: 
                return [idx, checked[finder]]
            else:
                checked[n] = idx

有小伙伴可能会问:为什么使用字典的key储存nums中的元素数值,value存储元素下标,能不能反过来?答案是可以的,但不建议。按上述方法存储,当nums中有相同数值是元素时,数值key不会改变,但这一数值的value也就是下标会得到更新;反过来,value永远的不一样,会增加字典的长度。

1-4 Debug过程

一次AC!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值