【贪心算法初级训练】在花坛上是否能种下n朵花、碰撞后剩余的行星

本文主要是介绍【贪心算法初级训练】在花坛上是否能种下n朵花、碰撞后剩余的行星,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、在花坛上是否能种下n多花

一个很长的花坛,一部分地已经种植了花,另一部分却没有,花不能种植在相邻的地块上否则它们会争夺水源,两者都会死去。给你一个整数数组表示花坛,由若干个0和1组成,0表示没种植花;1表示种植了花。

给定一个数n,请设计一个算法验证在该花坛上能不能种下n朵花?

仅需判断要种花的位置, 和它的左位置,右位置已经有花的情况,再下来就是要注意访问数组时索引的范围要在数组范围内。

class Solution
{
public:bool canPlantFlower(int* a, int size, int n){int i = 0;int count = 0;while(i < size){if (i - 1 > 0 && 1 == a[i - 1])//先判断要种花位置的左边有花的情况i += 1;else if (1 == a[i])//判断要种花的位置有花的情况i += 2;else if (i + 1 < size && 1 == a[i + 1])//判断要种花的位置右边有花的情况i += 3;else{a[i++] = 1;count++;if (n == count)return true;}}return false;}
};

2、碰撞后剩余的行星

给定一个整数数组,表示在同一行的行星。每一个元素的绝对值表示行星的大小,正负号表示行星的移动方向,正表示向右移动;负表示向左移动,每一颗行星以相同的速度移动。

行星碰撞规则:

1.两行星碰撞,较小的行星会爆炸。

2.如果大小相同,则两行星都爆炸。

3.两颗移动方向相同的行星,永远不会发生碰撞。

请设计一个算法,表示出最后剩余的行星。

 对于这道题我的思路是:

1.首先我们先从数组的0位置开始对数组元素进行两两判断,只判断行星爆炸的情况,将爆炸的行星值改为0,第一遍将数组遍历完后,此时还没有结束!数组还剩下没有发生爆炸的行星。

2.遍历数组将没有发生爆炸的行星(即值!=0的行星)的值从头覆盖原数组的值(这里并没有创建新数组,只是对旧数组进行覆盖),覆盖后的数组里的值就是没有发生爆炸的行星,然后重复该过程,创建一个count变量用来作为循环终止判断。

class Solution
{
public:vector<int> existPlanet(int* array, int n){int newn = n;//newn没有爆炸行星的个数int ni = 0;int count = 1;while (count > 0){count = 0;ni = 0;int i = 0;while (i + 1 < newn){if (array[i] > 0 && array[i + 1] < 0)//接下来只需要考虑两颗行星碰撞的情况{if ( array[i] + array[i + 1] < 0)//左行星爆炸{array[i++] = 0;count++;}else if (array[i] + array[i + 1] > 0)//右行星爆炸{array[i + 1] = 0;i++;count++;}else if (0 == array[i] + array[i + 1])//两颗行星都爆炸{array[i] = array[i + 1] = 0;i++;count++;}}elsei++;}for (int j = 0;j < newn;j++){if (array[j])array[ni++] = array[j];}newn = ni;}vector<int> v;for (int j = 0;j < newn;j++){if (array[j])v.push_back(array[j]);}return v;}
};

这篇关于【贪心算法初级训练】在花坛上是否能种下n朵花、碰撞后剩余的行星的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ

Python如何精准判断某个进程是否在运行

《Python如何精准判断某个进程是否在运行》这篇文章主要为大家详细介绍了Python如何精准判断某个进程是否在运行,本文为大家整理了3种方法并进行了对比,有需要的小伙伴可以跟随小编一起学习一下... 目录一、为什么需要判断进程是否存在二、方法1:用psutil库(推荐)三、方法2:用os.system调用

Python中判断对象是否为空的方法

《Python中判断对象是否为空的方法》在Python开发中,判断对象是否为“空”是高频操作,但看似简单的需求却暗藏玄机,从None到空容器,从零值到自定义对象的“假值”状态,不同场景下的“空”需要精... 目录一、python中的“空”值体系二、精准判定方法对比三、常见误区解析四、进阶处理技巧五、性能优化

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为