实验三--贪心算法的设计与分析

news2024/11/18 15:46:21

某不知名学校算法课第三次实验报告

题目来自力扣 这次实验是贪心算法

贪心的思维很跳跃,每道题也没有固定的模板的思考方向

跳跃游戏

题目描述:

给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个位置。

示例 1:

输入: [2,3,1,1,4]

输出: true

解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。

示例 2:

输入: [3,2,1,0,4]

输出: false

解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。

我们把数组中的每个元素看作是最大覆盖范围,当覆盖范围到达终点时,即满足题目条件

以样例1为例 初始指向2 覆盖范围为231,更新至3 覆盖范围3114 到达终点 符合题意

以样例2为例 初始指向3 覆盖范围3210 指向2 覆盖范围210 指向1 覆盖范围10 指向0 覆盖范围0

可以看到 我们没有办法覆盖到终点4 所以不符合题意

代码加注释如下:

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int cover = 0;
        for(int i = 0; i <= cover; i ++ )
        {
            //不断更新自己的覆盖范围
            cover = max(cover, nums[i] + i);
            //如果覆盖范围能到达终点
            if(cover >= nums.size() - 1) return true;
        }
        return false;
    }
};

很短,但是很需要思维,这就是贪心 也是传说中的局部最优解到全局最优解

分割平衡字符串

题目描述:

在一个「平衡字符串」中,'L' 和 'R' 字符的数量是相同的。

给出一个平衡字符串 s,请你将它分割成尽可能多的平衡字符串。

返回可以通过分割得到的平衡字符串的最大数量。

示例 1:

输入:s = "RLRRLLRLRL"

输出:4

解释:s 可以分割为 "RL", "RRLL", "RL", "RL", 每个子字符串中都包含相同数量的 'L' 和 'R'。

示例 2:

输入:s = "RLLLLRRRLR"

输出:3

解释:s 可以分割为 "RL", "LLLRRR", "LR", 每个子字符串中都包含相同数量的 'L' 和 'R'。

示例 3:

输入:s = "LLLLRRRR"

这道题可以暴力 数据不大 但是感觉这种查询匹配问题 用哈希表的方式解决是通常的选择

计数L 发现R计数相等时 就是一对平衡字串 思路很简单

代码如下:

class Solution {
public:
    int balancedStringSplit(string s) {
      int cnt = 0; //记录L R的数量关系
      int res = 0;
      for(char c : s) // 遍历
      {
        if( c == 'L' ) cnt ++ ;
        else cnt --;
        if( cnt == 0 ) res ++ ;
      }
      return res;
    }
};

用户分组

题目描述:

有 n 位用户参加活动,他们的 ID 从 0 到 n - 1,每位用户都 恰好 属于某一用户组。给你一个长度为 n 的数组 groupSizes,其中包含每位用户所处的用户组的大小,请你返回用户分组情况(存在的用户组以及每个组中用户的 ID)。

你可以任何顺序返回解决方案,ID 的顺序也不受限制。此外,题目给出的数据保证至少存在一种解决方案。

示例 1:

输入:groupSizes = [3,3,3,3,3,1,3]

输出:[[5],[0,1,2],[3,4,6]]

解释:

其他可能的解决方案有 [[2,1,6],[5],[0,4,3]] 和 [[5],[0,6,2],[4,3,1]]。

示例 2:

输入:groupSizes = [2,1,3,3,3,2]

输出:[[1],[0,5],[2,3,4]]

 提示:

groupSizes.length == n

1 <= n <= 500

1 <= groupSizes[i] <= n

从题目中,我们知道要填入的数据是0 ~n-1的连续整数,也正好对应了数组的下标

然后给的函数要返回双层vector,也就是说我们得要一个单层vector填入

跟上一题差不多,也是用一个类似哈希表的写法,进行查询和匹配的问题

代码+注释如下:

class Solution {
public:
    vector<vector<int>> groupThePeople(vector<int>& groupSizes) {
        vector<vector<int>> res; 
        //二维vector只能用一级vector去push——back
        unordered_map<int , vector<int>>M; //哈希表
        int cnt = 0; // 记录数组下标 正好是0~n-1号数字
        
        for(auto x : groupSizes) //强化for循环
        {
            M[x].push_back(cnt);
            //该组存满了
            if(M[x].size() >= x) 
            {
                //存入答案
                res.push_back(M[x]);
                //同时清空
                M[x].clear();
            }
            cnt ++;
        }
        
        return res;
    }
};

非递增顺序的最小子序列

题目描述:

