贪心题目总结

1. 最长递增子序列 

我们来看一下我们的贪心策略体现在哪里???

我们来总结一下:

我们在考虑最长递增子序列的长度的时候,其实并不关心这个序列长什么样子,我们只是关心最后一个元素是谁。这样新来一个元素之后, 我们就可以判断是否可以拼接到它的后面。因此,我们可以创建一个数组,统计长度为 x 的递增子序列中,最后一个元素是谁。为了尽可能的让这个序列更长,我们仅需统计长度为x的所有递增序列中最后一个元素的「最小值」。此时我们来算一下时间复杂度,首先我们要遍历整个数组,其次我们还要遍历长度为x的序列,那么此时的复杂度是O(N2),统计的过程中发现,数组中的数呈现「递增」趋势,因此可以使用「二分」来查找插入位置。

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 = (left + right) / 2;if(ret[mid] < nums[i]){left = mid + 1;}else{right = mid;}}ret[left] = nums[i];// 放在 left 位置上}}return ret.size(); }
};

2. 递增的三元子序列 

我们会发现这道题目就是最递增子序列的简化版,因此我们可以使用贪心的思想,找到最长子序列然后判断长度是否大于3即可解决,但是实际上我们不需要使用二分算法,因为我们只需要求出长度为3的子序列,仅需两次比较就可以找到插入位置,同时不用一个数组存数据,仅需两个变量即可,此时的时间复杂度为O(N).

直接来上代码:

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

3. 最长连续递增序列

这个题目比较简单,找到以某个位置为起点的最长连续递增序列之后(设这个序列的末尾为 j 位置),接下来直接以 j + 1 的位置为起点寻找下⼀个最长连续递增序列,我们没有必要从i + 1位置进行寻找,因为 i 位置找到的序列肯定是最长的!!!

