力扣

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;
    }
};

思路:
通过暴力枚举每一位上的情况,均选取最大值输出即可。

posted on 2025-03-20 21:30  好好好好好好好好好  阅读(11)  评论(0)    收藏  举报