优选算法精品解析

1.双指针(前后/左右双指针)

1.1 283.移动零

  •  快排双指针的核心算法
    • 左边所有数 <= tmp,右边所有数 > tmp,以tmp这个数为标准

1.2 1089.复习零

  •  如果一对双指针从左向右不行,那么就从右向左,换一个方向

1.3 202.快乐数

  •  双指针中的快慢指针: slow+1,fast+2

1.4 11.最多盛水的容器 

  • 利用单调性 

1.5 611.有效三角形个数 

  • 排序 + 固定一个指针(遍历) + 双指针

1.6 剑指 Offer 57. 和为s的两个数字 

1.7 15. 三数之和 

 

  •  关键点: 去重 + 越界

1.8 18. 四数之和 

  •  比三数之和多了一层循环,注意: 数值大,需要使用long long
  • long long aim = (long long)target - nums[fix1] - nums[fix2];
  • int sum = nums[left]+nums[right]; 

2.滑动窗口(同向双指针)

2.1 209.长度最小的子数组

  1. left = 0,right = 0;
  2. 进窗口
  3. 判断
  4. 出窗口
  5. 更新结果(这个的顺序不一定) 

2.2  3. 无重复字符的最长子串

2.3  1004.最大连续1的个数III

 2.4 1658. 将 x 减到 0 的最小操作数

  • 这题目的核心就是转换->正难则反 

 2.5 904.水果成篮

  • 这题文字多,但很唬人,需要转换 

2.6 438. 找到字符串中所有字母异位词

  • 在这个滑动窗口中:窗口的大小没有变,算是一种特殊情况 

2.7 30. 串联所有单词的子串 

  • 转换->找到字符串中所有字母异位词
  • 注意:因为原数据是字符串,所以需要循环len次 

 2.8 76. 最小覆盖子串

  • int kinds = 0;//统计p的有效字符有多少种

  • int count= 0;//统计s的有效字符有多少种

  • 进窗口->进入时,只有hash2[in] == hash1[in]时,count才会加1,但只要进入映射就会加1
  • 出窗口->出去后,只有hash2[in] == hash1[in]时,count才会减1,但只要进入映射就会减1

 3.二分查找(左端点 && 右端点)

只要有二段性就可以使用二分查找

 朴素的二分模板

查找左边界的二分模板

查找右边界的二分模板 

3.1 704. 二分查找 

3.2 34. 在排序数组中查找元素的第一个和最后一个位置

  •  if(nums[left] != target){return {-1,-1};} 注意:考虑找不到的情况 

3.3. 35. 搜索插入位置 

 

  •  结果在左端点

3.4  69. x 的平方根

3.5  852. 山脉数组的峰顶索引

  •  arr[mid] > arr[mid - 1] -> left = mid
  • arr[mid] < arr[mid - 1] -> right = mid - 1;

3.6 162.寻找峰值 

3.7 153. 寻找旋转排序数组中的最小值 

  •  这里我选择的是以D点作为参考点
  • 如果选择A的则需要考虑其他情况(比如旋转n次,数组和原数组相等)

3.8 剑指 Offer 53 - II. 0~n-1中缺失的数字 

  • 注意特殊情况:[1],[0]时 return left == nums[left] ? left + 1 : left

只要有二段性就可以用二分法

 4. 前缀和(动态规划)

4.1 【模板】前缀和

  •  注意:这里需要开n+1个大小的数组,为了解决边界情况

4.2 【模板】二维前缀和 

  •  公式->看边界,在边界的点不变,其他-1
  • 注意:这里需要开n+1个大小的数组,为了解决边界情况 

4.3  724. 寻找数组的中心下标

  •  注意:这里只需要开n个大小的数组,至于要开多大,需要具体问题具体分析

4.4  238. 除自身以外数组的乘积

4.5 560. 和为 K 的子数组 

  •  前缀和加入哈希表的时机?
    • 计算i位置之前,哈希表里面只保留[0,i-1]位置的前缀和,
      所以在使用完之后再加入哈希表
  • 不用真的创建一个前缀和数组?
    • 用一个变量sum来标记前一个位置的前缀和
  • 如果整个前缀和 等于 k呢?
    • hash[0] = 1;
    • 比如: [1,   2,   3] k = 3时,1和2等于3,然后结果3需要放入hash中,哈希表里面只保留[0,i-1]位置的前缀和
  • 注意: 这题有正负,可能会在一段区间内相互抵消 

4.6 974. 和可被 K 整除的子数组 

 

  • 这题的难点在:同余定理,负数修正 ,题意转换

4.7  525. 连续数组

  •  这题也是需要前缀和 && 哈希表
  • hash<int,int>中存的是前缀和 :下标
  • 注意:hash[0] = -1;(默认前缀和为0的情况) 

 4.8 1314. 矩阵区域和

 

  •  注意:映射关系

