算法通过村第十七关-贪心|白银笔记|贪心高频问题

文章目录

  • 前言
  • 区间问题
    • 判断区间是否重复
    • 合并区间
    • 插入区间
  • 字符串分割
  • 加油站问题
  • 总结


前言


提示:如果生活把你的门关上了,那你就再打开,这就是门,门就是这样的。 --佚名

贪婪的思想不一定要理解的很透彻,但是贪婪的问题我们要掌握的很好,这里我们就研究一些高频的考察题目。

区间问题

区间问题就是典型的面试中常见到的,这类面试题还是很受欢迎的,容易考察应聘者到底会不会写好代码。我们看看一些区间的例子🌰.两个区间的所有可能关系如下所示:

对于所有区间的问题,我们还是看看下面的图,一定要记住这些关系,很常见,也很容易出。

在这里插入图片描述

判断区间是否重复

参考地址连接:【leetcode】252 会议室(数组)_给定一个会议时间安排的数组-CSDN博客

在这里插入图片描述
看下图🥰:
在这里插入图片描述
因为一个人同一时刻只能参加一个会议,因此题目实质是判断是否存在重叠区间的。将区间按照会议开始时间进行排序,然后遍历一遍判断后面的会议开始的时候是否前面的会议还没有结束即可,也就是上面的图中所显示的,如果存在重叠直接返回false即可。

    /**
     * 会议室(数组)
     *
     * @param intervals
     * @return
     */
    public static boolean canAttendMeetings(int[][] intervals) {
        //将区间排序
        Arrays.sort(intervals, (v1, v2) -> v1[0] - v2[0]);

        // 遍历所有会议,是否出现重复 ( 技巧 从1 开始
        for (int i = 1; i < intervals.length; i++) {
            if (intervals[i][0] < intervals[i - 1][1]) {
                return false;
            }
        }
        return true;
    }

合并区间

参考题目参数:56. 合并区间 - 力扣(LeetCode)

在这里插入图片描述
在这里插入图片描述
看下图🥰:
在这里插入图片描述
和上一题一样,首先对区间按照起点端点进行升序排序,然后逐个判断当前区间是否与前一个区间重叠,如果不重叠的话直接加入结果集,反之重叠的话(当前区间与前一个区间进行合并)

 /**
     * 合并区间
     * @param intervals
     * @return
     */
    public static int[][] merge(int[][] intervals) {
        // 排序数组
        Arrays.sort(intervals,(v1,v2) ->v1[0] - v2[0]);
        // 创建新的区间
        int[][] merge = new int[intervals.length][2];
        int idx = -1;
        // 遍历数组
        for(int [] interval: intervals){
            // 如果数组是空的或者当前区间的起始位置 > 结果数组中最后区间的最大值
            // 不合并区间,直接加入区间
            if (idx == -1 && interval[0] > merge[idx][1]){
                merge[++idx] = interval;
            }else{
                // 反之说明重叠,则将当前区间合并至结果数组的最后区间
                merge[idx][1] = Math.max(merge[idx][1],interval[1]);
            }
        }
        return Arrays.copyOf(merge, idx + 1);
    }

插入区间

参考题目地址:57. 插入区间 - 力扣(LeetCode)

