贪心算法 -- 递增子序列

目录

最长递增子序列

题解:

代码:

递增的三元子序列

题解:

代码:

简易版:

最长连续递增序列

题解:

代码: 


最长递增子序列

300. 最长递增子序列 - 力扣(LeetCode)icon-default.png?t=O83Ahttps://leetcode.cn/problems/longest-increasing-subsequence/description/

题解:

如果我们要使上升子序列尽可能的长,则我们需要让序列上升得尽可能慢,因此我们希望每次在上升子序列最后加上的那个数尽可能的小

以数组 nums = [ 7, 3, 8, 4, 7, 2, 14, 13 ] 为例,从下标为 0 位置开始遍历:

当访问 nums[ 0 ] 时,此时长度为 1 的子序列的元素为 7

当访问 nums[ 1 ] 时,由于 3 < 7,所以 7 和 3 无法构成递增子序列,所以长度为 1 的子序列的元素为 3 或者 7,此时长度为 1 的子序列的元素应该保留 3,去掉 7,原因如下:假如再来一个元素 x,

  • 如果 x > 7,此时长度为 2 的子序列有两种可能,[ 3, x ] 或者 [ 7, x ] ;
  • 如果 3 < x <= 7,那么长度为 2 的子序列只有 [ 3, x ] 一种情况。

也就是说,能与 7 构成递增子序列的元素,也一定可以与 3 构成递增子序列,但能与 3 构成递增子序列的元素不一定可以与 7 构成递增子序列,所以保留 3 去掉 7 可以让递增子序列的长度尽可能长!此时长度为 1 的子序列的最后一个元素为 3.

当访问 nums[ 2 ] 时,8 可以和 3 构成递增子序列,此时长度为 1 的子序列的最后一个元素为 3,长度为 2 的子序列的最后一个元素为 8.

当访问 nums[ 3 ] 时,4 比 8 小,而且 4 比长度为 1 的子序列的最后一个元素 3 大,此时长度为 2 的子序列有两种情况,[ 3, 4 ] 或者 [ 3, 8 ] ,和上面同理,能与 [ 3, 8 ] 构成递增子序列的元素,也可以与 [ 3, 4 ] 构成递增子序列,但能与 [ 3, 4 ] 构成递增子序列的元素,不一定能与 [ 3, 8 ] 构成递增子序列。所以长度为 2 的子序列的最后一个元素更新为 4.

 当访问 nums[ 4 ] 时,7 比 4 大,可以与 [ 3, 4 ] 构成递增子序列,此时长度为 3 的子序列的最后一个元素为 7

当访问 nums[ 5 ] 时,2 比 3 小,和上面同理,长度为 1 的子序列的最后一个元素更新为 2.

当访问 nums[ 6 ] 时,14 比 7 大,可以构成递增子序列,此时长度为 4 的子序列的最后一个元素为 14

当访问 nums[ 7 ] 时,13 比 14 小,但比 7 大,此时长度为 4 的子序列的最后一个元素为 14

 

从上述过程可以看出,假设用数组 ret 来保存长度为 x 的子序列的最后一个元素,当前数组的长度为 n:

  • 当前遍历到的元素 a 比 当前长度最长的子序列的最后一个元素时, 即 a 大于数组的最后一个元素,则递增子序列的长度+1,即数组 ret 的长度 n++,且 ret [ n ] =  a;
  • 当前遍历到的元素 a 比 当前长度最长的子序列的最后一个元素时,则需要在数组中找到大于等于 a 的数中的最小值,然后用 a 把这个数覆盖掉。

思想就是让 ret 中存储比较小的元素。这样,ret 未必是真实的最长上升子序列,但长度是对的,只能说明我们曾经得到过这一长度的递增子序列

如何快速在数组中找到大于等于 a 的数中的最小值?

用二分查找思想,根据数组元素的更新策略,可以看出数组中的元素是递增的,假设数组中第一个大于等于 a 的数的下标为 i,数组的长度为 n,那么数组可以被划分为两部分,下标范围为 [ 0, i-1 ] 的数都比 a 小,下标范围为 [ i , n-1 ] 的数都大于等于 a,此二段性可以帮助我们快速定位要把元素 a 放在哪里。 

代码:

class Solution {
public:int lengthOfLIS(vector<int>& nums) {vector<int> ret;ret.push_back(nums[0]);int n=nums.size();for(int i=1;i<n;i++){int x=nums[i];if(x>ret.back()){ret.push_back(x);}else{int left=0,right=ret.size()-1;while(left<right){int mid=left+(right-left)/2;if(ret[mid]<x)  left=mid+1;else    right=mid;}ret[left]=x; }}return ret.size();   }
};