5. 位运算 

 常见位运算总结

1. 基础位运算

  • << : 表示二进制向左移动
  • >> : 表示二进制向右移动
  • ~ : 表示二进制位按位取反
  • & : 表示有0就是0
  • | : 表示有1就是1

2. 给一个数n,确定它的二进制表示中的第x位是0,还是1

  • n: 0 1 1 0 1 0 1 0 0 1
  • (n >> x) & 1 ,结果是0则为0,是1则为1

3. 将一个数n的二进制表示的第x位修改成1

  • n: 0 1 1 0 1 0 1 0 0 1
  • n = n | (1 << x)

4. 将一个数n的二进制表示的第x为修改成0

  • n: 0 1 1 0 1 0 1 0 0 1
  • n = n & (~(1 << x))

5. 位图思想

  • 位图的0和1也可以用来存有效信息 

6. 提取一个数n二进制表示中最右侧的1(lowbit操作)

  • n & -n

7. 干掉一个数(n) 二进制表示中最右侧的1

  • n & (n - 1)

8. 位运算符的优先级

  • 尽量能加括号,就加括号

9. 异或(^)运算符的运算律

  • a ^ 0 = a
  • a ^ a = 0
  • a ^ b ^ c = a ^ (b ^ c)

5.1 面试题 01.01. 判定字符是否唯一 

  •  利用位图来解决,0表示没有出现这个字符,1表示出现了这个字符
  • 注: len > 26,则必定会出现重复的字符

5.2  268. 丢失的数字

5.3 371. 两整数之和 

 

  •  两数之后的结果 = 无进位的二进制 + 有进位的二进制
  • 需要一直循环直到 进位为0,

5.4 137. 只出现一次的数字II 

  •  step1:依次修改ret中的每一位
  • step2:计算nums中所有的数的第i位的和,记得%3

5.5 面试题 17.19. 消失的两个数字 

 

6. 模拟

6.1 1576. 替换所有的问号

 

  • 只要保证?前,和?后的字符不和这个替换的字符一样就行了 

6.2  495. 提莫攻击

6.3  6. N 字形变换

6.4 38. 外观数列 

 6.5 1419. 数青蛙

7. 分治 - 快速排序 

三指针 + 交换 + (递归)

7.1  75. 颜色分类

7.2  912. 排序数组

7.3 215. 数组中的第K个最大元素 

  • 如果在递归过程中只有一个元素,则直接返回 这个值

7.4  LCR 159. 库存管理 III

  • 这题和上面类似,但是这是找最小k个数,而不是一个数字
  • 则排完序之后,不用返回第k个数
  • 最后直接返回return {stock.begin(),stock.begin()+cnt}; 

8. 分治 - 归并排序 

8.1 912. 排序数组 

8.2 LCR 170. 交易逆序对的总数 

  •  逆序数 = 左边的逆序数 + 右边的逆序数 + 一左一右的逆序数

 8.3 315. 计算右侧小于当前元素的个数

  • vector<int> tmp;// 记录临时数组

  •  vector<int> tmp_index;// 记录临时数组下标

  • vector<int> index;// 记录数组下标

  • vector<int> ret;// 返回数组

8.4 493. 翻转对 

  • 这题和上一道题类似,但是需要先计算翻转对,再排序 

9. 链表

9.1  2. 两数相加

  • 双指针 + 头插法
  • 小技巧: while(cur1 || cur2 || res)

9.2  24. 两两交换链表中的节点

  •  只有当cur == nullnext == null终止循环

9.3  143. 重排链表

  1.  找到链表的中间节点->快慢指针
  2. 再把后面的部分逆序->双指针(三指针),头插法
  3. 合并两个链表->双指针

9.4 25. K 个一组翻转链表

10. 哈希表

10.1 1. 两数之和 

10.2 面试题 01.02. 判定是否互为字符重排 

10.3 217. 存在重复元素 

  •  直接使用unordered_set来解决,注:这个容器的插入接口是insert

10.4  219. 存在重复元素 II

10.5 49. 字母异位词分组

11. 字符串

11.1 14.最长公共前缀

  •  依次比较

11.2 5. 最长回文子串

11.3  67. 二进制求和

  •  模拟列竖式运算

11.4  43. 字符串相乘

12. 栈 

12.1 1047. 删除字符串中的所有相邻重复项

12.2 844. 比较含退格的字符串

12.3 227. 基本计算器 II

 分情况讨论的过程

  1. 遇到操作符等,更新操作符op
  2. 遇到数字,看op
    1. op = "+",tmp直接入栈
    2. op= "-",-tmp入栈
    3. op="*",直接到栈顶元素
    4. op="/",直接和栈顶元素相除

