从零学算法128

128.给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
示例 1:
输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
示例 2:
输入:nums = [0,3,7,2,5,8,4,6,0,1]
输出:9

  • 这里就直接调 api 排序了,排序后最长连续序列在数组中就一定为连续的整数了。设 dp[i] 为以 nums[i] 结尾的子数组的最长序列,dp[i] 有两种情况,当 nums[i]=nums[i-1]+1 表示它能和前一个数组成连续的序列,就为 dp[i-1]+1,否则就没法连续, dp[i]=1。初始情况也很好理解,dp[0]=1 表示长度为 1 的数组无论如何存在连续序列长度为 1。
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)
  •   public int longestConsecutive(int[] nums) {int n = nums.length;if(n == 0)return 0;Arrays.sort(nums);// 由于 dp 更新时只和前一个结果有关,所以不需要数组int dp = 1;int ans = dp;List<Integer> list = new ArrayList<>();// 去重,你也可以用一个变量记录前一个数// 这样也就不需要 list 了,空间复杂度将为 O(1)for(int i=0;i<n;i++){while(i<n-1 && nums[i]==nums[i+1])i++;list.add(nums[i]);}for(int i=1;i<list.size();i++){if(list.get(i)==list.get(i-1)+1)dp++;else dp=1;ans=Math.max(ans,dp);}return ans;}
    
  • 去重优化
  •   public int longestConsecutive(int[] nums) {int n = nums.length;if(n == 0)return 0;Arrays.sort(nums);int dp = 0;int ans = 0;int pre=nums[n-1]+1;for(int i=0;i<n;i++){while(i<n-1 && nums[i]==nums[i+1])i++;if(nums[i]==pre+1)dp++;else dp=1;pre=nums[i];ans=Math.max(ans,dp);}return ans;}
    
  • 还有用 set + 递归暴力解的:限定某个起点,从 set 中找连续的序列长度很容易,这里的计算用递归表示了。
  •   Set<Integer> set = new HashSet();public int longestConsecutive(int[] nums) {int n = nums.length;int ans = 0;if(n == 0)return ans;// set 去重Arrays.stream(nums).forEach(v->{set.add(v);});for(int x:set){// 如果有 x-1 那从 x-1 开始的长度肯定更长,所以跳过 xif(set.contains(x-1))continue;// 这就等于比较每个连续序列的长度ans = Math.max(ans,dfs(x,0));}return ans;}// 计算从 x 开始的最长序列长度int dfs(int x,int res){if(set.contains(x))return dfs(x+1,res+1);else return res;}
    

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

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

相关文章

打破界限,释放创新:一键将HTML转化为PDF

在互联网时代&#xff0c;HTML作为网页的标准语言&#xff0c;承载着无数的信息与创意。然而&#xff0c;有时我们需要将这些在线内容转化为可打印、可分享的PDF格式。这时&#xff0c;一款高效、便捷的转换工具就显得尤为重要。 首先&#xff0c;我们要进入首助编辑高手主页面…

API分享:淘宝拍立淘API接口|按图搜索商品列表API|电商爆品搜索API

今天来跟大家分享一个非常有用的API&#xff0c;以图搜索商品列表API&#xff1a;item_search_img。通过此API可以实现传入一个图片链接&#xff0c;来获取到该图片上的商品信息&#xff0c;商品列表&#xff0c;支持翻页展示。 item_search_img-按图搜索淘宝商品&#xff08;…

Linux内核基础 - list_move_tail函数详解

Linux Kernel list_move_tail 函数 技术背景 Linux内核使用双向链表来管理各种数据结构。这种双向链表的实现使得元素的插入和删除操作非常高效&#xff0c;特别是在需要频繁修改链表结构时。list_move_tail函数是这种双向链表操作中的一个&#xff0c;用于在链表中移动节点。…

react高阶组件:如何同时兼容class类组件和函数式组件。

场景&#xff1a; 每个页面都要实现分享功能&#xff0c;但是页面有些是用class类&#xff0c;有些又直接是函数式。 方案1&#xff1a; 写2套方法。各自引用。&#xff08;维护不太好&#xff0c;改要改2遍&#xff09; 方案2&#xff1a; 可以封一个 jsx的组件&#xff0c…

中国制造走向世界wordpress外贸建站模板主题

水泵阀门wordpress外贸网站模板 水泵、阀门、管材、管件wordpress外贸网站模板&#xff0c;适合外贸独立站的网站模板。 https://www.jianzhanpress.com/?p3748 保健器械wordpress外贸网站主题 保健、健身器械wordpress外贸网站主题&#xff0c;适合做外贸网站的wordpress模…

【QT C++实践】Qt 项目中一个界面动态处理多张数据库中的表|附源码

一、前言 在之前那篇讲如何使用QT连接数据库时&#xff08;QT C实践|超详细数据库的连接和增删改查操作|附源码)&#xff0c;做了一个简单的对数据库进行增删改查的界面(如下&#xff09;。 但是存在一个问题就是&#xff1a;这个界面只是对一张表进行操作&#xff0c;但是我…

驱动调试第014期-变频调速的原理及相关计算公式应用

一、引言 变频调速是一种通过改变电源频率来实现电动机调速的技术。它具有高效、精确、可靠等优点&#xff0c;广泛应用于工业、商业和家用领域。本文将介绍变频调速的基本原理、优点以及应用领域&#xff0c;并通过详细的公式计算过程和图片说明来帮助读者更好地理解。 二、变…

2023年CSP-J认证 CCF信息学奥赛C++ 中小学初级组 第一轮真题-选择题解析

2023年 中小学信息学奥赛CSP-J真题解析 1、在C中&#xff0c;下面哪个关键字用于声明一个变量&#xff0c;其值不能被修改 A、unsigned B、const C、static D、mutable 答案&#xff1a;B 考点分析&#xff1a;主要考查变量声明相关知识&#xff0c;const是声明常量&…

0基础跨考408|一战上岸复盘及经验分享

基础阶段‼️ 王道的四本书的选择题部分要都做完、订正完。 王道的四门视频课要一轮刷完&#xff08;或者题主在B站看了其他的老师&#xff0c;这其实也是算一轮的&#xff0c;只要题主是认真学习了的&#xff0c;题主说自己不知道看什么课&#xff0c;王道就好了&#xff09;…

解决SpringBoot集成WebSocket打包失败问题

前言 这几天在一个SpringBoot项目中使用WebSocket来用作客服聊天以及上传文件功能,项目在写的时候,以及在idea中跑的时候都非常完美,结果一打成jar包是,报错.在网上查了报错原因,原来是自己导入的WebSocket的jar与SpringBoot内置tomcat中的WebSocket的jar冲突,需要在打包时把S…

如何简洁高效的搭建一个SpringCloud2023的maven工程

前言 依赖管理有gradle和maven&#xff0c;在这里选择比较常用和方便的Maven作为工程项目和依赖管理工具来搭建SpringCloud实战工程。主要用到的maven管理方式是多模块和bom依赖管理。 什么是maven的多模块依赖管理 Maven 多模块项目相对于单模块项目而言&#xff0c;依赖是…

SOC设计:关于reset的细节

有如下几个信号 1、时钟&#xff1a;clk_top 2、总的reset信号&#xff1a;rstn_top 3、scan的reset信号&#xff1a;scan_rstn 4、软件复位信号&#xff1a;rstn_soft_sub 5、scan模式信号&#xff1a;scan_mode 6、reset bypass 信号&#xff1a;scan_rstn_sel 功能&a…

Go程序是如何编译并运行起来的(图文详解)

Go程序是如何编译的 从hello RdrB1te开始 package main import "fmt" func main() { fmt.Println("hello RdrB1te") }不实际编译它&#xff0c;只输出它的编译过程&#xff1a; go build -n简单的编译过程分析&#xff1a; 上面的过程确认了两个…

Cookie和Session(会话技术)

文章目录 Cookie和Session&#xff08;会话技术&#xff09;一、Cookie1、Cookie概述1.1、Cookie简介1.2、Cookie的使用场景1.3、Cookie底层原理 2、Cookie的基本使用3、Cookie实现显示用户上次访问时间4、Cookie编码与解码5、Cookie总结 二、Session1、Session概述1.1、Sessio…

FPGA高端项目:FPGA基于GS2971的SDI视频接收+OSD动态字符叠加,提供1套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案的SDI接收转HDMI输出应用本方案的SDI接收图像缩放应用本方案的SDI接收纯verilog图像缩放纯verilog多路视频拼接应用本方案的SDI接收HLS图像缩放HLS多路视频拼接应用本方案的SDI接收HLS多路视频融合叠加应用…

基于Matlab实现免疫荧光图像中的区域定位算法

基于Matlab实现免疫荧光图像中的区域定位算法 免疫荧光法。以荧光染料为标记物,试纸条为载体,发生抗原抗体特异性反应,根据免疫复合物被激发的荧光强度对待测物进行定量分析[。该方法具有环境要求不高、操作简单快速、无污染且荧光染料丰富等优点。 常用于食品安全检测过程中…

opengauss 数据库-高可用 jdbc 使用方法

opengauss 数据库-高可用 jdbc 使用方法 驱动下载 下载 jdbc 驱动 openGauss-2.1.0-JDBC.tar.gz 下载地址&#xff1a;软件包 | openGauss 表 demo 案例 create database test; create schema demo; CREATE TABLE demo.websites (id int NOT NULL,name char(20) NOT NULL …

sklearn随机森林实现(备忘版)

scikit-learn是广泛使用的机器学习python库. sklearn已经实现了决策树及集成模型, 下面是随机森林分类算法实现的示例代码. import numpy as np import pandas as pd from sklearn.ensemble import RandomForestClassifier datasetpd.read_table(/path/to/DataSet/Classificat…

uniapp路由跳转的方式

1. uniapp路由跳转的方式 1.1. uni.navigateTo保留当前页面&#xff0c;跳转到应用内的某个页面&#xff0c;使用uni.navigateBack可以返回到原页面。 uni.navigateTo({url:./index/index });注意&#xff1a; &#xff08;1&#xff09;页面跳转路径有层级限制&#xff0c;不…

vue3+element plus 实现百度地图显示路径

添加依赖 <!-- index.html --><script type"text/javascript" src"//api.map.baidu.com/getscript?v3.0&akyI6kBeC9G4LntEWXklE2iNHwRUrmFEQc"></script><script type"text/javascript" src"//api.map.baidu.co…