给你一个数组 nums,请你从中抽取一个子序列,满足该子序列的元素之和 严格 大于未包含在该子序列中的各元素之和。

如果存在多个解决方案,只需返回 长度最小 的子序列。如果仍然有多个解决方案,则返回 元素之和最大 的子序列。

与子数组不同的地方在于,「数组的子序列」不强调元素在原数组中的连续性,也就是说,它可以通过从数组中分离一些(也可能不分离)元素得到。

注意,题目数据保证满足所有约束条件的解决方案是 唯一 的。同时,返回的答案应当按 非递增顺序 排列。

示例 1:

输入:nums = [4,3,10,9,8]

输出:[10,9]

解释:子序列 [10,9] 和 [10,8] 是最小的、满足元素之和大于其他各元素之和的子序列。但是 [10,9] 的元素之和最大。 

示例 2:

输入:nums = [4,4,7,6,7]

输出:[7,7,6]

解释:子序列 [7,7] 的和为 14 ,不严格大于剩下的其他元素之和(14 = 4 + 4 + 6)。因此,[7,6,7] 是满足题意的最小子序列。注意,元素按非递增顺序返回。

简单贪心题,我们先进行一遍排序,从最大的数字开始选,选到答案集合中的数的和大于剩下的数的和即可

代码+注释如下:

class Solution {
public:
    vector<int> minSubsequence(vector<int>& nums) {
        vector<int> res; // 存答案 返回值是vector
        sort(nums.begin(),nums.end()); // 排序
        int sum = 0, cur = 0, idx = nums.size() - 1;
        for(int i : nums) sum += i;
        while(cur <= sum) //答案序列和小于剩余序列和
        {
            sum -= nums[idx];
            cur += nums[idx];
            res.push_back(nums[idx--]); // 加入答案序列 顺便往前选择

        }
        return res;
    }
};

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

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

相关文章

PHP 电竞网站系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP 电竞网站系统是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 php电竞网站系统 代码 https://download.csdn.net/download/qq_41221322/88377255 论文 h…

基于linux的进程信号知识

1.前言 生活当中我们无时不刻都在接触外界给予我们各种各样的信号&#xff0c;比如穿越马路时看到红灯就得停下来&#xff0c;在比如听到手机铃声就得接电话&#xff0c;那么生活中如果很多重要的信号同时发生了&#xff0c;你会先做哪个事情&#xff1f;换句化说你会如何处理…

Failed to load the JNI shared library “D:\...\jvm.dll

1.解决办法&#xff1a; 64-bit Eclipse requires a 64-bit JVM, and 32-bit Eclipse requires 32-bit JVM--you can not mix-and-match between 32-bit and 64-bit. 2.问题&#xff1a; 下载了Eclipse4.16&#xff0c;openjdk8&#xff0c;双击安装Eclipse无法启动&#x…

侯捷 C++ STL标准库和泛型编程 —— 3 容器(序列式容器)

3 容器 3.1 容器结构分类 分类&#xff1a;序列式容器 Sequence Container&#xff0c;关联式容器 Associative Container 序列式容器&#xff1a;按照放入的次序进行排列 Array 数组&#xff0c;固定大小Vector 向量&#xff0c;会自动扩充大小Deque 双向队列&#xff0c;双…

每日一题 1333. 餐厅过滤器(中等)

感觉应该算是简单题 思路&#xff1a; 按照他提出的要求进行筛选即可学习了 sort 函数中几个参数的用法&#xff0c; keylambda c:(c[1], c[0]) 的形式可以令在排序中当c[1]相等时按照c[0]大小进行排序&#xff0c;reverseTrue 实现降序排列 class Solution:def filterResta…

基于微信小程序的美食推荐系统设计与实现(源码+lw+部署文档+讲解等)

前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb;…

element日历插件获取显示的第一天和最后一天

和重置日期内容显示 需求是要传入当前显示的第一天和最后一天来获取范围&#xff0c;再判断某个日期是否有内容标记 已知星期排版是固定的&#xff0c;第一天是星期天&#xff0c;最后一天是星期六。通过当月1号和最后一天再往前推算需要展示上个月几天&#xff0c;和下个月几…

Vue3 + TS 自动检测线上环境 —— 版本热更新提醒

&#x1f414; 前期回顾 编写 loading、加密解密 发布NPM依赖包&#xff0c;并实施落地使用_彩色之外的博客-CSDN博客 目录 &#x1f30d; 问题产生 &#x1f916; 性能效率 &#x1fa82; 新建 autoUpdate.ts &#x1f38b; 在App.vue使用 &#x1f30d; 问题产生 当用…