12.4 394. 字符串解码

 分情况讨论:

  1. 遇到数字: 提取这个数字,放入"数字栈"中
  2. 遇到"[":把后面的字符串提取出来,放入"字符串栈"中
  3. 遇到'']'',解析,然后放到''字符串栈''栈顶的字符串后面
  4. 遇到单独的字符,提取出来这个字符串,直接放在"字符串"栈顶的字符串后面

12.5 946. 验证栈序列 

13. 队列 + 宽搜(BFS)

13.1  429. N 叉树的层序遍历

13.2 103. 二叉树的锯齿形层序遍历

13.3 662. 二叉树最大宽度

 13.4 515. 在每个树行中找最大值

  •  层序遍历, int tmp  = INT _ MIN;//记录最大值,

14.  优先级队列(堆)

14.1 1046. 最后一块石头的重量

 

14.2  703. 数据流中的第 K 大元素

  •  直接创建一个大小为k的小堆,栈顶就是我们需要的数据

14.3  692. 前K个高频单词

  1. 预处理一下原始字符数组->哈希表
  2. 创建一个大小为k的堆->小根堆,注:需要手动实现一个仿函数/类
  3. 循环
  4. 提取结果 

 14.4 295. 数据流的中位数

  •  大小堆维护数据的中位数

===================以上内容均参考优选精品算法课(1~81)========================

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

thinkphp5 连接多个服务器数据库

如果你的database.php 是这样&#xff0c; 这是默认的db连接配置 如果还想连接其他服务器&#xff0c;或数据库 在config.php中追加数据库配置&#xff0c; 在使用的地方调用&#xff1a; use think\Db;public function test(){$db3Db::connect(config(db3));$result $db3…

数字货币swap交易所逻辑系统开发分析方案

随着数字货币市场的快速发展&#xff0c; Swap交易所已成为一种重要的交易方式。本文将对数字货币Swap交易所逻辑系统开发进行分析&#xff0c;并探讨其优势、开发难点和解决方案。 一、数字货币Swap交易所逻辑系统开发的优势 数字货币Swap交易所是一种点对点的交易方式&#x…

LiveMedia视频监控汇聚管理平台功能中的CS客户端

平台具备独立的CS客户端可供客户使用&#xff0c;包含实时播放、监视组轮询、云镜控制、语音对讲、录像回放、报警查询、报警联动等。 实时视频 客户端支持单画面多画面显示&#xff0c;用户可选择任意一路或多路视频观看&#xff0c;视频窗口数量 1、3、6、8、9 直至 64 个可…

B树与B+树

B树 B树&#xff0c;又称多路平衡查找树&#xff0c;B树中所有结点的孩子个数的最大值称为B树的阶&#xff0c;通常用m表示。一颗m阶B树或为空树&#xff0c;或为满足如下特征的m叉树。 树中每个结点至多有m棵子树&#xff0c;即至多含有m-1个关键字若根结点不是终端结点&…

Selenium+JQuery定位方法及应用

SeleniumJQuery定位方法及应用 1 JQuery定位说明1.1 JQuery定位方法1.2 JQuery最常用的三个操作1.3 JQuery一个示例1.3.1 用户名输入框1.3.2 密码输入框1.3.3 登陆按钮1.3.4 完整代码 2 JQuery选择器2.1 常用选择器列表2.2 思考 1、关于Selenium提供了很多元素定位方法&#xf…

阿里云添加端口

目录 阿里云添加端口的方法与步骤详解 一、登录阿里云控制台 二、创建安全组 三、添加入站规则 四、添加出站规则 五、完成添加端口操作 也可 1&#xff1a;搜索轻量级服务器 2&#xff1a;点击服务器 3&#xff1a;点击添加规则 4&#xff1a;保存即可 总结 阿里云…

谈谈steam游戏搬砖的收益与风险,以及注意事项

11月CSGO市场行情分析&#xff0c;是否到了该抄底的时候了&#xff1f; 今天&#xff0c;要跟大家分享的Steam平台——全球最大的游戏平台&#xff0c;现在给大家介绍下steam搬砖项目&#xff0c;这个项目既小众又稳定。 先了解一下 steam这个平台是做什么的&#xff0c;steam…

wsl 报错:“参考的对象类型不支持尝试的操作。 Error code: Wsl/Service/0x8007273d“(win10可用)

参考文章&#xff1a;简书-Happyjava&#xff08;作者&#xff09;-wsl2出现参考的对象类型不支持尝试的操作的解决方法&#xff08;win11 永久解决&#xff09; c盘中User的用户名文件夹下的下述路径&#xff0c;创建下述文件夹&#xff0c;内容为&#xff1a;netsh winsock r…

黑客技术(网络安全)—高效自学

