代码随想录二刷day5 两数之和 四数相加 (三数之和 四数之和) ->多写几遍(解法双指针放缩)

news2024/11/15 9:02:03

二刷复习


文章目录

  • 二刷复习
  • 哈希表和哈希法
  • unordered 和 ordered 的不同
  • 242.有效字母的异位词
  • 349.两个数组的交集
  • 202.快乐数
  • 两数之和
  • 四数相加2
  • 383.赎金信
  • 三数之和(这道题需要重复做, 双指针)
  • 四数之和


哈希表和哈希法

哈希表:这是两种不一样的东西,首先哈希表是一种底层的数据结构
散列:其次,哈希法也叫散列法,是一种映射,key value的映射

python中如果想使用散列法可以使用set或者dict, set只储存键不储存值,dict可以储存键值对。
两者的底层实现都是哈希表,应该是相当于unordered_set和unordered_map; 所以dict可以在常数级别的增 删 查

哈希法,当我们遇到了要快速判断一个元素是否出现集合里的时候 或者 需要判断一个元素是否出现过,就要考虑哈希法。

unordered 和 ordered 的不同

首先无序和有序是针对key值的

(无序)unordered_set, map 底层是哈希表 所以查询 增删效率都是O(1)

(有序)ordered_set的话, c++std库中分为std::set和std::multiset; 我们知道set储存key值,ordered_set底层是用红黑树去储存key值的,这是一种平衡二叉树,所以key值是有序的,但key不可以修改,改动key值会导致整棵树的错乱,所以只能删除和增加。
set只能增删
在这里插入图片描述
ordered_map, map中key不能修改,value可以修改, 有序map的话 key是用红黑树储存的
在这里插入图片描述

242.有效字母的异位词

有效字母异位词
from collections import Counter

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        a, b = Counter(s), Counter(t)
        return a == b

349.两个数组的交集

两个数组的交集
交集用 & , 并起来用 |

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

202.快乐数

快乐数

为什么这道题在哈希表这节里,因为在这个循环中可能有一个数反复出现,颠来倒去还是那个就会死循环; 这个时候就可以考虑用哈希了,每次我们把结果加进集合里,如果发现出现在集合里了我们return False; 出现1了我们return True

数位运算

while n:
    x = n % 10
    对x操作
    n = n // 10

def isHappy(self, n: int) -> bool:
        def cal(num: int) -> int:
            sum_ = 0
            while num:
                sum_ += (num % 10) ** 2
                num = num // 10
            return sum_
 
        record = set()
        while True:
            sum = cal(n)
            if sum == 1: return True
            if sum in record: return False
            else: record.add(sum)
            n = sum

两数之和

两数之和
哈希表储存的是 数组下标, 由于我们遍历的时候可以知道其中一个下标了,可以直接return [i, a[tar-nums[i]]]

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        a = dict()
        for i in range(len(nums)):
            if target-nums[i] in a: return [i, a[target-nums[i]]]
            else: a[nums[i]] = i

四数相加2

四数相加2
这道题的关键在于,四个数组是分离的,可以单独从中选的,你选12 一组 34一组 和 13一组24一组是等价的;思路就在于分组做哈希

class Solution:
    def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:
        hashtable = dict()
        for a in nums1:
            for b in nums2:
                if a+b not in hashtable: hashtable[a+b] = 1
                else: hashtable[a+b] += 1
        cnt = 0
        for c in nums3:
            for d in nums4:
                if -(c+d) in hashtable: cnt += hashtable[-c-d]
        return cnt

383.赎金信

383赎金信
思路: 就是看第二个字符串是否能完全提供给第一个字符串,首先是第一个字符串有的元素第二个字符串都得有,其次对应的value要足够

class Solution:
    def canConstruct(self, ransomNote: str, magazine: str) -> bool:
        r, m = Counter(ransomNote), Counter(magazine)
        for key in r.keys():
            if key not in m.keys(): return False
            else:
                if r[key] <= m[key]: continue
                else: return False
        return True

三数之和(这道题需要重复做, 双指针)

三数之和
一个是双指针逻辑,一个是去重逻辑;去重放在哪;先放进去一组之后再去重;

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        n = len(nums)
        if n < 3: return []
        res = []
        nums.sort()

        for i in range(n):
            if nums[i] > 0: break
            if i > 0 and nums[i] == nums[i-1]: continue
            l, r = i+1, n-1
            while l < r:
                if nums[i] + nums[l] + nums[r] == 0: 
                    res.append([nums[i], nums[l], nums[r]])
                    while l < r and nums[l] == nums[l+1]: l += 1
                    while l < r and nums[r] == nums[r-1]: r -= 1
                    l += 1
                    r -= 1
                elif nums[i] + nums[l] + nums[r] < 0: l += 1
                else: r -= 1
        return res

