贪心
一、柠檬水找零
1.钞票只有三种,5,10,20,收到5的时候++,收到10的时候5–,10++,收到20的时候10–,5–或者5-3
2.只用考虑这三种情况,列举即可
class Solution {
public:
bool lemonadeChange(vector<int>& bills) {
//如果是5直接收,如果是10判断是否有一个五块,如果是20判断是否有一个10,5或者3个5
int money[21] = {0};
for (int i = 0; i < bills.size(); i++) {
//5
if (bills[i] == 5) money[5]++;
//10
if (bills[i] == 10) {
if (money[5] > 0) {
money[5]--;
money[10]++;
}
else return false;
}
//20
if (bills[i] == 20) {
if (money[10] > 0 && money[5] > 0) {
money[10]--;
money[5]--;
money[20]++;
}
else if (money[5] >= 3) {
money[5] -= 3;
money[20]++;
}
else return false;
}
}
return true;
}
};
二、根据身高重建队列
1.数组有两个维度,h和k,不能两头兼顾,先对身高排序,因为k也是按照来计算的
2.身高排序完成后,对k进行插入,因为k代表的是前面对它高或等于的,所以k可以作为下标进行插入
class Solution {
public:
static bool cmp (vector<int>& a, vector<int>& b) {
if (a[0] == b[0]) return a[1] < b[1];
else return a[0] > b[0];
}
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
//people数组有两个维度,一个h,一个k
//两头兼顾不可能,只能先对其中一个排序,身高,因为k的顺序也是按照身高来的
sort(people.begin(), people.end(), cmp);
vector<vector<int>>queue;
//二次对k的排序主要利用的是k的数值,前面对它高或等于的数量等于k的数值
//又因为身高是从高到低排序的,所以插入时k可以作为下标
for (int i = 0; i < people.size(); i++) {
int index = people[i][1];
queue.insert(queue.begin() + index, people[i]);
}
return queue;
}
};
三、用最少数量的箭引爆气球
1.排序,找出重叠点
2.判断这一组的左边界是否小于上一组的右边界,如果不重叠则需要一只箭
3.重叠的话,考虑是否与下一组重叠,同样需要判断左右边界,所以需要更新右边界,取最小值
class Solution {
public:
static bool cmp (vector<int>& a, vector<int>& b) {
return a[0] < b[0];
}
int findMinArrowShots(vector<vector<int>>& points) {
//先排序
sort(points.begin(), points.end(), cmp);
//判断这一组的右边界是否小于等于上一组的左边界,如果是则说明重叠,否则不重叠需要一只箭引爆上一组
if (points.size() == 0) return 0;
int result = 1;
for (int i = 1; i < points.size(); i++) {
//右边界大于左边界,需要一只箭
if (points[i][0] > points[i-1][1]) result++;
//否则代表重叠,但应考虑是否与下一组气球重叠,同样需要计算左边界和右边界,所以需要更新右边界
else {
points[i][1] = min(points[i][1], points[i-1][1]);
}
}
return result;
}
};
总结
身高重建队列有点不太好理解,气球有思路,但代码编写有些问题
学习时间90min。
学习资料:《代码随想录》。