前言 前几天发布了一篇 网络安全&#xff08;黑客&#xff09;自学 没想到收到了许多人的私信想要学习网安黑客技术&#xff01;却不知道从哪里开始学起&#xff01;怎么学 今天给大家分享一下&#xff0c;很多人上来就说想学习黑客&#xff0c;但是连方向都没搞清楚就开始学习…

【广州华锐互动】楼宇自动化VR教学课件打造便捷、高效、低成本的教学体验

随着科技的快速发展&#xff0c;智能楼宇已成为现代建筑行业的趋势。为了更好地推广和应用智能楼宇技术&#xff0c;楼宇自动化VR教学课件应运而生。该系统利用3D虚拟仿真技术&#xff0c;为学生和教师提供了一个便捷、高效、低成本的教学平台&#xff0c;让学生可以更好地掌握…

敏感数据是什么?包含哪些?如何保障安全?

最近看到不少小伙伴在问&#xff0c;敏感数据是什么&#xff1f;包含哪些&#xff1f;如何保障安全&#xff1f;这里我们小编就给大家一一解答一下&#xff0c;仅供参考哦&#xff01; 敏感数据是什么&#xff1f; 敏感数据&#xff0c;是指泄漏后可能会给社会或个人带来严重危…

OpenWRT搭建个人web站点并结合内网穿透实现公网远程访问

文章目录 前言1. 检查uhttpd安装2. 部署web站点3. 安装cpolar内网穿透4. 配置远程访问地址5. 配置固定远程地址 前言 uhttpd 是 OpenWrt/LuCI 开发者从零开始编写的 Web 服务器&#xff0c;目的是成为优秀稳定的、适合嵌入式设备的轻量级任务的 HTTP 服务器&#xff0c;并且和…

Ubuntu环境下为串口设置别名

本文介绍Ubuntu环境下为串口设置别名。 Ubuntu环境下&#xff0c;有时候开发调试会使用到USB转串口&#xff0c;本文介绍在不同使用场景下为串口设置别名的方法。主要分为绑定设备ID和绑定USB端口号。 1.绑定设备ID 绑定设备ID适用于USB转串口的设备ID唯一的情况&#xff0c…

Vatee万腾科技决策力的引领创新:Vatee数字化视野的崭新天地

在数字时代的激烈竞争中&#xff0c;Vatee万腾以其科技决策力的引领&#xff0c;开创了数字化视野的崭新天地。这并不仅仅是一场技术的飞跃&#xff0c;更是一次对未来的深刻洞察和引领创新的勇敢实践。 Vatee万腾的科技决策力不仅仅停留在数据分析和算法的运用&#xff0c;更是…

RK3568驱动指南|第七期-设备树-第65章 设备树下platform_device和platform_driver匹配实验

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

【Seata源码学习 】 扫描@GlobalTransaction注解 篇一

1. SeataAutoConfiguration 自动配置类的加载 基于SpringBoot的starter机制&#xff0c;在应用上下文启动时&#xff0c;会加载SeataAutoConfiguration自动配置类 # Auto Configure org.springframework.boot.autoconfigure.EnableAutoConfigurationio.seata.spring.boot.aut…

概率论和数理统计(三)数理统计基本概念

前言 “概率论”是给定一个随机变量X的分布F(x),然后求某事件A概率 P ( x ∈ A ) P(x \in A) P(x∈A)或者随机变量X的数字特征.“统计”是已知一组样本数据 { x 1 , x 2 , . . . x n } \{x_1,x_2,...x_n\} {x1​,x2​,...xn​},去求分布F(x) 统计的基本概念 在统计中&#x…

Wpf 使用 Prism 实战开发Day05

首页设计 1.效果图 一.代码现实 根据页面布局&#xff0c;可以将页面设计成3行&#xff0c;每行中分多少列&#xff0c;看需求而定根据页面内容&#xff0c;设计Model 实体类&#xff0c;以及View Model 1.Index.xaml 页面布局设计 RowDefinition 分行&#xff08;Row&#xf…

11月13日星期一今日早报简报微语报早读

11月13日星期一&#xff0c;农历十月初一&#xff0c;早报微语早读。 1、国家邮政局&#xff1a;“双11”当天全国快递业务量达6.39亿件&#xff1b; 2、公安机关通缉4名缅北电诈头目&#xff0c;其中一人为缅甸掸邦议会原议员&#xff1b; 3、多部门提醒&#xff1a;未满10…

响应式摄影科技传媒网站模板源码带后台

模板信息&#xff1a; 模板编号&#xff1a;540 模板编码&#xff1a;UTF8 模板颜色&#xff1a;黑白 模板分类&#xff1a;摄像、婚庆、家政、保洁 适合行业&#xff1a; 模板介绍&#xff1a; 本模板自带eyoucms内核&#xff0c;无需再下载eyou系统&#xff0c;原创设计、手…
最新文章