递增的三元子序列

334. 递增的三元子序列 - 力扣(LeetCode)icon-default.png?t=O83Ahttps://leetcode.cn/problems/increasing-triplet-subsequence/description/

题解:

和上一题同理,如果 ret 数组的长度为 3,说明存在递增的三元子序列,此时直接返回 true 即可。

代码:

class Solution {
public:bool increasingTriplet(vector<int>& nums) {vector<int> ret;ret.push_back(nums[0]);int n=nums.size();for(int i=1;i<n;i++){if(nums[i]>ret.back()){ret.push_back(nums[i]);if(ret.size()==3)return true;}else{int left=0,right=ret.size()-1;while(left<right){int mid=left+(right-left)/2;if(ret[mid]<nums[i])    left=mid+1;else right=mid;}ret[left]=nums[i];}}return false;}
};

简易版:

class Solution {
public:bool increasingTriplet(vector<int>& nums) {int first=nums[0],second=INT_MAX;for(int i=0;i<nums.size();i++){if(nums[i]>second) return true;else if(nums[i]>first)  second=nums[i];else first=nums[i];}return false;}
};

最长连续递增序列

674. 最长连续递增序列 - 力扣(LeetCode)icon-default.png?t=O83Ahttps://leetcode.cn/problems/longest-continuous-increasing-subsequence/description/

题解:

本题其实是一个滑动窗口。注意窗口不要越界,且窗口左闭右开。left 是窗口的左端点,right 是窗口的右端点。

代码: 

