605. 种花问题
假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。
可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。 给你一个整数数组 flowerbed 表示花坛,由若干 0 和 1 组成,其中 0 表示没种植花,1 表示种植了花。
另有一个数 n ,能否在不打破种植规则的情况下种入 n 朵花?能则返回 true ,不能则返回 false。 这个题目,3个元素为一组判断,左 当前 右,其实保证左右都是0 示例 1:
输入:flowerbed = [1,0,0,0,1], n = 1
输出:true
示例 2:
输入:flowerbed = [1,0,0,0,1], n = 2
输出:false
自己写的思路差不多,但是看到一个不错的答案:
bool canPlaceFlowers(std::vector<int>& flowerbed, int n) {
int size = flowerbed.size();
for (int i = 0; i < size; i++) {
// 比如只有一个[0],i == 0 和 i == size-1就是做这类判断
if (flowerbed[i] == 0 && (i == 0 || flowerbed[i - 1] == 0) && (i == size - 1 || flowerbed[i + 1] == 0)) {
n--;
flowerbed[i] = 1;
}
}
return n <= 0;
}
作者:
Bowen
bowen_sky
LeetCode See https://leetcode-cn.com/problems/can-place-flowers/
452. 用最少数量的箭引爆气球
有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中points[i] = [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。
你不知道气球的确切 y 坐标, 一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足 xstart ≤ x ≤ xend,则该气球会被 引爆 。
可以射出的弓箭的数量 没有限制 , 弓箭一旦被射出之后,可以无限地前进。 给你一个数组 points ,返回引爆所有气球所必须射出的 最小 弓箭数 。
输入:points = [[1,2],[2,3],[3,4],[4,5]]
输出:2
解释:气球可以用2支箭来爆破:
- 在x = 2处发射箭,击破气球[1,2]和[2,3]。
- 在x = 4处射出箭,击破气球[3,4]和[4,5]。
输入:points = [[1,2],[3,4],[5,6],[7,8]]
输出:4
解释:每个气球需要射出一支箭,总共需要4支箭。
输入:points = [[10,16],[2,8],[1,6],[7,12]]
输出:2
解释:气球可以用2支箭来爆破:
-在x = 6处射出箭,击破气球[2,8]和[1,6]。
-在x = 11处发射箭,击破气球[10,16]和[7,12]。
自己觉着这道题目,求交集(不算边界包含),比如{1,2}∩{2,3}为真 output++;
思路1:有序循环比较是否产生包含元素,有过有交集元素就共用一只箭。
思路2:乱序循环,如果可以用同一只箭队列中删除,剩下的元素在一起遍历,直至最后一个。
思路一:
int findMinArrowShots(std::vector<std::vector<int>>& intervals) {
if (intervals.empty()) {
return 0;
}
int n = intervals.size();
std::sort(intervals.begin(), intervals.end(), [](std::vector<int>& a, std::vector<int>& b)
{
return a[1] < b[1];
});
int archery = 0, idx = 0, current_ptr = 0;
while (current_ptr <= n - 1) {
// star最小,end是否包含
if (current_ptr < (n - 1) && intervals[idx][1] - intervals[current_ptr + 1][0] >= 0)
current_ptr++;
else
{
idx = current_ptr = (current_ptr + 1);
archery++; // 进入else,则代表已经浪费一直箭.
}
}
return archery;
}
好家伙提交时候遇到错误,可以将减法替换成两个int大小相比,把减法改成了>=,至此完成测试用49道验证.:
[[-2147483646,-2147483645],[2147483646,2147483647]]
int findMinArrowShots(std::vector<std::vector<int>>& intervals) {
if (intervals.empty()) {
return 0;
}
int n = intervals.size();
std::sort(intervals.begin(), intervals.end(), [](std::vector<int>& a, std::vector<int>& b)
{
return a[1] < b[1];
});
unsigned int archery = 0, idx = 0, current_ptr = 0;
while (current_ptr <= n - 1) {
// star最小,end是否包含
if (current_ptr < (n - 1) && intervals[idx][1] >= intervals[current_ptr + 1][0])
current_ptr++;
else
{
idx = current_ptr = (current_ptr + 1);
archery++; // 进入else,则代表已经浪费一直箭.
}
}
return archery;
}
LeetCode See https://leetcode.com/problems/minimum-number-of-arrows-to-burst-balloons/