贪心算法基础及leetcode例题

参考

理论

本质:找到每个阶段的局部最优,然后去推导得到全局最优
两个极端:常识&&很难:

很多同学通过了贪心的题目,但都不知道自己用了贪心算法,因为贪心有时候就是常识性的推导,所以会认为本应该就这么做!

套路:
贪心没有套路,说白了就是常识性推导加上举反例
做题的时候,只要想清楚 局部最优 是什么,如果推导出全局最优,其实就够了。

贪心算法一般分为如下四步:

将问题分解为若干个子问题
找出适合的贪心策略
求解每一个子问题的最优解
将局部最优解堆叠成全局最优解
这个四步其实过于理论化了,我们平时在做贪心类的题目 很难去按照这四步去思考,真是有点“鸡肋”。

Leetcode题目

简单题

455.分发饼干

思路:大饼干 喂 胃口大的kid,才能充分利用

class Solution {
    public int findContentChildren(int[] g, int[] s) {
        Arrays.sort(g);
        Arrays.sort(s);
        int j=s.length-1;
        int sum = 0;

        for(int i=g.length-1;i>=0;i--){
            if(j>=0 && s[j]>=g[i]){
                sum++;
                j--;
            }
        }
        return sum;
    }
}

中等题

序列问题---376. 摆动序列

思路:考虑情况

记录摆动条件:
prediff>0 && curdiff<0
或者 prediff<0 && curdiff>0

情况1:上下坡中有平坡

在图中,当i指向第一个2的时候,prediff > 0 && curdiff = 0 ,当 i 指向最后一个2的时候 prediff = 0 && curdiff < 0。
如果我们采用,删左面三个2的规则,那么 当 prediff = 0 && curdiff < 0 也要记录一个峰值。

综合到上述:记录条件【prediff>=0 && curdiff<0 或 prediff=<0 && curdiff>0】

情况2:首尾两端

result初始为1(默认最右面有一个峰值),
curDiff > 0 && preDiff <= 0,那么result++(计算了左面的峰值),最后得到的result就是2(峰值个数为2即摆动序列长度为2)

做法:初始化prediff=0

情况3:单调有平坡

只需要在 这个坡度 摆动变化的时候,更新prediff就行,这样prediff在 单调区间有平坡的时候 就不会发生变化

做法:调整prediff更新位置

java实现

class Solution {
    public int wiggleMaxLength(int[] nums) {
    
        int prediff = 0;//考虑只有两个元素的时候,默认为0;为头元素制造一个平坡
        int curdiff = 0;
        int result = 1;//默认最右端有坡度
        //一个元素的时候
        if(nums.length == 0) return result;
        
        for(int i=0;i<nums.length-1;i++){//nums.length-1 因为最右端已经记录了

            curdiff = nums[i+1] - nums[i];
             
            if((prediff>=0 && curdiff <0) || (prediff<=0 && curdiff >0)){
                result++;
                prediff = curdiff;
            }
        //prediff = curdiff;
        }
        return result;
    }
}

股票问题---122. 买卖股票的最佳时机 II

只有一只股票!当前只有买股票或者卖股票的操作
关键点:想到其实最终利润是可以分解的:每天的利润
贪心:只收集每次的正利润

其实我们需要收集每天的正利润就可以,收集正利润的区间,就是股票买卖的区间,而我们只需要关注最终利润,不需要记录区间。

java

class Solution {
    public int maxProfit(int[] prices) {
        int sum = 0;
        for(int i=0;i < prices.length-1;i++){
            if((prices[i+1] - prices[i])>= 0){
                sum += prices[i+1] - prices[i];
            }
        }

        return sum;
    }
}

两个维度权衡问题---135. 分发糖果

关键点:两边分别考虑
先确定 右边比左边高的情况;然后再确定 左边比右边高的情况

class Solution {
    public int candy(int[] ratings) {
        int sum = 0;
        int len = ratings.length;
        int[] candy = new int[len];
        

        candy[0]=1;


        for(int i=1;i<len;i++){
            if(ratings[i] > ratings[i-1]){
                candy[i] = candy[i-1] +1;
            }else{
                candy[i] =1;
            }
        }

        for(int i=len-2;i>=0;i--){
            if(ratings[i] > ratings[i+1]){
                candy[i] = Math.max(candy[i+1] +1,candy[i]);
            }
        }

        for(int i=0;i<len;i++){
            sum += candy[i];
        }

        return sum;
    }
}
本文转载于网络 如有侵权请联系删除

