当前位置: 首页 > news >正文

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 n2n 个键值对)。因此总时间复杂度为 O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)。哈希表最多包含 n − ⌊ n 2 ⌋ n - \lfloor \dfrac{n}{2} \rfloor n2n 个键值对,所以占用的空间为 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,随后在 a1a2中选出正确的众数。最后的的子问题都是长度为 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 算法的详细步骤:
  1. 维护一个候选众数 candidate和它出现的次数 count。初始时 candidate为任意值,count0
  2. 遍历数组 nums中的所有元素,对于每个元素 x,在判断 x之前,如果 count的值为 0,我们先将 x的值赋予 candidate,随后我们判断 x

如果 xcandidate相等,那么计数器 count的值增加 1
如果 xcandidate不等,那么计数器 count的值减少 1

  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 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;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 创建轮播图 在本文中&#xff0c;我们将讨论如何使用 HTML、CSS 和 JavaScript 构建轮播图。我们将演示两种不同的创建滑块的方法&#xff0c;一种是基于opacity的滑块&#xff0c;另一种是基于transform的。 创建 HTML 我们首先从 HTML 代码开…...

ubuntu环境删除qtcreator方法

文章目录 方法1方法2方法3参考不同的安装方法,对应不同的删除方法 方法1 apt-get或者dpkg 方法2 QtCreatorUninstaller 方法3 MaintenanceTool...

软件测试基础知识

软件测试基本概念 1、软件程序文档&#xff0c;软件测试程序测试文档测试。 “程序”是指能够实现某种功能的指令的集合&#xff0c;“文档”是指软件在开发、使用和维护过程中产生的图文集合。&#xff1b; 2、软件的分类 按功能分&#xff1a;系统软件、应用软件 按技术架构分…...

使用 .toISOString() 方法生成当前时间的ISO格式字符串,解决UTC时区差问题

方法分析&#xff1a; 日常开发中&#xff0c;有时我们需要向后端传递的时间值可能并非一个时间对象&#xff0c;而是字符串格式。 例 1&#xff1a;[2023-08-16T08:07:25.577Z] 但是我们通过 new Date() 之后直接使用 .toString() 方法得到的却并非这种格式。 例 2&#xff1…...

“BMP转PNG一键转换,批量处理图片,迈入高效图片管理新时代“

你是否曾经为了转换图片格式而烦恼&#xff1f;是否曾经因为一张一张地手动转换而感到无奈&#xff1f;现在&#xff0c;我们的全新工具将为你解决这些问题&#xff0c;开启高效图片管理新时代&#xff01; 首先&#xff0c;我们进入首助编辑高手主页面&#xff0c;会看到有多种…...

解决Vue编程式导航路由跳转不显示目标路径问题

我们配置一个编程式导航的路由跳转&#xff0c;跳转到 /search 页面&#xff0c;并且携带categoryName和categoryId两个query参数。 this.$router.push({path: "/search",query: {categoryName: dataset.categoryname,categoryId: dataset.categoryid} }) 如果我们…...

Android studio 引用framework.jar

framework.jar 引用目录 N/O&#xff1a; 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 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV54.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 数据集准备5.1 数…...

宝塔面板安装搭建DiscuzQ论坛教程与小程序上架发布后的展示效果

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

交换机配置与管理

文档以国产迈普交换机为例&#xff0c;各厂家交换机配置有少许不同&#xff0c;仅供参考。 交换机命令行模式&#xff1a; 普通用户模式Hostname>&#xff08;&#xff09; exit 输入enable命令 特权用户模式Hostname#&#xff08;&#xff09; exit 输入configu…...

python每日一题——7接雨水

题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表…...

Ubuntu20安装ssh服务

Ubuntu20上执行如下命令查看是否存在ssh服务 #ps -e | grep ssh 只有ssh-agent&#xff0c;没有sshd; 因此要安装openssh-server. 搜索openssh-server,得到下载链接&#xff1a; openssh-server 复制这个Binary Package链接即可下载&#xff0c;然后使用如下命令安装 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丢失的解决方法”。或许有些同学在平时使用电脑的过程中会遇到这个问题&#xff0c;但是并不知道该如何解决。那么&#xff0c;接下来我将从三个方面为大家介绍&#xff1a;msvcp120.dll丢失的原因、msvcp120.dll是什么以及msvcp120.d…...

为你的项目加上微信登录(个人开发)

