贪心算法学习——最长单调递增子序列

目录

​编辑

一,题目

二,题目接口

三,解题思路和代码


一,题目

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。

 

示例 1:

输入:nums = [10,9,2,5,3,7,101,18]
输出:4
解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。

示例 2:

输入:nums = [0,1,0,3,2,3]
输出:4

示例 3:

输入:nums = [7,7,7,7,7,7,7]
输出:1

二,题目接口

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {

    }
};

三,解题思路和代码

      这道单调递增子序列的算法题的解法有很多,比如动态规划,记忆化搜索等等。但是使用动态规划和记忆化搜索的时间复杂度都比较高大概都是O(n^2)。但是使用贪心算法的思想来解答这道题的话能让时间复杂度下降到O(n*log2N)。现在就来说一下该如何实现这个算法。

     步骤:

   1,首先我们得要创建一个vector<int>类型的数组ret。这个数组是用来存储子序列的。

   2,对nums数组进行遍历对于每个数组元素nums[i]会有两种不同的情况:

          1.大于ret.back(),这个时候直接将这个nums[i]插入到ret的最后面。

          2.小于ret.back(),这个时候便要采用二分查找法在ret中找到一个合适的位置放入                           nums[i].

  3.遍历结束后便可以返回ret.size()。

代码如下:

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
    
         vector<int>ret;
         ret.push_back(nums[0]);
        for(int i = 1;i<nums.size();i++)
        {
           if(nums[i]>ret.back())
           {
               ret.push_back(nums[i]);
           }

           else
           {
               int left = 0;
               int right = ret.size()-1;

              while(left<right)
              {
               int mid = (right+left)/2;
                if(nums[i]>ret[mid])
               {
                   left = mid+1;
               }
               else
               {
                   right = mid;
               }

              }

             ret[right] = nums[i];

           }
        }
         
         return ret.size();
    }
};

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

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

相关文章

【开源】基于SpringBoot的城市桥梁道路管理系统的设计和实现

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询城市桥梁4.2 新增城市桥梁4.3 编辑城市桥梁4.4 删除城市桥梁4.5 查询单个城市桥梁 五、免责说明 一、摘要 1.1 项目介绍 基于VueSpringBootMySQL的城市桥梁道路管理系统&#xff0c;支持…

npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。

1、在vscode终端执行 get-ExecutionPolicy &#xff0c;显示Restricted&#xff0c;说明状态是禁止的。 2、更改状态: set-ExecutionPolicy RemoteSigned 出现需要管理员权限提示&#xff0c;可选择执行 Set-ExecutionPolicy -Scope CurrentUser 出现的ExecutionPolicy参数后输…

企业如何安全跨国传输30T文件数据

对于一些对数据敏感性比较高的企业&#xff0c;如IT企业和国企等&#xff0c;跨国数据传输是当今企业面临的一个重要挑战&#xff0c;尤其是当数据量达到30T这样的规模时&#xff0c;如何保证数据的速度、安全和合规性&#xff0c;就成为了企业必须考虑的问题。本文将从以下几个…

NTP(Network Time Protocol 网络时间协议)

作用 大数据产生与处理系统是各种计算设备集群的&#xff0c;计算设备将统一、同步的标准时间用于记录各种事件发生时序&#xff0c;如 E-MAIL 信息、文件创建和访问时间、数据库处理时间等。大数据系统内不同计算设备之间控制、计算、处理、应用等数据或操作都具有时序性&…

vue项目package.json与package-lock.json作用及区别

package.json文件介绍和使用 运行项目&#xff0c;命令行: npm run dev “dependencies” 运行依赖&#xff0c;需引入页面使用 “devDependencies” 开发依赖(生产环境使用)&#xff0c;只是开发阶段需要 我们每次新建一个项目的时候会发现在项目中会有这么俩个相似的文件&am…

基于SSM的高校图书馆设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

独家揭秘|小米14魔改存储芯片多出8GB空间背后的秘诀

在昨天发表的文章下面&#xff0c;有粉丝朋友要求“评价下小米256GB多8GB的技术”。小编也是好奇&#xff0c;本文就让我们一起来看看这个“高科技”背后的秘密。&#xff08;提前声明&#xff1a;本文内容仅代表个人观点&#xff0c;如果不当之处&#xff0c;小米公司不要投诉…

推荐免费的文本转语音工具TTS-Vue【且开源】

标签&#xff1a; 文本转语音&#xff1b; 免费文本转语音软件&#xff1b; 网上有很多文本转语音的工具&#xff0c;但收费具多。 这里推荐一个免费的文本转语音工具。 不需要注册&#xff0c;下载安装就可以使用。且代码开源。 TTS-Vue 软件主页&#xff1a;https://loker…

