87-96-多维动态规划、技巧
LeetCode 热题 100
文章目录
- LeetCode 热题 100
- 多维动态规划
- 87. 中等-不同路径
- 88. 中等-最小路径和
- 89. 中等-最长回文子串
- 90. 中等-最长公共子序列
- 91. 困难-编辑距离
- 技巧
- 92. 简单-只出现一次的数字
- 93. 简单-多数元素
- 94. 中等-颜色分类
- 95. 中等-下一个排列
- 96. 中等-寻找重复数
本文存储我刷题的笔记。
多维动态规划
87. 中等-不同路径
88. 中等-最小路径和
89. 中等-最长回文子串
90. 中等-最长公共子序列
91. 困难-编辑距离
技巧
92. 简单-只出现一次的数字

我的思路:哈希表
- 思路:用哈希集合
std::unordered_set
,遍历所有元素,没遇过就存起来,遇到了就删除哈希集合对应元素,最后哈希集合中剩下的元素就是。- 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是数组长度。只需要对数组遍历一次。
- 空间复杂度: O ( n ) O(n) O(n),最多可能会存储 n / 2 n/2 n/2 个元素。
- 时间24ms(20.69%),内存19.81MB(8.87%)。
class Solution {
public:int singleNumber(std::vector<int>& nums) {int len = nums.size();std::unordered_set<int> s_num;for(int i=0; i<len; i++){// 遇到有的就擦除if(s_num.count(nums[i])){s_num.erase(nums[i]); }// 遇到没有的就存起来else{s_num.emplace(nums[i]);}}// 返回只剩下的最后一个元素return *s_num.begin();}
};
官方思路一:位运算
- 思路:因为只有一个数和其他的都不一样,所以将所有数字都进行异或运算,最后就只剩下那个单独的数字。
- 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是数组长度。只需要对数组遍历一次。
- 空间复杂度: O ( 1 ) O(1) O(1)。
- 时间8ms(98.78%),内存16.89MB(37.16%)。
class Solution {
public:int singleNumber(vector<int>& nums) {int ret = 0;for (auto e: nums) ret ^= e;return ret;}
};
93. 简单-多数元素

我的思路:哈希表
- 思路:先统计,再遍历。
- 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是数组
nums
的长度。我们遍历数组nums
一次,又至多遍历一次哈希表(最多包含 n − ⌊ n 2 ⌋ n - \lfloor \dfrac{n}{2} \rfloor n−⌊2n⌋ 个键值对)。因此总时间复杂度为 O ( n ) O(n) O(n)。- 空间复杂度: O ( n ) O(n) O(n)。哈希表最多包含 n − ⌊ n 2 ⌋ n - \lfloor \dfrac{n}{2} \rfloor n−⌊2n⌋ 个键值对,所以占用的空间为 O ( n ) O(n) O(n)。
- 时间20ms(45.10%),内存19.69MB(8.36%)。
注:由于题目保证会出现多数元素,所以也可以将这两个循环放在一起。
class Solution {
public:int majorityElement(std::vector<int>& nums) {// 使用哈希表统计所有信息// 哈希表:键-元素的大小、值-出现的次数std::unordered_map<int,int> m_data;for(auto num : nums){m_data[num] += 1;}// 找出符合要求的值int target = nums.size()/2;for(auto it=m_data.begin(); it!=m_data.end(); it++){if(it->second > target){return it->first;}}return -1;}
};
官方思路二:排序
- 思路:将数组
nums
排序,那么下标为 ⌊ n 2 ⌋ \lfloor \dfrac{n}{2} \rfloor ⌊2n⌋ 的元素一定是“多数元素”。- 时间复杂度: O ( n log n ) O(n\log n) O(nlogn)。将数组排序的时间复杂度为 O ( n log n ) O(n\log n) O(nlogn)。
- 空间复杂度: O ( log n ) O(\log n) O(logn)。如果使用语言自带的排序算法,需要使用 O ( log n ) O(\log n) O(logn) 的栈空间。如果自己编写堆排序,则只需要使用 O ( 1 ) O(1) O(1) 的额外空间。
- 时间20ms(45.10%),内存19.66MB(10.82%)。
class Solution {
public:int majorityElement(vector<int>& nums) {sort(nums.begin(), nums.end());return nums[nums.size() / 2];}
};
官方思路三:随机化
- 思路:由于“多数元素”过半,那么随机挑选一个是“多数元素”的概率很大。于是代码逻辑为,随机生成一个下标,检查它是否是“多数元素”,如果是就返回,否则继续随机挑选。
- 时间复杂度:理论上最坏情况下的时间复杂度为 O ( ∞ ) O(\infty) O(∞),但实际上期望的时间复杂度为 O ( n ) O(n) O(n)。
- 空间复杂度: O ( 1 ) O(1) O(1)。随机方法只需要常数级别的额外空间。
- 时间16ms(75.52%),内存19.63MB(14.46%)。
class Solution {
public:int majorityElement(vector<int>& nums) {while (true) {int candidate = nums[rand() % nums.size()];int count = 0;for (int num : nums)if (num == candidate)++count;if (count > nums.size() / 2)return candidate;}return -1;}
};
官方思路四:分治
- 思路:分治算法递归求解。将数组分成左右两部分,分别求出左半部分的众数
a1
以及右半部分的众数a2
,随后在a1
和a2
中选出正确的众数。最后的的子问题都是长度为1
的数组。- 时间复杂度: O ( n log n ) O(n\log n) O(nlogn)。推导见原文“方法四:分治”。
- 空间复杂度: O ( log n ) O(\log n) O(logn)。尽管分治算法没有直接分配额外的数组空间,但在递归的过程中使用了额外的栈空间。算法每次将数组从中间分成两部分,所以数组长度变为
1
之前需要进行 O ( log n ) O(\log n) O(logn) 次递归,即空间复杂度为 O ( log n ) O(\log n) O(logn)。- 时间28ms(9.03%),内存19.58MB(21.58%)。
class Solution {// 统计目标值在指定范围内的次数int count_in_range(vector<int>& nums, int target, int lo, int hi) {int count = 0;for (int i = lo; i <= hi; ++i)if (nums[i] == target)++count;return count;}// 分治算法int majority_element_rec(vector<int>& nums, int lo, int hi) {// 递归最小的子问题:长度为1的数组if (lo == hi)return nums[lo];// 统计左右两部分的“多数元素”int mid = (lo + hi) / 2;int left_majority = majority_element_rec(nums, lo, mid);int right_majority = majority_element_rec(nums, mid + 1, hi);// 检查哪个符合出现次数标准if (count_in_range(nums, left_majority, lo, hi) > (hi - lo + 1) / 2)return left_majority;if (count_in_range(nums, right_majority, lo, hi) > (hi - lo + 1) / 2)return right_majority;return -1;}
public:int majorityElement(vector<int>& nums) {return majority_element_rec(nums, 0, nums.size() - 1);}
};
官方思路五:Boyer-Moore 投票算法
- 思路: 如果我们把众数记为 +1+1+1,把其他数记为 −1-1−1,将它们全部加起来,显然和大于 0,从结果本身我们可以看出众数比其他数多。于是,Boyer-Moore 算法的详细步骤:
- 维护一个候选众数
candidate
和它出现的次数count
。初始时candidate
为任意值,count
为0
;- 遍历数组
nums
中的所有元素,对于每个元素x
,在判断x
之前,如果count
的值为0
,我们先将x
的值赋予candidate
,随后我们判断x
:如果
x
与candidate
相等,那么计数器count
的值增加1
;
如果x
与candidate
不等,那么计数器count
的值减少1
。
- 在遍历完成后,
candidate
即为整个数组的众数。
- 时间复杂度: O ( n ) O(n) O(n)。Boyer-Moore 算法只对数组进行了一次遍历。
- 空间复杂度: O ( 1 ) O(1) O(1)。Boyer-Moore 算法只需要常数级别的额外空间。
- 时间12ms(93.37%),内存19.70MB(6.31%)。
class Solution {
public:int majorityElement(vector<int>& nums) {int candidate = -1;int count = 0;for (int num : nums) {if (num == candidate)++count;else if (--count < 0) {candidate = num;count = 1;}}return candidate;}
};
94. 中等-颜色分类
95. 中等-下一个排列
96. 中等-寻找重复数
我的思路
思路:
时间??ms(??%),内存??MB(??%)。
官方思路:
思路:
时间??ms(??%),内存??MB(??%)。
相关文章:
87-96-多维动态规划、技巧
LeetCode 热题 100 文章目录 LeetCode 热题 100多维动态规划87. 中等-不同路径88. 中等-最小路径和89. 中等-最长回文子串90. 中等-最长公共子序列91. 困难-编辑距离 技巧92. 简单-只出现一次的数字93. 简单-多数元素94. 中等-颜色分类95. 中等-下一个排列96. 中等-寻找重复数 …...

NX二次开发UF_CURVE_ask_wrap_curve_parents 函数介绍
文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_wrap_curve_parents Defined in: uf_curve.h int UF_CURVE_ask_wrap_curve_parents(tag_t curve_tag, tag_t * defining_face, tag_t * defining_plane, tag_t * defin…...

使用 HTML、CSS 和 JavaScript 创建图像滑块
使用 HTML、CSS 和 JavaScript 创建轮播图 在本文中,我们将讨论如何使用 HTML、CSS 和 JavaScript 构建轮播图。我们将演示两种不同的创建滑块的方法,一种是基于opacity的滑块,另一种是基于transform的。 创建 HTML 我们首先从 HTML 代码开…...

ubuntu环境删除qtcreator方法
文章目录 方法1方法2方法3参考不同的安装方法,对应不同的删除方法 方法1 apt-get或者dpkg 方法2 QtCreatorUninstaller 方法3 MaintenanceTool...
软件测试基础知识
软件测试基本概念 1、软件程序文档,软件测试程序测试文档测试。 “程序”是指能够实现某种功能的指令的集合,“文档”是指软件在开发、使用和维护过程中产生的图文集合。; 2、软件的分类 按功能分:系统软件、应用软件 按技术架构分…...
使用 .toISOString() 方法生成当前时间的ISO格式字符串,解决UTC时区差问题
方法分析: 日常开发中,有时我们需要向后端传递的时间值可能并非一个时间对象,而是字符串格式。 例 1:[2023-08-16T08:07:25.577Z] 但是我们通过 new Date() 之后直接使用 .toString() 方法得到的却并非这种格式。 例 2࿱…...

“BMP转PNG一键转换,批量处理图片,迈入高效图片管理新时代“
你是否曾经为了转换图片格式而烦恼?是否曾经因为一张一张地手动转换而感到无奈?现在,我们的全新工具将为你解决这些问题,开启高效图片管理新时代! 首先,我们进入首助编辑高手主页面,会看到有多种…...

解决Vue编程式导航路由跳转不显示目标路径问题
我们配置一个编程式导航的路由跳转,跳转到 /search 页面,并且携带categoryName和categoryId两个query参数。 this.$router.push({path: "/search",query: {categoryName: dataset.categoryname,categoryId: dataset.categoryid} }) 如果我们…...
Android studio 引用framework.jar
framework.jar 引用目录 N/O: out/target/common/obj/JAVA_LIBRARY/framework_interminate/classes.jarAndroid 9/10: out/soong/.intermediates/frameworks/base/framework/android_common/combined/framework.jarAndroid 11: out/soong/.intermediates/framewo…...

软著项目推荐 深度学习 python opencv 火焰检测识别 火灾检测
文章目录 0 前言1 基于YOLO的火焰检测与识别2 课题背景3 卷积神经网络3.1 卷积层3.2 池化层3.3 激活函数:3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV54.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 数据集准备5.1 数…...

宝塔面板安装搭建DiscuzQ论坛教程与小程序上架发布后的展示效果
DiscuzQ论坛小程序上架发布后的展示效果: 1、需要用到的环境: php7.2 mysql5.7或者MariaDB 10.2(我安装用的mysql8.0) php除了必要的一些扩展外,还需要启用readlink、symlink函数等,具体看官方说明,安装的时候也会提醒…...

交换机配置与管理
文档以国产迈普交换机为例,各厂家交换机配置有少许不同,仅供参考。 交换机命令行模式: 普通用户模式Hostname>() exit 输入enable命令 特权用户模式Hostname#() exit 输入configu…...
python每日一题——7接雨水
题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表…...

Ubuntu20安装ssh服务
Ubuntu20上执行如下命令查看是否存在ssh服务 #ps -e | grep ssh 只有ssh-agent,没有sshd; 因此要安装openssh-server. 搜索openssh-server,得到下载链接: openssh-server 复制这个Binary Package链接即可下载,然后使用如下命令安装 sudo…...

linux LVM /dev/sdb mount dir /data【linux LVM 磁盘挂载目录】
添加磁盘 /dev/sdb rootregistry01 ~]# fdisk -lDisk /dev/sda: 53.7 GB, 53687091200 bytes, 104857600 sectors Units sectors of 1 * 512 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk lab…...

由于找不到msvcp120.dll无法继续执行代码是什么原因怎么修复
今天我想和大家分享的是关于“msvcp120.dll丢失的解决方法”。或许有些同学在平时使用电脑的过程中会遇到这个问题,但是并不知道该如何解决。那么,接下来我将从三个方面为大家介绍:msvcp120.dll丢失的原因、msvcp120.dll是什么以及msvcp120.d…...

为你的项目加上微信登录(个人开发)
当我们开发个人项目的时候,为了用户登录的便捷性,经常会给我们的项目加上一些除了注册之外的方式,其中最常见的就是微信登录,但作为个人开发者,是无法使用微信的授权登录的,但是通过微信公众号可以获得同样…...
Pinia的使用技巧
一、安装 npm install pinia 二、main.ts引入 import { createApp } from vue import App from ./App.vue import { createPinia } from piniaconst app createApp(App) app.use(createPinia()) app.mount(#app)三、定义参数 import { defineStore } from piniatype User …...

『亚马逊云科技产品测评』活动征文|AWS 数据库产品类别及其适用场景详细说明
授权声明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 Developer Centre, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道 目录 前言、AWS 数据库产品类别 01、Amazon Aurora 02、Amazon Docum…...
S32K324 UDS Bootloader开发-下位机篇-Bootload软件(3)
文章目录 前言校验算法34服务响应的字节字节对齐问题跳转问题Boot Delay功能重要配置跳转标志FLASH DRIVER和APP区域CAN ID配置中断使能与禁止CAN TP配置总结前言 上一篇文章介绍了S32K324 UDS Bootlodaer开发中的UDS相关的更改,本文总结一下调试过程中出现的一些问题,及解决…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)
cd /home 进入home盘 安装虚拟环境: 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境: virtualenv myenv 3、激活虚拟环境(激活环境可以在当前环境下安装包) source myenv/bin/activate 此时,终端…...

【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/v2@v2.2.0 更换为 go-ansible/@v1.1.7
在 Go 项目中降级 go-ansible 从 v2.2.0 到 v1.1.7 具体步骤: 第一步: 修改 go.mod 文件 // 原 v2 版本声明 require github.com/apenella/go-ansible/v2 v2.2.0 替换为: // 改为 v…...
跨平台商品数据接口的标准化与规范化发展路径:淘宝京东拼多多的最新实践
在电商行业蓬勃发展的当下,多平台运营已成为众多商家的必然选择。然而,不同电商平台在商品数据接口方面存在差异,导致商家在跨平台运营时面临诸多挑战,如数据对接困难、运营效率低下、用户体验不一致等。跨平台商品数据接口的标准…...

如何把工业通信协议转换成http websocket
1.现状 工业通信协议多数工作在边缘设备上,比如:PLC、IOT盒子等。上层业务系统需要根据不同的工业协议做对应开发,当设备上用的是modbus从站时,采集设备数据需要开发modbus主站;当设备上用的是西门子PN协议时…...