四数之和

四数之和
和上面三数之和逻辑一样,都是双指针放缩;只是在双指针前增加了一层

class Solution:
    def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
        n = len(nums)
        if n < 4: return []
        res = []
        nums.sort()

        for i in range(n):
            if i > 0 and nums[i] == nums[i-1]: continue
            for j in range(i+1,n):
                if j > i+1 and nums[j] == nums[j-1]: continue
                p = j + 1
                q = n-1
                while p < q:
                    if nums[i] + nums[j] + nums[p] + nums[q] > target: q -= 1
                    elif nums[i] + nums[j] + nums[p] + nums[q] < target: p += 1
                    else:
                        res.append([nums[i], nums[j], nums[p], nums[q]])
                        while p < q and nums[p] == nums[p + 1]: p += 1
                        while p < q and nums[q] == nums[q - 1]: q -= 1
                        p += 1
                        q -= 1
        return res 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/131684.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

BGP建邻实验

目录 1.拓扑图 2.要求 3.实验思路 4.主要配置 5.测试 6.实验总结 1.拓扑图 2.要求 每台路由器都有两个环回&#xff0c;一个24的环回&#xff0c;一个32的环回&#xff1b;32的环回用于建邻&#xff0c;24的环回用于用户网段&#xff0c;最终实现所有24的环回可以ping通即…

BeyondCorp 打造得物零信任安全架构

1. 背景 当前&#xff0c;大部分企业都使用防火墙 (firewall) 来加强网络边界安全。然而&#xff0c;这种安全模型是有缺陷&#xff0c;因为当该边界被破坏&#xff0c;攻击者可以相对容易地访问公司的特权内部网。 边界安全模型通常被比作中世纪城堡&#xff1a;城墙厚厚的堡…

Mysql 报“Finished with error”,该怎么及解决?

用了多年的Mysql,当用navicat导库时&#xff0c;偶尔会遇到“Finished with error”错误&#xff0c; 如下图&#xff1a; 下面是我结合工作经验&#xff0c;总结一下&#xff0c;将相应情况及解决方法提供给网友们&#xff1a; 情况1&#xff1a;导入的sql数据库脚本文件中日…

vue3 antd项目实战——Form表单的重置【使用resetFields()重置form表单数据】

vue3 ant design vue项目实战——Form表单【resetFields重置form表单数据】关于form表单的文章场景复现resetFields()重置表单数据项目实战关于form表单的文章 文章内容文章链接Form表单提交和校验https://blog.csdn.net/XSL_HR/article/details/128495087?spm1001.2014.3001…

剑指offer----C语言版----第五天

目录 1. 重建二叉树 1.1 题目描述 1.2 复习基础知识 1.3 思路分析 1.4 总结 1. 重建二叉树 原题链接&#xff1a; 剑指 Offer 07. 重建二叉树 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/zhong-jian-er-cha-shu-lcof/submissions/ 1.1 题目描述…

极简四则运算解释器

前言: 这是最近完成的一个小的 demo&#xff0c;一个极简四则运算解释器。前面&#xff0c;已经基于这个想法发了两篇博客了&#xff1a; 四则运算和二叉树 简单四则运算语法树可视化 然后&#xff0c;前两天也就完成了这个总体的 demo 程序。本来整个程序的思路大致上有了&…

前端框架 Nuxt3 集成axios 配置跨域

目录 一、安装axios 二、Nuxt3项目集成axios 1、项目根目录下创建server/api目录 2、调用封装的单例axios对象 3、页面中调用请求函数 刚开始通过Nuxt3使用axios时&#xff0c;以为axios还需要配置跨域&#xff0c;但经过多次测试发现&#xff0c;在Nuxt3框架里并不需要配…

磨金石教育摄影技能干货分享|胡杨为什么被新疆人奉为精神图腾

痴迷于胡杨的摄影家 新疆摄影师王汉冰&#xff0c;昨天我们介绍了他一张《沙狐之眼.》&#xff0c;天人合一的画面让我们感到震撼。 除此之外王汉冰还有一个称号那就是“胡杨王”。 意思很明确&#xff0c;那就是擅长拍摄胡杨&#xff0c;作品也多是以胡杨见长。 新疆地大物博&…

