贪心算法(局部最优实现全局最优)第二篇

贪心算法(局部最优实现全局最优)第二篇

目录

1. LeetCode376. 摆动序列

2. LeetCode334. 递增的三元子序列

3. LeetCode674. 最长连续递增序列

4. LeetCode121. 买卖股票的最佳时机


今天我们继续来聊聊贪心算法,因为我在前面也说过贪心算法最重要的就是经验,所以我们今天继续通过刷题的方式来学习贪心算法。

1. LeetCode376. 摆动序列

这道题的意思其实也比较好理解的,就是求一个最长的摆动序列,可以从原数组中删除不符合条件的数。

这道题的话我们先来聊一下思路,因为要求的是最长的子数组。根据题目要求那么是不是说我们每次选的数字都要在有限的分为里面做到尽可能的大或者尽可能的小。为什么要这么做呢?是因为但我们选到最值的时候我们在后面的选择中才可以有更多的选择。

我们看下面这个图,里面有abcdef这几个极值点。我们看,在c和d之间有一个点x1,假设我们在这里选择了这个点的话,那么后面的数都选不了了,因为接下来是要选择比x1小的数。这也是为什么我们每一次都要选择最值的原因。

那么我们代码该怎么设计呢?我们就可以试用一个三指针,通过比较的这三个指针的大小的方式来确定极值点的位置。或者我们也可以观察一下下面这张图,以b点为例子,我们通过后面的点减去前面的点的方式,b减去ab上面的点都是正数,而bc上面的点减去b都是负数,而如果是一个非极值点的话,则都是正数,通过这样的方式我们就得到了极值点,接下来我们就使用这个方式来编写代码。

我们看下面这个代码,前面两个if条件判断都是用来特判的。同时因为原数组里面的值是可能连续好几个相同的,所以我们在这里是需要if判断的,如果相同那么就直接跳过。最后的答案之所以需要+2也是因为我们在这样判断的时候是没有加上两边的端点的,所以我们在这里需要加上。

class Solution { public: int wiggleMaxLength(vector<int>& nums) { int left=0; int right=0; int sz=nums.size(); int ret=0; if(sz==1||(sz==2&&(nums[0]==nums[1]))) return 1; if((nums[0]==nums[sz-1])&&(nums[0]==nums[sz/2])) return 1; for(int i=0;i<sz-1;++i) { right=nums[i+1]-nums[i]; if(!right) continue; if((left*right)<0) { ret++; } left=right; } return ret+2; } };

2. LeetCode334. 递增的三元子序列

这道题的话就比较简单,就是要求我们判断原数组里面有没有三个数是呈现递增关系的,有的话就返回true,没有的话就返回false。

这道题的思路其实挺好想到的,就是在代码编写的时候不要写错了就好。这道题的解法有点像我上面说的三指针。简单来说就是几个判断就好了。

可是这道题使用到了贪心吗?答案是Yes。因为我们的代码有一个思想,那就是每一次判断都在进行筛选,我们都在尽可能的让a和b变小,这样方便我们找到合适的点。

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

3. LeetCode674. 最长连续递增序列

这道题的话比较简单,就是叫我们从原数组里面找到最长的递增子数组,同时要求是连续的。

这道题的话就比较简单了,就是从头到尾遍历一遍就好,同时记录最大的ret就可以了。

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

4. LeetCode121. 买卖股票的最佳时机

这道题的话也是比较简单的,就是要求我们在原数组里面找到两数之差最大的那两个数。

所以说这道题的话我们就是通过一次遍历然后同时用一个l来不断更新最小值,这样我们就可以取到最大的数了。

这道题贪心的地方在于l一直在更新,在不断地变小。