在 Windows 用 Chrome System Settings 设置代理

在 Windows 用 Chrome System Settings 设置代理 贴心提示&#xff1a;在设置代理之前&#xff0c;请确保您已经安装了 浏览器。 &#x1f527; 设置代理的详细步骤如下&#xff1a; 打开 浏览器&#xff0c;输入 //settings/system 并回车。 在「系统和网络设置」页面中&am…

Android官方ShapeableImageView描边/圆形/圆角图,xml布局实现

Android官方ShapeableImageView描边/圆形/圆角图&#xff0c;xml布局实现 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.…

【数据结构】交换排序

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;浅谈数据结构 &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 冒泡、快速排序 1. 冒泡排序2. 快速…

JavaScript控制流程简介

目录 条件语句 if语句 else if语句 else语句 循环语句 for循环 while循环 do...while循环 switch语句 总结 在编程中&#xff0c;控制流程是指程序执行的顺序&#xff0c;即代码按照何种方式被执行。JavaScript作为一种强大的脚本语言&#xff0c;具备了灵活的控制流…

JUC并发编程之Synchronized锁优化

目录 1. Java对象头 2. Synchronized锁优化 2.1 偏向锁 2.2 轻量级锁 2.3 重量级锁 2.4 各种锁对比 1. Java对象头 HotSpot虚拟机中&#xff0c;对象在内存中存储的布局可以分为三块区域&#xff1a;对象头&#xff08;Header&#xff09;、实例数据&#xff08;Instance D…

Linux - 进程状态 - Linux 当中的进程状态是如何维护的?

进程状态 一个进程在 系统当中有很多的状态&#xff0c;比如&#xff1a;一个进程正在被cpu执行&#xff0c;那这个进程就是一个 r 状态&#xff1b;一个进程已经准备好了&#xff0c;但是其中的运行这个进程需要的资源没有准备好&#xff0c;那么这个进程一人不能运行。 比如…

图解java.util.concurrent并发包源码系列——深入理解ConcurrentHashMap并发容器,看完薪水涨一千

图解java.util.concurrent并发包源码系列——深入理解ConcurrentHashMap并发容器 HashMap简单介绍HashMap在并发场景下的问题HashMap在并发场景下的替代方案ConcurrentHashMap如何在线程安全的前提下提升并发度1.71.8 JDK1.7的ConcurrentHashMap源码JDK1.8的ConcurrentHashMap源…

STM32的BOOT1和BOOT0查找及配置-都有BOOT1引脚的

STM32 BOOT0和BOOT1引脚查找 STM32是有BOO0和BOOT1的&#xff0c;有的芯片原理图没有标注BOOT1&#xff0c;但是可以正在手册查到BOOT0和BOOT1引脚的。 STM32 BOOT配置方式 1&#xff09;主Flash 主Flash起始地址为0x08000000&#xff0c;它指的是STM32内置Flash&#xff0c;通…

TensorFlow学习:使用官方模型和自己的训练数据进行图片分类

前言 教程来源&#xff1a;清华大佬重讲机器视觉&#xff01;TensorFlowOpencv&#xff1a;深度学习机器视觉图像处理实战教程&#xff0c;物体检测/缺陷检测/图像识别 注&#xff1a; 这个教程与官网教程有些区别&#xff0c;教程里的api比较旧&#xff0c;核心思想是没有变…

RabbitMQ的交换机(原理及代码实现)

1.交换机类型 Fanout Exchange&#xff08;扇形&#xff09;Direct Exchange&#xff08;直连&#xff09;opic Exchange&#xff08;主题&#xff09;Headers Exchange&#xff08;头部&#xff09; 2.Fanout Exchange 2.1 简介 Fanout 扇形的&#xff0c;散开的&#xff1…

[LaTeX] [数学符号] \mathbb{1}的各种替代方案:解决在 LaTeX 中输入黑板粗体的数字

[LaTeX] [数学符号] \mathbb{1}的各种替代方案&#xff1a;解决在 LaTeX 中输入黑板粗体的数字_latex mathbb-CSDN博客文章浏览阅读5w次&#xff0c;点赞36次&#xff0c;收藏80次。本文介绍如何在 LaTeX 中输入黑板粗体的数字。_latex mathbbhttps://blog.csdn.net/xovee/arti…

ABBYY FineReader PDF15免费版图片文件识别软件

ABBYY全称为“ABBYY FineReader PDF”, ABBYY FineReader PDF集优秀的文档转换、PDF 管理和文档比较于一身。 首先这款软件OCR文字识别功能十分强大&#xff0c;话不多说&#xff0c;直接作比较。下图是某文字识别软件识别一串Java代码的结果&#xff0c;识别的结果就不多评价…