class Solution {
public:int findLengthOfLCIS(vector<int>& nums) {int ret = 0;int i = 0;while(i < nums.size()){int j = i + 1;// 找到递增区间的末端while(j < nums.size() && nums[j] > nums[j-1]){j++;}ret = max(ret,j - i);// 直接在循环中更新下⼀个位置的起点i = j; // 贪心}return ret;}
};

4. 买卖股票的最佳时机

首先我们看到这道题目,第一想到的肯定是暴力枚举,我们可以依次枚举两个位置,然后进行相减,最后保存相减出来的最大值即可,但是这样的复杂度就是O(N2)的,此时我们就可以进行优化,我们在枚举卖出价格时候,并不用将前面买入的股票的价格依次枚举,我们只需要找到其中的最小值即可,这一个点就体现出来贪心的策略,由于只能交易⼀次,所以对于某⼀个位置 i ,要想获得最大利润,仅需知道前⾯所有元素的最小值。然后在最小值的位置「买入」股票,在当前位置「卖出」股票即可。

class Solution {
public:int maxProfit(vector<int>& prices) {int prevmin = INT_MAX;int ret = 0; // 记录最终结果for(int i = 0; i < prices.size(); i++){// 先更新结果ret = max(prices[i] - prevmin, ret);// 再更新最小值if(prices[i] < prevmin)prevmin = prices[i];}return ret;}
};

5. 买卖股票的最佳时机Ⅱ

由于可以进行⽆限次交易,所以只要是⼀个「上升区域」,上升区间一定是稳赚的,我们就把利润拿到手就好了,这就是贪心策略。

⭐解法一:双指针

class Solution {
public:int maxProfit(vector<int>& prices) {int ret = 0;for(int i =0 ; i < prices.size(); ){int j = i;while(j + 1 < prices.size() && prices[j + 1] > prices[j]){j++; // 寻找上升的区间}ret += prices[j] - prices[i];i = j + 1;}return ret;}
};

⭐解法二:拆分交易,只要今天的股票的价格大于昨天,就可以累计到利润上

class Solution {
public:int maxProfit(vector<int>& prices) {int ret = 0;for(int i = 1; i < prices.size(); i++){if(prices[i] > prices[i - 1])ret += prices[i] - prices[i - 1];}return ret;}
};

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

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

相关文章

【Week-R1】RNN实现心脏病预测,基于tensorflow框架

文章目录 一、什么是RNN&#xff1f;二、准备环境和数据2.1 导入数据 三、构建模型四、训练和预测五、其他&#xff08;1&#xff09;sklearn模块导入报错&#xff1a;ModuleNotFoundError: No module named sklearn&#xff08;2&#xff09;优化器改为SGD&#xff0c;accurac…

Linux系统之GoAccess实时Web日志分析工具的基本使用

Linux系统之GoAccess实时Web日志分析工具的基本使用 一、GoAccess介绍1.1 GoAccess简介1.2 GoAccess功能1.3 Web日志格式 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、检查本地环境3.1 检查本地操作系统版本3.2 检查系统内核版本3.3 检查系统镜像源3.4 更新软件列表…

JavaFX安装与使用

前言 最近学习了javafx,开始时在配置环境和导包时遇到了一些麻烦,关于网上很多方法都尝试过了,现在问题都解决了,和大家分享一下我是怎么实现javafx的配置,希望大家可以通过这个方法实现自己的环境配置! &#x1f648;个人主页: 心.c &#x1f525;文章专题:javafx &#x1f49…

计算机网络-Traffic-Filter流量过滤策略

一、概述 为提高网络安全性&#xff0c;管理人员需要控制进入网络的流量&#xff0c;将不信任的报文丢弃在网络边界。所谓的不信任报文是指对用户来说存在安全隐患或者不愿意接收的报文。同时保证数据访问安全性&#xff0c;企业网络中经常会要求一些部门之间不能相互访问。 背…

服务器数据恢复—同友存储raid5阵列上层虚拟机数据恢复案例

服务器数据恢复环境&#xff1a; 某市教育局同友存储&#xff0c;存储中有一组由数块磁盘组建的raid5阵列&#xff0c;存储空间划分若干lun。每个lun中有若干台虚拟机&#xff0c;其中有数台linux操作系统的虚拟机为重要数据。 存储结构&#xff1a; 服务器故障&#xff1a; r…

slam14讲(第9,10讲 后端)

slam14讲&#xff08;第9&#xff0c;10讲 后端&#xff09; 后端分类基于滤波器的后端线性系统和卡尔曼滤波非线性系统和扩展卡尔曼滤波 BA优化H矩阵的稀疏性和边缘化H矩阵求解的总结 位姿图优化公式推导 基于滑动窗口的后端个人见解旧关键帧的边缘化 后端分类 基于滤波器的后…

AtCoder Beginner Contest 355 A~F

A.Who Ate the Cake?(思维) 题意 已知有三个嫌疑人&#xff0c;有两个证人&#xff0c;每个证人可以指出其中一个嫌疑人不是罪犯&#xff0c;如果可以排除两个嫌疑人来确定犯人&#xff0c;输出犯人的身份&#xff0c;如果无法确定&#xff0c;输出"-1"。 分析 …

springboot + Vue前后端项目(第十一记)

项目实战第十一记 1.写在前面2. 文件上传和下载后端2.1 数据库编写2.2 工具类CodeGenerator生成代码2.2.1 FileController2.2.2 application.yml2.2.3 拦截器InterceptorConfig 放行 3 文件上传和下载前端3.1 File.vue页面编写3.2 路由配置3.3 Aside.vue 最终效果图总结写在最后…

TabAttention:基于表格数据的条件注意力学习

文章目录 TabAttention: Learning Attention Conditionally on Tabular Data摘要方法实验结果 TabAttention: Learning Attention Conditionally on Tabular Data 摘要 医疗数据分析通常结合成像数据和表格数据处理&#xff0c;使用机器学习算法。尽管先前的研究探讨了注意力…

Hudi 多表摄取工具 HoodieMultiTableStreamer 配置方法与示例

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…

vue3添加收藏网站页面

结构与样式 <template><div class"web_view"><ul><li v-for"web in webList" :key"web.title"><a :href"web.src" :title"web.title" target"_blank"><img :src"web.img&…

微信小程序基础 -- 小程序UI组件(5)

小程序UI组件 1.小程序UI组件概述 开发文档&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/framework/view/component.html 什么是组件&#xff1a; 组件是视图层的基本组成单元。 组件自带一些功能与微信风格一致的样式。 一个组件通常包括 开始标签 和 结…

Cyber Weekly #8

赛博新闻 1、微软召开年度发布会Microsoft Build 2024 本周&#xff08;5.22&#xff09;微软召开了年度发布会&#xff0c;Microsoft Build 2024&#xff0c;发布了包括大杀器 Copilot Studio 在内的 50 项更新。主要包括&#xff1a; 硬件层面&#xff1a;与英伟达 & A…

3D牙科网格分割使用基于语义的特征学习与图变换器

文章目录 3D Dental Mesh Segmentation Using Semantics-Based Feature Learning with Graph-Transformer摘要方法实验结果 3D Dental Mesh Segmentation Using Semantics-Based Feature Learning with Graph-Transformer 摘要 本文提出了一种新颖的基于语义的牙科网格分割方…

民国漫画杂志《时代漫画》第16期.PDF

时代漫画16.PDF: https://url03.ctfile.com/f/1779803-1248612470-6a05f0?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps:资源来源网络&#xff01;

【C++】二分查找:在排序数组中查找元素的第一个和最后一个位置

1.题目 难点&#xff1a;要求时间复杂度度为O(logn)。 2.算法思路 需要找到左边界和右边界就可以解决问题。 题目中的数组具有“二段性”&#xff0c;所以可以通过二分查找的思想进行解题。 代码&#xff1a; class Solution { public:vector<int> searchRange(vect…

Camunda BPM主要组件

Camunda BPM是使用java开发的,核心流程引擎运行在JVM里,纯java库,不依赖其他库或者底层操作系统。可以完美地与其他java框架融合,比如Spring。除了核心流程引擎外,还提供了一系列的管理,操作和监控工具。 1,工作流引擎 既适用于服务或者微服务编排,也适用于人工任务管…

Leetcode42题:接雨水

1.题目描述 给定 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,…

【C语言】二叉树的实现

文章目录 前言⭐一、二叉树的定义&#x1f6b2;二、创建二叉树&#x1f3a1;三、二叉树的销毁&#x1f389;四、遍历二叉树1. 前序遍历2. 中序遍历3. 后序遍历4. 层序遍历 &#x1f332;五、二叉树的计算1. 计算二叉树结点个数2. 计算二叉树叶子结点的个数3. 计算二叉树的深度4…