代码随想录算法训练营第三十五天|860.柠檬水找零、 406.根据身高重建队列、 452.用最少数量的箭引爆气球

860.柠檬水找零

  • 只需要记录5,10钞票的数量,
  • 分为三种情况分别处理即可
    • 客人给5块:直接收下5++;
    • 客人给10块:
      • 此时没五块钱,return false;
      • 有五块,5–,10++;
    • 客人给二十块,这时优先把十块钱花出去如果没有就给3张五块
class Solution {
 public:
  bool lemonadeChange(vector<int>& bills) {
    int five = 0, ten = 0;
    for (int bill : bills) {
      if (bill == 5) five++;
      if (bill == 10) {
        if (five <= 0) return false;
        ten++;
        five--;
      }
      if (bill == 20) {
        if (five > 0 && ten > 0) {
          ten--;
          five--;
        } else if (five >= 3) {
          five -= 3;
        } else {
          return false;
        }
      }
    }
    return true;
  }
};

406.根据身高重建队列

  • 和分发糖果有点像,需要过两边逻辑

  • 首先将队列按照身高进行排序,

  • 然后再按照第二位数字,前面比你高的人插入,这样保证了此时前面的人都比你高

class Solution {
 public:
  vector<vector<int>> reconstructQueue(vector<vector<int>> &people) {
    list<vector<int>> res;
    auto iter = res.begin();
    sort(people.begin(), people.end(),
         [](const vector<int> &p1, const vector<int> &p2) {
           return p1[0] > p2[0] || (p1[0] == p2[0] && p1[1] < p2[1]);
         });
    for (int i = 0; i < people.size(); ++i) {
      int position = people[i][1];
      iter = res.begin();
      while(position--){
        iter++;
      }
      res.insert(iter, people[i]);
    }
    vector<vector<int>> res2(res.begin(), res.end());
    return res2;
  }
};

452.用最少数量的箭引爆气球

  • 首先将所有范围按照最低点进行排序
  • 如果后一个范围的下限超过上一个的上限,则需要的箭加一
  • 如果没有超过,则更新上限,将目前的和前一个的上限进行比较,保留成更小的下限
class Solution {
 public:
  int findMinArrowShots(vector<vector<int>>& points) {
    if (points.size() == 0) return 0;
    int res = 1;
    sort(points.begin(), points.end(),
         [](const vector<int>& p1, const vector<int>& p2) {
           return p1[0] < p2[0];
         });
    for (int i = 1; i < points.size(); ++i) {
      if (points[i][0] > points[i-1][1])
        res++;
      else
        points[i][1] = min(points[i][1], points[i - 1][1]);
    }
    return res;
  }
};

day35结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值