相关文章

  • 2020年抖音用户画像报告,DAU超4亿!「建议收藏」

    大家好,又见面了,我是你们的朋友全栈君。抖音DAU超4亿,较去年同期的2.5亿,增长了60%。抖音与头条的重合度为32.1%,重合用户占抖音的42.2%。抖音与西瓜的重合度为24.6%,重合用户占抖音的29.5%。抖音10-19次占比领先,30分钟以上时长占比提高到38%。抖音整体人群画像,男女较均衡,19-30岁TGI高,新一线、三线及以下城市用户TGI高。抖音省份/城市TOP10分布,广东、河南、山东省占比高,郑州、西安、昆明市偏好度高。抖音男女人群画像,男性19-24岁、41-45岁的用户偏好度高,女性中19-30岁用户偏好度高。抖音高低线城市人群画像,高线城市中19-30岁的用户偏好度高,低线城市中19-35岁用户偏好度高。抖音不同年龄段人群画像,95后中男性占比略高、且TGI高;90后中女性TGI高。抖音不同年龄段人群画像,85后中女性TGI高,低线城市占比超6成;80后中男性占比高、TGI高。抖音用户偏好视频类型,演绎、生活、美食类视频播放量较高,观看情感、文化、影视类视频增长较快。男性用户对军事、游戏、汽车偏好度较高,女性用户对美妆、母婴、穿搭偏好度高。00后对游戏、电子

  • 实时音视频助力在线教育风口

    文/蒋磊整理/LiveVideoStack各位朋友大家好,今天主要是来分享关于实时音视频与教育的结合。本来最开始的标题是“TRTC与在线教育的那些事儿”,但考虑大家都是做技术的,所以改为“实时视频助力在线教育的新风口”,能力有限,如果有错误与问题,还请多多指教,欢迎一起交流学习。首先做下自我介绍,我叫蒋磊,现在是腾讯云TRTC客户端的产品架构师。加入腾讯云之前在网易和阿里云,主要从事直播、点播、CDN的技术。加入腾讯云之后主要做的是关于音视频处理这一块的客户端SDK。今天分享内容主要包括三点。第一个点是关于疫情影响下在线教育市场的变化情况,我们称做井喷,第二点是我们这个项目在此过程中踩坑、填坑的几个案例,以及实践经验分享,最后是我们在在线教育新模式上面的一些尝试与探索。1.在线教育的变化首先,简单介绍一下我们TRTC这个项目。TRTC(TencentRealtimeCommunication)全称是腾讯实时音视频,是在腾讯云上以SDK和RESTAPI的方式提供售卖的云服务。我们主打两个场景,一个是多人实时互动,像视频会议、小班课、大班课等,另一种是低延时的直播,像娱乐场景中的语聊房、秀

  • 微服务为什么一定要 Zookeeper 呢?

    来源:MarvinMaiblog.csdn.net/Mkhaixian2014/article/details/89980476一、背景二、Zookeeper的特性1.树状目录结构2.持久节点(Persistent)3.持久有序节点(Persistent_sequential)4.临时节点(Ephemeral)5.临时有序节点(Ephemeral_sequential)6.节点监听(Wacher)三、微服务中应用场景1.分布式锁2.服务注册与发现一、背景了解微服务的小伙伴都应该知道Zookeeper,ZooKeeper是一个分布式的,开源的分布式应用程序协调服务。现在比较流行的微服务框架Dubbo、SpringCloud都可以使用Zookeeper作为服务发现与组册中心。但是,为什么Zookeeper就能实现服务发现与组册呢?二、Zookeeper的特性我们先来了解一下Zookeeper的特性吧,因为它的特性决定了它的使用场景。1.树状目录结构如上图,Zookeeper是一个树状的文件目录结构,有点想应用系统中的文件系统的概念。每个子目录(如App)被称为znode,我们可以对每个zn

  • 玩转Mysql系列 - 第16篇:变量详解

    Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能。欢迎大家加我微信itsoku一起交流java、算法、数据库相关技术。这是Mysql系列第16篇。环境:mysql5.7.25,cmd命令中进行演示。代码中被[]包含的表示可选,|符号分开的表示可选其一。我们在使用mysql的过程中,变量也会经常用到,比如查询系统的配置,可以通过查看系统变量来了解,当我们需要修改系统的一些配置的时候,也可以通过修改系统变量的值来进行。我们需要做一些批处理脚本的时候,可以使用自定义变量,来做到数据的复用。所以变量这块也挺重要,希望大家能够掌握。本文内容详解系统变量的使用详解自定义变量的使用变量分类系统变量自定义变量系统变量概念系统变量由系统定义的,不是用户定义的,属于mysql服务器层面的。系统变量分类全局变量会话变量使用步骤查看系统变量//1.查看系统所有变量 show[global|session]variables; //查看全局变量 showglobalvariables; //查看会话变量 showsessionvariables; showvariables; 复

  • Flutter DropdownButton简单使用及魔改源码

    我们一般在写业务的时候多会用到下拉菜单,前面讲过ExpansionPanel,ExpansionPanel大部分情况用来实现展开列表等稍微复杂的业务逻辑。而DropdownButton则是用来实现稍微简单一点的点击选择业务场景。简单上手按照惯例我们查看一下官方文档上的说明:Amaterialdesignbuttonforselectingfromalistofitems. 用于从item列表中进行选择的material按钮。说明的下方就是一大段的demo,我们先来看一下效果:没错,不要怀疑,One,Two,Free,Four,这就是官方demo上写的。代码如下:StringdropdownValue='One'; //... Widgetbuild(BuildContextcontext){ returnScaffold( body:Center( child:DropdownButton<String>( value:dropdownValue, onChanged:(StringnewValue){ setState((){ dropdownVa

  • 分分钟钟搞定Docker下面的redis sentinel集群

    版权声明:本文为博主原创文章,未经博主允许不得转载。https://blog.csdn.net/linzhiqiang0316/article/details/79176832今天给大家介绍一下如何通过Java来set和get值到RedisSentinel集群中。在开始之前我们首先要搭建一个RedisSentinel集群环境,搭建过程这边我就不多介绍了,不会的可以去看我《Docker下面安装redissentinel集群》这篇博客,里面已经介绍的很清楚了。redis集群环境:三个redis服务器,其中6379为master服务器,6380、6381是slave服务器。Java中我们可以采用ShardedJedis来操作redis集群,这边因为master中既可以存数据也可以取数据,而slave中只能进行读取操作,所以这边我在获取ShardedJedis的时候,会采用两个不同的方法来。一个是masterRedis方法,这个方法中只能用来写操作,一个slaveRedis方法,这个方法只能用来读取操作,下面我们看具体的代码实现。1.首先需要引入redis相关的依赖,如下所示:<depe

  • CentOS7上安装并配置Nginx、PHP、MySql

    一、Nginx 1、安装nginxyum install nginx复制2、启动nginxsystemctl start nginx复制除了systemctlstartnginx之外,常用的相关命令还有systemctlstopnginx、systemctlrestartnginx、systemctlstatusnginx3、测试nginx是否安装成功   浏览器输入ip地址或者域名(已经解析过的域名),如下图所示,则安装成功。4,配置Nginx支持PHP解析编辑/etc/nginx/nginx.conf,蓝色字体处为新加内容 server{        listen      80default_server;        listen      [::]:80default_server;        server_name _;        root        /usr/share/nginx/html;  indexindex.phpindex.htmlindex.htm;        #Loadconfigurationfilesforthedefaultse

  • [LeetCode] Construct Binary Tree from Inorder and Postorder Traversal

    链接:https://leetcode.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/description/ 难度:Medium 题目:106.ConstructBinaryTreefromInorderandPostorderTraversalGiveninorderandpostordertraversalofatree,constructthebinarytree.Note: Youmayassumethatduplicatesdonotexistinthetree.翻译:给定树的中序遍历和后序遍历,构造二叉树。注意:树中不存在重复项。思路:本题与105.ConstructBinaryTreefromPreorderandInorderTraversal类似。你要先知道中序遍历:左子树,根节点,右子树 后序遍历:左子树,右子树,根节点以如下这棵树为例:1 --------|------- 23 ----|--------|---- 4567复制前序遍历1245367 中序遍历425

  • 我一行代码都不写实现Toolbar!你却还在封装BaseActivity?

    作者:JessYan地址:http://www.jianshu.com/p/75a5c24174b2声明:本文是JessYan原创,已获其授权发布,未经原作者允许请勿转载前言距离上篇文章的发表时间已经过去两个多月了,这两个月时间里我没写文章但一直在更新着我的MVPArms框架,让他逐渐朝着可配置化集成框架发展就在前段时间我在鸿洋公众号上看到了一篇文章,大概是介绍怎么封装BaseActivity,让Activity通过几行代码就可以实现ToolBar刚好我的MVPArms框架也更新了一个功能:通过非继承ActivityFragment来实现以前需要封装进BaseActivityBaseFragment通过继承来实现的一些公共逻辑,以及监听整个App所有Activity以及Fragment的生命周期(包括三方库),并可向其生命周期内插入代码那我就来说说我怎么在不使用继承的情况下让Activty一行代码都不写就能实现Toolbar为什么我提倡少封装BaseActvity少用继承BaseActivity封装多了,除了不好管理外,还有最重要的一点就是,Java只能单继承,当如果你的Activit

  • 常用的5种数据可视化方法

    小编最近在研究后台的设计,涉及到数据统计分析模块的数据的呈现方面,搜集学习材料的时候发现这篇文章,推荐给有需求的童靴们共同学习。在文章中,原作者跟大家分享数据可视化常用的五种方式,希望能给大家带来思路的拓展。 概念借助于图形化的手段,清晰、快捷有效的传达与沟通信息。从用户的角度,数据可视化可以让用户快速抓住要点信息,让关键的数据点从人类的眼睛快速通往心灵深处。数据可视化一般会具备以下几个特点:准确性、创新性和简洁性。常用五种可视化方法下面从最常用和实用的维度总结了如下5种数据可视化方法,让我们来一一看一下:一、面积&尺寸可视化对同一类图形(例如柱状、圆环和蜘蛛图等)的长度、高度或面积加以区别,来清晰的表达不同指标对应的指标值之间的对比。这种方法会让浏览者对数据及其之间的对比一目了然。制作这类数据可视化图形时,要用数学公式计算,来表达准确的尺度和比例。Examples:a:天猫的店铺动态评分 天猫店铺动态评分模块右侧的条状图按精确的比例清晰的表达了不同评分用户的占比。从下图中我们第一眼就可以强烈的感知到5分动态评分的用户占绝对的比例。b:联邦预算图如下图,在美国联邦预算剖面图里,

  • 14种机器学习常见算法分类汇总!

    机器学习无疑是当前数据分析领域的一个热点内容。很多人在平时的工作中都或多或少会用到机器学习的算法。这里总结一下常见的机器学习算法,以供您在工作和学习中参考。机器学习的算法很多。很多时候困惑人们都是,很多算法是一类算法,而有些算法又是从其他算法中延伸出来的。这里,我们从两个方面来给大家介绍,第一个方面是学习的方式,第二个方面是算法的类似性。学习方式根据数据类型的不同,对一个问题的建模有不同的方式。在机器学习或者人工智能领域,人们首先会考虑算法的学习方式。在机器学习领域,有几种主要的学习方式。将算法按照学习方式分类是一个不错的想法,这样可以让人们在建模和算法选择的时候考虑能根据输入数据来选择最合适的算法来获得最好的结果。监督式学习:在监督式学习下,输入数据被称为“训练数据”,每组训练数据有一个明确的标识或结果,如对防垃圾邮件系统中“垃圾邮件”“非垃圾邮件”,对手写数字识别中的“1“,”2“,”3“,”4“等。在建立预测模型的时候,监督式学习建立一个学习过程,将预测结果与“训练数据”的实际结果进行比较,不断的调整预测模型,直到模型的预测结果达到一个预期的准确率。监督式学习的常见应用场景如分类

  • 高德地图api接口调用_高德地图步行导航怎么看方向

    大家好,又见面了,我是你们的朋友全栈君。高德地图API官网:高德开放平台|高德地图API。由于博主是基于前端Vue框架进行开发的,所以针对地图JavaScriptAPI结合Vue展开介绍。目录一、案例效果二、开发准备1.注册高德开放平台账号2.创建应用添加key值三、项目中使用地图组件1.npm获取高德地图API2.页面中使用地图API(案例)3.完整代码+详细注释四、在地图中添加覆盖物、图层、插件、事件等属性1.添加图层2.在地图中使用插件(地图控件)3.其他设置一、案例效果二、开发准备需要注意想要使用JSAPI必须注册账号并获取key值。1.注册高德开放平台账号正常输入个人信息注册即可。2.创建应用添加key值注册成功之后,进入控制台,然后点击创建新应用;填写名称应用名称和类型之后就可以看到已创建的应用了;接下来点击“添加”为应用添加key值;注意此处我们应选择Web端(JSAPI);点击提交后,key值获取成功。三、项目中使用地图组件1.npm获取高德地图API首先在Vue项目中通过命令npmi@amap/amap-jsapi-loader–save获取高德地图API;下载成功之

  • 【计算机网络】物理层

    物理层向数据链路层提供服务 物理连接的建立、维护和释放  

  • 上海闪酷成为京东商城第一批独立软件开发商(ISV)

      闪酷信息技术(上海)有限公司一直致力于为品牌企业提供电子商务软件及其服务,为其拓展电商渠道保驾护航。上海闪酷依据多年的行业经验和技术积累,与中国最大的B2C商城达成战略合作,为其2万多家品牌供应商提供软件服务,以便丰富京东开放平台应用市场,提升供应商软件使用体验,闪酷期望通过此平台,为中国各行业20000家品牌企业提供好用易用的电子商务软件系统及服务,闪酷将继续在电子商务行业软件深耕,以便提供更好的电子商务软件服务。          基于京东开放平台而开发的闪酷订单实时交易系统已经上线,一经推出即被市场认可,成为市场上的一枝独秀。    闪酷订单实时交易系统,实现了店铺的基本统计功能,以便运营人员实时了解店铺运营状况。    应用地址:http://fw.jd.com/ser/detail.action?serviceCode=FW_GOODS-4803    闪酷实时订单交易系统,实现了店铺的基本统计

  • Python合集之目录操作(三)

    1.判断目录是否存在 在Python中,有时需要判断给定的目录是否存在,这时可以使用os.path模块提供的exists()函数实现。 os.path.exists(path)复制 其中,path为要判断的目录,可以是绝对路径,也可以采用相对路径。如果给定的路径存在,则返回true,否则返回false。 importos print(os.path.exists('C:\\demo'))复制 注:os.path.exists()函数除了可以判断目录是否存在,还可以判断文件是否存在。 2.创建目录 在Python中,os模块提供了两个创建目录的函数,一个用于创建一级目录,另一个用于创建多级目录。 2.1创建一级目录 创建一级目录是指只能创建一级目录,在Python中,可以使用os模块提供的mkdir()函数实现。通过该函数只能创建指定路径中的最后一级目录,如果该目录的上一级不存在,则抛出FileNotFoundError异常。 os.mkdir(path,mode=0o777) 参数说明: path:用于指定要创建的目录,可以使用绝对路径,也可以使用相对路径。 mode:用于指

  • volatile

       volatile并不是用来解决多线程竞争问题的,而是用来修饰一些因为程序不可控因素导致变化的变量,比如访问底层硬件设备的变量,以提醒编译器不要对该变量的访问擅自进行优化。 intfun(int&a) { intb=a; intc=a; returna+b+c; } intmain() { inta=1; //.........做一些和a无关的事 returnfun(a); } 作者:KEmeng 链接:http://www.zhihu.com/question/31459750/answer/52061391 来源:知乎 著作权归作者所有,转载请联系作者获得授权。 复制    这个代码是很好优化的,因为编译器知道a的值是1,参考上下文,编译器又能知道b和c的值也是1,而且根本没有人用到了a,b,c三个变量,也没有任何人在修改a,b,c三个的值,所以编译器可能就直接把这个函数优化成: intmain(){return3;} 复制 了. 这么优化有什么问题吗?单线程没问题,但多线程就有问题了,如果是多线程,a的值虽然在当前上下文

  • ios 学习总结之动画

    CAlaye的动画  //创建CAlayer动画      CABasicAnimation *animation=[CABasicAnimation animationWithKeyPath:@"bounds.size"];     //设置初始大小 [animation setFromValue:[NSValuevalueWithCGSize:CGSizeMake(1.0,1.0)]];     //设置运行后的方法 [animation setToValue:[NSValue  valueWithCGSize:manImageView.bounds.size]];     //设置时常 [animation  setDuration:1.2];     //设子代理监听  &

  • 二分法 binary_search

    1constbinarySearch=(arr,key)=>{ 2letlow=0,high=arr.length-1; 3while(low<=high){ 4letmid=Math.floor((low+high)/2) 5letguess=arr[mid] 6if(guess===key){ 7returnmid 8} 9if(guess>key){ 10high=mid-1 11}else{ 12low=mid+1 13} 14} 15return-1 16}复制   以自己现在的努力程度,还没有资格和别人拼天赋

  • 构造函数的原型对象的prototype

    构造函数的缺点,相信大家应该都知道是:浪费内存。那么如何解决这个问题?这个就是今天要分享的构造函数的原型对象prototype。先来看看一个案例说明内存浪费的原因: functionPerson(name,age){ this.name=name; this.age=age; this.talk=function(){ console.info("会说话") } } vartom=newPerson('Tom',10); varmikky=newPerson('Mikky',12); console.info(tom); console.info(mikky)复制    以上代码打印结果中就是Person的构造函数中有两个talk方法,而且这两个talk方法还不相等,这样就导致没创建一个实例,便会有一个新的方法存在,以至于浪费空间。 所以,javascript规定,每个构造函数都有一个prototype属性,指向另一个对象,而这个对象的所有属性和方法,都会被构造函数所拥有。这样我就可以将一些不变的方法定义在protutype对象里,那么所有的实例对象都将可以调

  • jQ禁止右键点击、隐藏搜索文本框文字、在新窗口中打开链接、检测浏览器、预加载图片、页面样式切换、所有列等高、动态控制页面字体大小、获得鼠标指针的X值Y值、验证元素是否为空、替换元素、延迟加载、验证元素是否存在于Jquery集合中、使DIV可点击、克隆对象、使元素居中、计算元素个数、使用Google主机上的Jquery类库、禁用Jquery效果、解决Jquery类库与其他Javascript类库冲突

    1.禁止右键点击  代码如下: $(document).ready(function(){ $(document).bind("contextmenu",function(e){ returnfalse; }); });  2.隐藏搜索文本框文字  代码如下: $(document).ready(function(){ $("input.text1").val("Enteryoursearchtexthere"); textFill($('input.text1')); }); functiontextFill(input){//inputfocustextfunction varoriginalvalue=input.val(); input.focus(function(){ if($.trim(input.val())==originalvalue){input.val('');} }); input.blur(func

  • 实验吧 这个看起来有点简单!&amp;渗透测试工具sqlmap基础教程

    题目地址:http://ctf5.shiyanbar.com/8/index.php?id=1 下载sqlmap,拖到python安装文件夹下面,在桌面创建sqlmap的cmd快捷方式,都不赘述。 教程开始: 1.检测注入点是否可用 命令: 2.暴库:爆出该mysql里所有数据库的名称 命令: 结果:爆出有3个数据库 3.web当前使用的数据库 命令:sqlmap.py -u "http://ctf5.shiyanbar.com/8/index.php?id=1" --current-db  结果:得到当前使用的数据库是my_db 4.列出数据库中的表 命令:sqlmap.py -u "http://ctf5.shiyanbar.com/8/index.php?id=1" -Dmy_db--tables  结果:my_db中有两个表   5.列出表中字段 命令: 结果:thiskey表中只有一列,k0y 6.暴字段内容 命令: 结果:得到key  

相关推荐

推荐阅读