class Solution {
public:int findLengthOfLCIS(vector<int>& nums) {int left=0,right=0,n=nums.size(),ret=0;while(left<n){right=left+1;while(right<n && nums[right]>nums[right-1])right++;ret=max(ret,right-left);//左闭右开left=right;}return ret;}
};

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

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

相关文章

【ArcGIS微课1000例】0132:从多个GIS视角认识与攀登珠穆朗玛峰

文章目录 1. Map Viewer中打开2. 场景查看器中打开3. ArcGIS中打开4. QGIS中打开5. Globalmapper中打开6. ArcGIS Earth中打开官网地址:https://www.arcgis.com/home/item.html?id=504a23373ab84536b7760c0add1e0c1c 1. Map Viewer中打开 以下展示不同底图样式的珠穆朗玛峰壮…

如何在Word文件中设置水印以及如何禁止修改水印

在日常办公和学习中&#xff0c;我们经常需要在Word文档中设置水印&#xff0c;以保护文件的版权或标明文件的机密性。水印可以是文字形式&#xff0c;也可以是图片形式&#xff0c;能够灵活地适应不同的需求。但仅仅设置水印是不够的&#xff0c;有时我们还需要确保水印不被随…

windows的WSL Ubuntu子系统重置root或其他用户的密码

思路&#xff1a;以管理员身份运行PowerShell&#xff0c;在命令行窗口重置密码 &#xff0c;不需要删除或重新安装Linux子系统。 1、以管理员身份运行PowerShell 2、用root用户启动Ubuntu&#xff0c;执行 wsl.exe --user root 3、重置密码&#xff0c;执行passwd username&…

UE5 5.1.1创建C++项目,显示error C4668和error C4067的解决方法

因为工作要求&#xff0c;没法使用最新 5.5版本的ue5 而是要用ue5.1和5.2版本。 但是我在安装下载了visual studio2022后&#xff0c;使用 ue5.1编辑器 创建C项目&#xff0c;爆出如下错误。 error C4668: ?????__has_feature?????ΪԤ?????꣬???0????…

SpringCloud多机部署,负载均衡-LoadBalance

一.负载均衡 1.1问题描述 //根据应用名称获取服务列表 List<ServiceInstance> instancesdiscoveryClient.getInstances("product-service"); //一个微服务可能有多个实例&#xff0c;获取第一个 EurekaServiceInstance instance(EurekaServiceInstance)insta…

『 Linux 』文件与网络套接字的内部关系

文章目录 回顾进程控制块socket与文件的关系wait_queue_head_t文件与套接字相关的调用方法系统中的套接字网络协议栈与方法集报文的管理 回顾进程控制块 每个进程都存在着自己的PCB结构体,即task_struct结构体,这个结构体是用来描述一个进程的; /* 已省略部分代码 */ struct t…

科研实验室的数字化转型:Spring Boot系统

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理实验室管理系统的相关信息成为必然。开发合…

【前端】CSS修改div滚动条样式

示例 分别是滚动条默认样式和修改后的样式 代码 <div class"video-list"><div class"list-item" onclick"videoinfo(100)"><img src"/index/images/coverimg/方和谦.png"><div class"txt">国医大…

【AIGC】如何使用高价值提示词Prompt提升ChatGPT响应质量

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | 提示词Prompt应用实例 文章目录 &#x1f4af;前言&#x1f4af;提示词英文模板&#x1f4af;提示词中文解析1. 明确需求2. 建议额外角色3. 角色确认与修改4. 逐步完善提示5. 确定参考资料6. 生成和优化提示7. 生成最终响…

centos安装jenkins

本机使用虚拟机centos 7.9.2009 安装gitlab&#xff0c;本机的虚拟机ip地址是 192.168.60.151&#xff0c; 步骤记录如下 1、下载jenkins&#xff0c;安装jenkins之前需要安装jdk jdk和jenkins的版本对应关系参考&#xff1a;Redhat Jenkins Packages Index of /redhat-stable…

使用redis-shake工具进行redis的数据同步

前言&#xff1a; 工作中将常遇到测试环境和正式环境的数据同步或者需要进行数据迁移&#xff0c;对于mysql数据库的方案倒是不少&#xff0c;但是redis中如何快速便捷的迁移呢&#xff1f;答案是阿里云提供的:redis-shake RedisShake是阿里云基于豌豆荚开源的redis-port进行…

04 —— Webpack打包CSS代码

加载器css-loader &#xff1a;解析css代码 webpack 中文文档 | webpack中文文档 | webpack中文网 加载器style-loader&#xff1a;把解析后的css代码插入到DOM style-loader | webpack 中文文档 | webpack中文文档 | webpack中文网 准备css代码&#xff0c;放到src/login目…

Nacos实现IP动态黑白名单过滤

一些恶意用户&#xff08;可能是黑客、爬虫、DDoS 攻击者&#xff09;可能频繁请求服务器资源&#xff0c;导致资源占用过高。因此我们需要一定的手段实时阻止可疑或恶意的用户&#xff0c;减少攻击风险。 本次练习使用到的是Nacos配合布隆过滤器实现动态IP黑白名单过滤 文章…

SAP PI/PO Proxy2JDBC SQL_QUERY动态接口示例

目录 背景&#xff1a; 完整demo步骤&#xff1a; IR: ID: SPROXY: 测试代码&#xff1a; 注意点&#xff1a; 背景&#xff1a; 中途临时帮客户项目做其他功能&#xff0c;项目上有部分开发项需要通过PO去第三方数据库取数&#xff0c;项目上的开发对PO不太熟&#xf…

如何使用本地大模型做数据分析

工具&#xff1a;interpreter --local 样本数据&#xff1a; 1、启动分析工具 2、显示数据文件内容 输入&#xff1a; 显示/Users/wxl/work/example_label.csv 输出&#xff1a;(每次输出的结果可能会不一样&#xff09; 3、相关性分析 输入&#xff1a; 分析客户类型与成…

中间件--laravel进阶篇

laravel版本11.31,这中间件只有3种,分别是全局中间件,路由中间件,控制器中间件。相比thinkphp8,少了一个应用中间件。 一、创建中间件 laravel创建中间件可以使用命令的方式创建,非常方便。比如php artisan make:middleware EnsureTokenIsValid。EnsureTokenIsValid是中间…

一维卷积神经网络(1D-CNN)

一维卷积神经网络&#xff08;1D Convolutional Neural Network, 1D CNN&#xff09;是卷积神经网络的一种变体&#xff0c;专门用于处理序列数据&#xff0c;如时间序列、文本等。 一、基本结构 一维卷积神经网络的基本结构与二维卷积神经网络&#xff08;2D CNN&#xff09;类…

Java中的TreeSet集合解析

记一下java流处理的操作 1.去重&#xff0c;按照billTypeCode去重 list list.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> o.getBillTypeCode()))), ArrayList::new)); 排序&#x…

vue中mixin(混入)的使用

目录 mixin(混入) 使用方式 第一步定义混合 ​编辑 第二步使用混入 局部混入 全局混合 mixin(混入) 功能&#xff1a;可以把多个组件共用的配置提取成一个混入对象 使用方式 第一步定义混合 { data(){....}, methods:{....} .... } 第二步使用混入 …

vue中路由缓存

vue中路由缓存 问题描述及截图解决思路关键代码及打印信息截图 问题描述及截图 在使用某一平台时发现当列表页码切换后点击某一卡片进入详情页后&#xff0c;再返回列表页时页面刷新了。这样用户每次看完详情回到列表页都得再重新输入自己的查询条件&#xff0c;或者切换分页到…