455.分发饼干
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。
对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是满足尽可能多的孩子,并输出这个最大数值。
示例 1:
输入: g = [1,2,3], s = [1,1]
输出: 1
解释:
你有三个孩子和两块小饼干,3 个孩子的胃口值分别是:1,2,3。
虽然你有两块小饼干,由于他们的尺寸都是 1,你只能让胃口值是 1 的孩子满足。
所以你应该输出 1。
示例 2:
输入: g = [1,2], s = [1,2,3]
输出: 2
解释:
你有两个孩子和三块小饼干,2 个孩子的胃口值分别是 1,2。
你拥有的饼干数量和尺寸都足以让所有孩子满足。
所以你应该输出 2。
点击查看代码
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
sort(g.begin(),g.end());
sort(s.begin(),s.end());
int m=g.size(),n=s.size();
int count=0;
for(int i=0,j=0;i<m&&j<n;i++,j++)
{
while(j<n&&g[i]>s[j]) j++;
if(j<n) count++;
}
return count;
}
};
思路:
假设在对前 i−1 个孩子分配饼干之后,可以满足第 i 个孩子的胃口的最小的饼干是第 j 块饼干,即 sj是剩下的饼干中满足 gi≤sj的最小值,最优解是将第 j 块饼干分配给第 i 个孩子。如果不这样分配,考虑如下两种情形:如果 i<m 且 gi+1≤sj也成立,则如果将第 j 块饼干分配给第 i+1 个孩子,且还有剩余的饼干,则可以将第 j+1 块饼干分配给第 i 个孩子,分配的结果不会让更多的孩子被满足;
如果 j<n,则如果将第 j+1 块饼干分配给第 i 个孩子,当 gi+1≤sj时,可以将第 j 块饼干分配给第 i+1 个孩子,分配的结果不会让更多的孩子被满足;当 gi+1>sj 时,第 j 块饼干无法分配给任何孩子,因此剩下的可用的饼干少了一块,因此分配的结果不会让更多的孩子被满足,甚至可能因为少了一块可用的饼干而导致更少的孩子被满足。
基于上述分析,可以使用贪心的方法尽可能满足最多数量的孩子。
首先对数组 g 和 s 排序,然后从小到大遍历 g 中的每个元素,对于每个元素找到能满足该元素的 s 中的最小的元素。具体而言,令 i 是 g 的下标,j 是 s 的下标,初始时 i 和 j 都为 0,进行如下操作。
对于每个元素 g[i],找到未被使用的最小的 j 使得 g[i]≤s[j],则 s[j] 可以满足 g[i]。由于 g 和 s 已经排好序,因此整个过程只需要对数组 g 和 s 各遍历一次。当两个数组之一遍历结束时,说明所有的孩子都被分配到了饼干,或者所有的饼干都已经被分配或被尝试分配(可能有些饼干无法分配给任何孩子),此时被分配到饼干的孩子数量即为可以满足的最多数量。
605.种花问题
假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。
给你一个整数数组 flowerbed 表示花坛,由若干 0 和 1 组成,其中 0 表示没种植花,1 表示种植了花。另有一个数 n ,能否在不打破种植规则的情况下种入 n 朵花?能则返回 true ,不能则返回 false 。
示例 1:
输入:flowerbed = [1,0,0,0,1], n = 1
输出:true
示例 2:
输入:flowerbed = [1,0,0,0,1], n = 2
输出:false
点击查看代码
class Solution {
public:
bool canPlaceFlowers(vector<int>& flowerbed, int n) {
int m=flowerbed.size()-1;
for(int i=0;i<=m;i++)
{
if(flowerbed[i]==0&&(i==0||flowerbed[i-1]==0)&&(i==m||flowerbed[i+1]==0))
{ n--;
flowerbed[i]=1;}
}
if(n<=0) return true;
return false;
}
};
思路:
判断当前位置能否种花,三种可能,一是左边界时右边为没种花,二是左右都没种花且不是边界,三是右边界时左边没种花,如果满足则n--,最后n如果小于等于零则返回true,否则返回false;
1217.玩筹码
有 n 个筹码。第 i 个筹码的位置是 position[i] 。
我们需要把所有筹码移到同一个位置。在一步中,我们可以将第 i 个筹码的位置从 position[i] 改变为:
position[i] + 2 或 position[i] - 2 ,此时 cost = 0
position[i] + 1 或 position[i] - 1 ,此时 cost = 1
返回将所有筹码移动到同一位置上所需要的 最小代价 。
示例 1:
输入:position = [1,2,3]
输出:1
解释:第一步:将位置3的筹码移动到位置1,成本为0。
第二步:将位置2的筹码移动到位置1,成本= 1。
总成本是1。
示例 2:
输入:position = [2,2,2,3,3]
输出:2
解释:我们可以把位置3的两个筹码移到位置2。每一步的成本为1。总成本= 2。
示例 3:
输入:position = [1,1000000000]
输出:1
点击查看代码
class Solution {
public:
int minCostToMoveChips(vector<int>& position) {
int a=0,b=0;
for(int data:position)
{
if(data%2==1) a++;
else b++;
}
return min(a,b);
}
};
思路:
偶数和偶数可以无成本跃迁,奇数同理,所以比的是偶数和奇数的数量大小,返回数量小的一方即可。
1763.替换隐藏数字得到的最晚时间
给你一个字符串 time ,格式为 hh:mm(小时:分钟),其中某几位数字被隐藏(用 ? 表示)。
有效的时间为 00:00 到 23:59 之间的所有时间,包括 00:00 和 23:59 。
替换 time 中隐藏的数字,返回你可以得到的最晚有效时间。
示例 1:
输入:time = "2?:?0"
输出:"23:50"
解释:以数字 '2' 开头的最晚一小时是 23 ,以 '0' 结尾的最晚一分钟是 50 。
示例 2:
输入:time = "0?:3?"
输出:"09:39"
示例 3:
输入:time = "1?:22"
输出:"19:22"
点击查看代码
class Solution {
public:
string maximumTime(string time) {
if(time[0]=='?') {
if(time[1]=='0'||time[1]=='1'||time[1]=='2'||time[1]=='3'||time[1]=='?') time[0]='2';
else time[0]='1';
}
if(time[1]=='?'){
if(time[0]=='0'||time[0]=='1') time[1]='9';
else time[1]='3';
}
if(time[3]=='?')time[3]='5';
if(time[4]=='?')time[4]='9';
return time;
}
};
思路:
通过暴力枚举每一位上的情况,均选取最大值输出即可。