在这里插入图片描述
本题目也是上一个题目的扩展,这里区间已经按照起始结束升序排列了,我们可以直接遍历区间,寻找新区间的插入位置就可以了。

  1. 首先经新新区间左边且相离的区间加入结果集(遍历时,如果当前区间的结束位置,小于新区见的开始位置,说明当前区间在新区间的左边且相离)。
  2. 接着判断当前区间是否与新区间重叠,重叠的话就进行合并,知道遍历到当前区间在新区间的右边且相离,将最终合并后的新区间加入结果集;
  3. 最后将结果集右边且相离的区间加入结果集。
    /**
     * 插入区间
     * @param intervals
     * @param newInterval
     * @return
     */
    public static int[][] insert(int[][] intervals, int[] newInterval) {
        // 创建一个足够大的数组
        int[][] res = new int[intervals.length + 1][2];
        int idx = 0;
        // 左边的先进入(intervals[i][1] < newInterval[0]
        //(后面还用的到
        int i = 0;
        while(i < intervals.length && intervals[i][1] < newInterval[0] ){
            res[++idx] = intervals[i++];
        }
        // 合并新区间
        while(i < intervals.length && intervals[i][0] <= newInterval[1]){
            // 最左端
            newInterval[0] = Math.min(newInterval[0], intervals[i][0]);
            // 最右端
            newInterval[1] = Math.min(newInterval[1],intervals[i][0]);
            i++;
        }
        // 将合并的区间放入结果集
        res[idx++]= newInterval;
        // 放入右边的,直接放入结果集
        while(i < intervals.length){
            res[idx++]= intervals[i++];
        }

        return Arrays.copyOf(res,idx);
    }

字符串分割

参考题目地址:763. Partition Labels - 力扣(LeetCode)

在这里插入图片描述

在这里插入图片描述
这个问题,有点回溯。分割问题是回溯算法的典型应用,但是这个问题如果用回溯将很复杂。题目要求同一个字母最多出现在一个片段中,那么要如何进行分片才算合理呢?🤔

该遍历过程相当于找每个字母的边界,如果知道之前遍历过的所有字母的最远边界,说明这个边界就是分割点了,此时前面出现的所有字母,最远也就到这个边界,所以做如下操作:

  • 首先,统计每一个字符最后出现的位置
  • 然后从头遍历字符,并更新字符的最远出现的下标,如果找到字符最远出现的下标和当前下标相等,则找到分割点。

在这里插入图片描述

直接上代码:这个太神了

   /**
     * 划分字母区间
     *
     * @param S
     * @return
     */
    public static List<Integer> partitionLabels(String S) {
        List<Integer> res = new ArrayList<Integer>();
        int[] edge = new int[26];
        char[] chars = S.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            // 只保留最后一次的位置
            edge[chars[i] - 'a'] = i;
        }
        int idx = 0;
        int last = -1;
        for (int i = 0; i < chars.length; i++) {
            idx = Math.max(idx, edge[chars[i] - 'a']);
            if (i == idx) {
                // 这个非常巧妙
                res.add(i - last);
                last = i;
            }
        }
        return res;
    }

加油站问题

参考题目介绍:134. 加油站 - 力扣(LeetCode)

在这里插入图片描述
在这里插入图片描述

我们说做贪婪的题目,如果不管什么是贪婪,就直接做题。这里解释以下题目的含义:

实例给我们了两个数组,知识代表了当前站提供的油料,以及从前一个站过来需要消耗多少油料,因为是环,所以这里gas[0] = 1 和gas[0] = 3 就表示第一个站有1升汽油,从第一个站到第二个站需要消耗3升汽油.

当然最简单的方式是暴力从第一个试到最后一个。如图:

在这里插入图片描述
我们一直向后找,可以的话是一定有答案的。

但是,这个问题需要大量的重复计算,优化以下:

  1. 首先,如果总的油量大于(等于)总的消耗量,那么是可以跑完一圈的,具体就每段我们要考虑以下了。在具体一点是各个站的剩余油量rest[i]相加一点是大于等于零的。
  2. 每个加油站的剩余量rest[i]为gas[i] - cost[i].从i到0开始累加rest[i],和基座curSum,一旦curSum小于零,说明[0,i]区间都不能做起始位置,起始位置必须从i + 1开始重新算,只有这样才能保证我们有可能完成。
    在这里插入图片描述
    代码展示:
  public int canCompleteCircuit(int[] gas, int[] cost) {
        int start = 0;
        int totalSum = 0;
        int curSum = 0;
        for(int i = 0; i < gas.length; i++){
            curSum += gas[i] - cost[i];
            totalSum += gas[i] - cost[i];
            if(curSum < 0){
                // 更新起始位置
                start = i + 1;
                // 更新curSum
                curSum = 0;
            }
        }
        // 说明不能走一圈
        if(totalSum < 0){
            return -1;
        }
        return start;
    }

