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

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

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

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

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

cpp 复制代码
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变量用来作为循环终止判断。

cpp 复制代码
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++;
					}
				}
				else
					i++;
			}
			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;
	}
};
相关推荐
故事和你915 分钟前
洛谷-算法1-1-模拟与高精度4
开发语言·数据结构·c++·算法·蓝桥杯·动态规划
漫随流水12 分钟前
c++编程:数组元素去重,逆序输出
数据结构·c++·算法
Book思议-28 分钟前
【数据结构】哈夫曼树的原理、实现与考研真题解析
数据结构·算法·霍夫曼树·哈夫曼树
Dev7z33 分钟前
基于SVM与HOG算法的行人检测系统设计与实现
算法·机器学习·支持向量机·行人检测·hog算法
郝学胜-神的一滴37 分钟前
Pytorch张量拼接秘籍:cat与stack的深度解析与实战
人工智能·pytorch·python·深度学习·程序人生·算法·机器学习
Hello eveybody1 小时前
二叉树简述+考试要点(C++)
java·c++·算法
做cv的小昊1 小时前
【TJU】应用统计学——第四周作业(2.3 C-R不等式、2.4区间估计)
c语言·人工智能·算法·机器学习·数学建模·r语言·概率论
Liangwei Lin1 小时前
洛谷 P2895 [USACO08FEB] Meteor Shower S
数据结构·算法
计算机安禾1 小时前
【数据结构与算法】第26篇:静态查找(二):插值查找与斐波那契查找
c语言·开发语言·数据结构·学习·算法·重构·visual studio
小年糕是糕手1 小时前
【35天从0开始备战蓝桥杯 -- Day8】
数据结构·c++·算法·leetcode·蓝桥杯