秋招搞个保底offer再说,我换赛道了。

作者&#xff1a;阿秀 InterviewGuide大厂面试真题网站&#xff1a;https://top.interviewguide.cn 这是阿秀的第「312」篇原创 小伙伴们大家好&#xff0c;我是阿秀。 转测开这个话题已经聊过很多次了&#xff0c;以前也分享过不少测开相关的面经&#xff1a; 后端太卷&#x…

Mac电脑视频处理工具 Topaz Video AI for mac

Topaz Video AI是一款强大而易用的视频处理软件&#xff0c;通过人工智能技术提供高质量的视频增强和编辑功能。它可以帮助用户改善视频的质量、修复缺陷、优化图像&#xff0c;并提供丰富的编辑选项&#xff0c;以满足个性化的视频处理需求。无论是专业摄影师、视频编辑人员&a…

vue+Vant,关闭Popup弹框,遮罩层并没有消失

遇到问题&#xff1a; 点击Popup弹框关闭按钮&#xff0c;弹框的遮罩不能正常关闭&#xff0c;如下图。经研究&#xff0c;排除了popup属性问题&#xff0c;最后只能删除代码排除法。 <!--弹框&#xff1a;选号--><van-popupv-model"showNumber"closeablero…

JS 内存泄漏与垃圾回收机制

一、什么是内存泄漏? 内存泄漏&#xff08;Memory Leak&#xff09;是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放&#xff0c;造成系统内存的浪费&#xff0c;导致程序运行速度减慢甚至系统崩溃等严重后果。通俗点就是指由于疏忽或者错误造成程序未能释放已…

指定名校牛导|肿瘤科医生赴哈佛大学麻省总医院访学进修

世界排名第一的哈佛大学&#xff0c;美国排名第一的研究型医院-麻省总医院&#xff0c;AIMBE fellow头衔的导师&#xff0c;这些条件均符合T医生要求的名校牛导标准。 T医生背景&#xff1a; 申请类型&#xff1a; 单位公派访问学者 工作背景&#xff1a; 三甲医院医生 教育…

在openwrt dnsmasq DHCP中为客户端分配不同的网关和DNS | 旁路由 禁止上网

环境&#xff1a;openwrt dnsmasq PS4/Switch 问题&#xff1a;为路由器下的设备分配不同的网关和DNS&#xff0c;禁止局域网设备上网 解决办法&#xff1a;修改dnsmasq配置文件 背景&#xff1a;Openwrt 的DHCP服务是使用dnsmasq实现的&#xff0c;他可以给内网的客户端设备…

如何减少爬虫产生的网络负载:爬取间隔和缓存控制策略

在进行Python爬虫开发时&#xff0c;我们需要注意控制爬取频率&#xff0c;以减少对目标网站的网络负载。本文将为您分享两种关键策略&#xff1a;爬取间隔和缓存控制。通过合理设置爬取间隔和使用缓存&#xff0c;您可以有效减少网络负载&#xff0c;同时保证数据的实时性和准…

Spring5应用之AOP动态代理开发

作者简介&#xff1a;☕️大家好&#xff0c;我是Aomsir&#xff0c;一个爱折腾的开发者&#xff01; 个人主页&#xff1a;Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏&#xff1a;Spring5应用专栏_Aomsir的博客-CSDN博客 文章目录 前言何为动态代理…

使用Packet Tracer了解网络模型及Lab3 - 2

显示TCP/IP协议套件的元素 这些额外的条目在 TCP/IP 套件中扮演着各种角色。如果列出了地址解析协议 &#xff08;ARP&#xff09;&#xff0c;它将搜索 MAC 地址。DNS 负责将名称&#xff08;例如 www.osi.local&#xff09;转换为 IP 地址。其他 TCP 事件负责连接、商定通信…

DETR纯代码分享(九)transformer.py

一、定义DETR Transformer用于DETR模型 """ DETR Transformer class.Copy-paste from torch.nn.Transformer with modifications:* positional encodings are passed in MHattention* extra LN at the end of encoder is removed* decoder returns a stack of …

趣解设计模式之《当代毕加索小王》

〇、小故事 小王最近对画油画非常的感兴趣&#xff0c;尤其是当他参观完毕加索画展之后&#xff0c;更觉得自己有画画天赋了&#xff0c;“这画我自己也能画啊&#xff01;这以后一幅画随随便便买它2、3个亿&#xff0c;这不发财了&#xff01;”于是&#xff0c;他就开始着手…

Java——》IO

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…