总结

提示:区间问题;字符串分割;加油站;贪婪算法;区间划分


如果有帮助到你,请给题解点个赞和收藏,让更多的人看到 ~ ("▔□▔)/

如有不理解的地方,欢迎你在评论区给我留言,我都会逐一回复 ~

也欢迎你 关注我 ,喜欢交朋友,喜欢一起探讨问题。
在这里插入图片描述

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

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

相关文章

优优嗨聚集团:绝味鸭脖市值上升,餐饮业迎来新变革

导语&#xff1a;绝味鸭脖作为中国餐饮行业的领军企业&#xff0c;其市值上升不仅体现了企业的市场价值&#xff0c;更对整个餐饮行业产生了深远的影响。本文将探讨绝味鸭脖市值上升对餐饮行业的影响&#xff0c;以及未来餐饮行业的发展趋势。 一、绝味鸭脖市值上升&#xff0c…

50元买来的iPhone手机刷机经验

前段时间&#xff0c;家里的iPad被家人误操作&#xff0c;导致iPad变成不可使用状态。自己折腾了半天&#xff0c;没有找到解决办法。没有办法&#xff0c;只好拿到手机维修店去修理,很快就修理好了.其实也很简单--就是对iPad进行了刷机操作。当然我也看到了刷机的方法。今天&a…

pytorch复现3_GoogLenet

背景&#xff1a; GoogLeNeta是2014年提出的一种全新的深度学习结构&#xff0c;在这之前的AlexNet、VGG等结构都是通过增大网络的深度(层数)来获得更好的训练效果&#xff0c;但层数的增加会带来很多负作用&#xff0c;比如overfit、梯度消失、梯度爆炸等。GoogLeNet通过引入i…

网络编程服务端与客户端存在的端口问题

服务端的窗口不能再次使用的原因如下&#xff1a; 服务器端的窗口不能再次使用的原因可能有以下几点&#xff1a; 1. 窗口已经关闭&#xff1a;如果服务器端的窗口已经被关闭&#xff0c;那么就无法再次使用。关闭窗口后&#xff0c;服务器会释放相关资源&#xff0c;包括与该…

【机器学习】项目数据处理部分

文章目录 前言项目理解数据探索特征工程总结 前言 本文参考《阿里云天池大赛赛题解析》&#xff0c;拿到一个项目或者赛题&#xff0c;使用机器学习来进行预测分类&#xff0c;需要以下七个步骤&#xff1a; 项目&#xff08;赛题&#xff09;理解数据探索特征工程模型训练模…

STM32单片机智能小车一PWM方式实现小车调速和转向

目录 1. 电机模块开发 2. 让小车动起来 3. 串口控制小车方向 4. 如何进行小车PWM调速 5. PWM方式实现小车转向 1. 电机模块开发 L9110s概述 接通VCC&#xff0c;GND 模块电源指示灯亮&#xff0c; 以下资料来源官方&#xff0c;具体根据实际调试 IA1输入高电平&#xff…

第三方支付预付卡业务详解

第三方支付预付卡业务详解 第三方支付预付卡业务是指由第三方支付公司提供的一种预先充值后消费的支付方式。用户可以在第三方支付平台上购买预付卡&#xff0c;然后在指定的商户或者服务提供商那里进行消费。 运作模式&#xff1a; 1. 用户在第三方支付平台购买预付卡&#xf…

Elasticsearch(一)---介绍

简介 Elasticsearch是一个基于Lucene的实际的分布式搜索和分析引擎。设计用于云计算中&#xff0c;能够达到近实时搜索&#xff0c;稳定&#xff0c;可靠&#xff0c;快速&#xff0c;安装使用方便。基于RESTful接口。 官网地址&#xff1a;Elasticsearch 平台 — 大规模查找…

Linux MeterSphere测试平台远程访问你不会?来试试这篇文章

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《粉丝福利》 《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网…

影响产品开发决策的认知偏见

认知偏见存在于每个人的内心&#xff0c;并在不断影响人们的工作和生活。认识并承认自己有偏见&#xff0c;并寻求相应的解决方案&#xff0c;可以帮助我们更好的做出产品决策、团队建设和架构设计。原文: The cognitive biases that influence product development decisions …

【c++|opencv】一、基础操作---2.图像信息获取

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 图像信息获取&#xff0c;roi 1. 图像信息获取 // 获取图像信息#include <iostream> #include <opencv2/opencv.hpp>using namespace cv; …

QT-- out of memory, returning null image

提示&#xff1a;本文为学习内容&#xff0c;若有错误&#xff0c;请及时联系作者&#xff0c;谦虚受教 文章目录 前言一、崩溃信息二、错误原因1.QImage2.QStandardItemModel 三、问题解决总结 前言 学如逆水行舟&#xff0c;不进则退。 一、崩溃信息 崩溃信息: QImage: out…

学习Linux/GNU/C++/C过程中遇到的问题

学习Linux/GNU/C/C过程中遇到的问题 1.源函数调用&#xff1a;2.linux静态库使用&#xff1a;3.vscode创建c程序调用onnxruntime:问题1&#xff1a;找不到头文件或者未定义函数问题2:error while loading shared libraries: libonnxruntime.so.1.16.1: cannot open shared obje…

linux的使用学习(1)

Linux 修改root密码 1.以 root 用户或具有 sudo 权限的登录到 Linux 系统。 2.打终端&#xff0c;并执行以下命令以更改 root 用户的密码&#xff1a; sudo passwd root 3.然后&#xff0c;系统会要求你输入新的 root 密码。请注意&#xff0c;在输入密码时&#xff0c;终端界…

[毕设记录]@学术技能积累:zotero、readpaper 引用功能使用

文章目录 zoteroreadpaper 开题要在word里插入文献引用&#xff0c;zotero和readpaper在浏览器和word都有插件&#xff0c;比较好用 zotero Zotero 是一个免费、开源的参考文献管理软件&#xff0c;可以帮助用户收集、整理和引用文献。它支持多种操作系统&#xff0c;包括 Wind…

算法通关村第十二关黄金挑战——最长公共前缀问题解析

大家好&#xff0c;我是怒码少年小码。 最长公共前缀 LeetCode 14&#xff1a;编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 “”。 示例&#xff1a; 输入&#xff1a;strs [“flower”,“flow”,“flight”]输出&#xff…

网际协议IP

网际协议IP 一、IP地址 1、分类的IP地址 IP地址::{<网络号>,<主机号>} 2、无分类编址CIDR IP地址::{<网络前缀>,<主机号>} &#xff08;1&#xff09;网络前缀 ​ 与分类IP最大的区别就是网络前缀的位数n是不固定的&#xff0c;可以是0~32位。 ​ …

Day 11 python学习笔记

模块 内置模块 random random&#xff1a;随机数模块 我们可以在解释器中看到其蕴含的方法 接下来我解释一些常用的方法&#xff1a; random.random( ) random.random( ) 返回0-1的随机数 [0,1) >>> random.random() 0.364183511476754 random.randint(n,m) r…

Team AI:简化繁琐日常任务,打造团队智能协作

在过去的几个月里&#xff0c;我的同事们&#xff08;Thoughtworker&#xff09;一直在构建 Team AI 项目&#xff0c;一个围绕于 AIGC 辅助开发团队的野心勃勃的计划。在内部&#xff0c;我们还有一个名为 Team AI Hackathon 的活动&#xff0c;基于一个内部的 Team AI 代码库…

CCS3列表和超链接样式

在默认状态下&#xff0c;超链接文本显示为蓝色、下画线效果&#xff0c;当鼠标指针移过超链接时显示为手形&#xff0c;访问过的超链接文本显示为紫色&#xff1b;而列表项目默认会缩进显示&#xff0c;并在左侧显示项目符号。在网页设计中&#xff0c;一般可以根据需要重新定…
最新文章