【OpenCV 例程 300篇】253. 多帧图像(动图)的读取与保存

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】253. 多帧图像&#xff08;动图&#xff09;的读取与保存 1. 多帧图像&#xff08;动图&#xff09; 多帧图像是将多幅图像或帧数据保存在单个文件中&#xff0c;也称为多页图像或图像序列&#xf…

eNSP 实现静态路由中的路由备份

eNSP 实现静态路由中的路由备份 eNSP 实现静态路由中的路由备份&#xff1b;路由备份功能&#xff0c;可以提高网络的可靠性。用户可以根据实际情况&#xff0c;配置到同一目的地的多条路由&#xff0c;其中一条路由的优先级最高&#xff0c;作为主路由&#xff0c;其余的路由…

06 retrieveFileStream 之后需要调用 completePendingCommand 否则业务代码会存在问题

前言 问题是这样的 之前 同事碰到了这样的一个问题, 说是基于 ftp 客户端更新文件名字 更新失败 然后 看了一下, 原来是 调用了 retrieveFileStream, 然后 没有同步等待 数据传输完成, 然后 之后直接调用了 rename 的方法 然后 发现 rename 返回的是 false, 并且 文件名…

看我今年奋斗,观我未来之路

看我今年奋斗&#xff0c;观我未来之路 。 博客之星评选已经进行了几天。我也没有很去关注这东西&#xff0c;毕竟一个刚注册一年、写了无数水文的误导他人的博主&#xff0c;怎么可能拿到博客之星&#xff1f; 我&#xff0c;只是无聊时转发一下&#xff0c;那句毫无新意、从…

大学生如何在网上赚零花钱,适合学生党可做的零花钱项目

大学生的课余时间是非常多的&#xff0c;利用这些时间&#xff0c;我们可以去做点小兼职赚点零花钱&#xff0c;既可以补贴生活费&#xff0c;又可以获得不一样的生活体验。 现在大学生完全可以不用去大街上发传单&#xff0c;或者去咖啡店当服务员了&#xff0c;自己在网上就…

【数据结构】单链表(线性表)的实现

目录 一、什么是链表 二、单链表的实现 1、动态申请一个结点 2、单链表打印 3、单链表尾插 4、单链表的尾删 5、单链表的头插 6、单链表头删 7、单链表查找 8、单链表在pos位置之后插入x 9、单链表删除pos位置之后的值 10、单链表在pos位置之前插入x 11、单链表删除pos位置的值…

前端期末考试试题及参考答案(04)

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 一、 填空题 在页面中&#xff0c; ______标签用于创建一个表单。< form>中的______属性用于指定接收并处理表单数据的服务器url地址。< form>中的______表示以…

基于springboot+Vue的疫情防控系统(程序+数据库)

大家好✌&#xff01;我是CZ淡陌。一名专注以理论为基础实战为主的技术博主&#xff0c;将再这里为大家分享优质的实战项目&#xff0c;本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路…

Linux 资源限制 setrlimit

有的时候为了避免程序毫无意义的占用CPU&#xff08;如死循环&#xff09;、过度占用内存&#xff08;如内存泄漏&#xff09;&#xff0c;我们可以限制程序使用的资源。 下面主要从两个角度限制资源&#xff1a; 限制程序累计运行时长限制可以使用的内存大小 限制资源使用到…

微信小程序 | 小程序系统API调用

&#x1f5a5;️ 微信小程序专栏&#xff1a;小程序系统API调用 &#x1f9d1;‍&#x1f4bc; 个人简介&#xff1a;一个不甘平庸的平凡人&#x1f36c; ✨ 个人主页&#xff1a;CoderHing的个人主页 &#x1f340; 格言: ☀️ 路漫漫其修远兮,吾将上下而求索☀️ &#x1f44…

Go语言进阶

一、并发 VS 并行 1: 多线程程序在一个核的CPU上运行 2: 多线程程序在多个核的CPU上运行 Go可以充分发挥多核优势&#xff0c;高效运行。 线程&#xff1a;用户态&#xff0c;轻量级线程&#xff0c;栈MB级别。 协程&#xff1a;内核态&#xff0c;线程内跑多个协程&#xff…

最短路径的java代码实现

1.最短路径定义及性质 有了加权有向图之后&#xff0c;我们立刻就能联想到实际生活中的使用场景&#xff0c;例如在一副地图中&#xff0c;找到顶点a与地点b之间的路径&#xff0c;这条路径可以是距离最短&#xff0c;也可以是时间最短&#xff0c;也可以是费用最小等&#xff…