当我们开发个人项目的时候&#xff0c;为了用户登录的便捷性&#xff0c;经常会给我们的项目加上一些除了注册之外的方式&#xff0c;其中最常见的就是微信登录&#xff0c;但作为个人开发者&#xff0c;是无法使用微信的授权登录的&#xff0c;但是通过微信公众号可以获得同样…...

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 数据库产品类别及其适用场景详细说明

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 目录 前言、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相关的更改,本文总结一下调试过程中出现的一些问题,及解决…...

如何构建高效跨设备键鼠共享系统:Lan Mouse终极指南

如何构建高效跨设备键鼠共享系统&#xff1a;Lan Mouse终极指南 【免费下载链接】lan-mouse mouse & keyboard sharing via LAN 项目地址: https://gitcode.com/gh_mirrors/la/lan-mouse 在当今多设备协同的工作环境中&#xff0c;跨设备键鼠共享技术已成为提升工作…...

通信原理之SystemView下短波16QAM调制与解调系统仿真研究:电路构建、参数设定与结果...

通信原理 systemview 16QAM调制与解调系统的仿真 16QAM调制解调系统与解调系统的仿真 用SystemView建立一个16QAM调制解调器电路,分析理解系统的各个模块功能&#xff0c;观察波形图 判断是不是实现了16QAM调制解调系统功能 基本要求: (1)在SystemView软 件中构建短波16QAM仿真…...

WarcraftHelper:魔兽争霸3免费优化插件完整指南与配置教程

WarcraftHelper&#xff1a;魔兽争霸3免费优化插件完整指南与配置教程 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸3在现代电脑上频…...

Win11 WSL2 + Ubuntu 24.04 下,如何让nRF开发板(DK)被VS Code和NCS v3.0.0正确识别?

Win11 WSL2环境下nRF开发板与NCS v3.0.0深度集成指南 当嵌入式开发遇上WSL2的Linux高效编译环境&#xff0c;硬件连接往往成为最后一道障碍。本文将彻底解决nRF开发板在Windows主机与WSL2 Ubuntu子系统间的识别难题&#xff0c;打造无缝硬件调试体验。 1. 环境准备与核心工具链…...

基于深度学习的yolov8+v11+v5的仪器仪表读数识别 yolo+pose关键点的指针仪表读数工业检测 仪表读数

博主主页&#xff1a;[ ](https://blog.csdn.net/QQ_1309399183?typeblog) 博主简介&#xff1a;计算机视觉领域优质创作者、CSDN博客专家、阿里云专家博主、全网粉丝5万、专注计算机视觉技术领域和毕业相关项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&am…...

PID微分噪声抑制实战:低通滤波器的参数整定与系统调优

1. PID微分噪声的根源与低通滤波的必要性 在工业控制和机器人系统中&#xff0c;PID控制器就像一位经验丰富的驾驶员&#xff0c;比例项负责当前路况判断&#xff0c;积分项纠正历史偏差&#xff0c;而微分项则像预判前方弯道的"老司机直觉"。但这位"老司机&quo…...

小白友好:Qwen3-0.6B-FP8部署全流程,Chainlit让交互可视化

小白友好&#xff1a;Qwen3-0.6B-FP8部署全流程&#xff0c;Chainlit让交互可视化 1. 认识Qwen3-0.6B-FP8模型 Qwen3-0.6B-FP8是阿里巴巴通义千问系列中的轻量级语言模型&#xff0c;特别适合在资源有限的设备上快速部署和运行。这个版本采用了FP8&#xff08;8位浮点数&…...

AI编程新范式:使用Claude Code辅助开发cv_resnet101_face-detection应用

AI编程新范式&#xff1a;使用Claude Code辅助开发cv_resnet101_face-detection应用 1. 引言 如果你做过计算机视觉项目&#xff0c;肯定有过这样的体验&#xff1a;好不容易找到一个合适的预训练模型&#xff0c;比如人脸检测的cv_resnet101_face-detection&#xff0c;但真…...

NVIDIA Profile Inspector终极指南:解决572.16驱动兼容性问题

NVIDIA Profile Inspector终极指南&#xff1a;解决572.16驱动兼容性问题 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector 还在为NVIDIA显卡驱动更新后游戏性能异常而烦恼吗&#xff1f;近期许多用户反馈…...

Nanbeige像素冒险聊天终端开箱体验:零代码,打造专属复古游戏AI聊天室

Nanbeige像素冒险聊天终端开箱体验&#xff1a;零代码&#xff0c;打造专属复古游戏AI聊天室 1. 引言&#xff1a;当AI对话遇上复古像素风 还记得小时候玩过的那些经典JRPG游戏吗&#xff1f;那些色彩鲜艳的像素世界&#xff0c;充满神秘感的对话框&#xff0c;以及让人沉浸其…...