class Solution { public: int maxProfit(vector<int>& p) { int sz=p.size(); int ret=0; int ret1=0; int l=INT_MAX;//买 for(int i=0;i<sz;++i) { if(l<p[i]) ret=max(ret,p[i]-l); if(l>p[i]) l=p[i]; } return ret; } };

Read more

【Linux指令 (三)】从理解到熟悉:探索Linux底层逻辑与指令的高效之道,理解Linux系统理论核心概念与基础指令

【Linux指令 (三)】从理解到熟悉:探索Linux底层逻辑与指令的高效之道,理解Linux系统理论核心概念与基础指令

🔥艾莉丝努力练剑:个人主页 ❄专栏传送门:《C语言》、《数据结构与算法》、C/C++干货分享&学习过程记录、Linux操作系统编程详解、笔试/面试常见算法:从基础到进阶 ⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平 🎬艾莉丝的简介: 🎬艾莉丝的Linux专栏简介: 目录 前期提示 1  ~>  本期指令 2  ~>  查看相关的指令 19  cat 19.1  概念 19.2  实践 19.2.1  写入一句话 19.2.2  追加写 19.2.3  -n:带行号 19.

By Ne0inhk
Flutter 三方库 easy_localization_sheet 的鸿蒙化适配指南 - 实现基于 Google Sheets 的云端国际化协作、支持多语言翻译的一键式同步与配置导出

Flutter 三方库 easy_localization_sheet 的鸿蒙化适配指南 - 实现基于 Google Sheets 的云端国际化协作、支持多语言翻译的一键式同步与配置导出

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 easy_localization_sheet 的鸿蒙化适配指南 - 实现基于 Google Sheets 的云端国际化协作、支持多语言翻译的一键式同步与配置导出 前言 在进行 Flutter for OpenHarmony 的全场景应用开发时,如何低成本、高效地管理数十种语言的翻译资源?让不懂代码的产品经理或翻译人员直接修改代码(JSON/ARB)显然不现实。easy_localization_sheet 是一款极具创意的提效工具。它能将谷歌表格(Google Sheets)变成你的云端翻译后台。本文将介绍如何在鸿蒙开发流中利用该库实现“协同即同步”的国际化体验。 一、原原理性解析 / 概念介绍 1.1 基础原理 该工具利用谷歌公开的 Google Sheets API,

By Ne0inhk
Flutter 三方库 geojson 鸿蒙化高分辨地图数据处理内核适配剖析:无差异挂载全量地理规范信息网格结构解算矩阵,驱动终端海量点线面轻量化重叠渲染地图-适配鸿蒙 HarmonyOS ohos

Flutter 三方库 geojson 鸿蒙化高分辨地图数据处理内核适配剖析:无差异挂载全量地理规范信息网格结构解算矩阵,驱动终端海量点线面轻量化重叠渲染地图-适配鸿蒙 HarmonyOS ohos

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 geojson 鸿蒙化高分辨地图数据处理内核适配剖析:无差异挂载全量地理规范信息网格结构解算矩阵,驱动终端海量点线面轻量化重叠渲染地图感知组件调度 前言 在 OpenHarmony 的智慧地图、物流穿梭及政务地理信息(GIS)系统中,如何高效且标准地解析地理空间数据是核心环节。GeoJSON 作为互联网最通用的地理开放标准,其强大的表达能力(点、线、多边形等)是鸿蒙应用连接全球地理数据的桥梁。geojson 库为 Flutter 开发者提供了一套高性能、流式处理的解析方案。本文将深度剖析其在鸿蒙端的适配实战,展示如何让地图应用感知万物坐标。 一、原理解析 / 概念介绍 1.1 基础原理/概念介绍 geojson 库的核心是一套基于 Stream-based Parsing(基于流的解析) 的处理引擎。它不仅支持一次性将 JSON 字符串转为 Dart

By Ne0inhk
鸿蒙 App 的代码结构应该怎么拆分

鸿蒙 App 的代码结构应该怎么拆分

子玥酱(掘金 / 知乎 / ZEEKLOG / 简书 同名) 大家好,我是子玥酱,一名长期深耕在一线的前端程序媛 👩‍💻。曾就职于多家知名互联网大厂,目前在某国企负责前端软件研发相关工作,主要聚焦于业务型系统的工程化建设与长期维护。 我持续输出和沉淀前端领域的实战经验,日常关注并分享的技术方向包括前端工程化、小程序、React / RN、Flutter、跨端方案, 在复杂业务落地、组件抽象、性能优化以及多端协作方面积累了大量真实项目经验。 技术方向:前端 / 跨端 / 小程序 / 移动端工程化 内容平台:掘金、知乎、ZEEKLOG、简书 创作特点:实战导向、源码拆解、少空谈多落地 文章状态:长期稳定更新,大量原创输出 我的内容主要围绕 前端技术实战、真实业务踩坑总结、框架与方案选型思考、行业趋势解读 展开。文章不会停留在“API 怎么用”,而是更关注为什么这么设计、在什么场景下容易踩坑、

By Ne0inhk