思路:
本题还是比较简单的,定义两个或者三个变量,用来分别统计收到5、10、20的数量。
从头遍历数组,若直接收到不是5元的,说明不可能找现,直接返回false。
若为5元,则++;
若为10元,判断当前是否有5元,若有,则可以
若为20的,则需要判断是否有10块的和5块的,若同时有,则可以、若没有十块的,但是有3张或以上的5块,则也可以,
若都不满足上面条件,则返回false;
class Solution {
public:
bool lemonadeChange(vector<int>& bills)
{
if (bills[0] > 5)return false;
//需要统计5元 10元数量
int fiveNumber = 0;
int tenNumber = 0;
int twentyNumber = 0;
for (int i = 0; i < bills.size(); i++)
{
if (bills[i] == 5)
fiveNumber++;
else if (bills[i] == 10 && fiveNumber > 0)
{
fiveNumber--;
tenNumber++;
}
else if (bills[i] == 20)
{
if (fiveNumber > 0 && tenNumber > 0)//若我同时有十块的和五块,那我肯定得优先使用十块的去找零
{
fiveNumber--;
tenNumber--;
}
else if (fiveNumber >= 3)
{
fiveNumber-=3;
}
else return false;
}
else return false;
}
return true;
}
};
说实话,这道题的思路,属实想不到,本题的思路建议看代码随想录。
class Solution {
public:
// 身高从大到小排(身高相同k小的站前面)
static bool cmp(const vector<int>& a, const vector<int>& b) {
if (a[0] == b[0]) return a[1] < b[1];
return a[0] > b[0];
}
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
sort (people.begin(), people.end(), cmp);
list<vector<int>> que; // list底层是链表实现,插入效率比vector高的多
for (int i = 0; i < people.size(); i++) {
int position = people[i][1]; // 插入到下标为position的位置
std::list<vector<int>>::iterator it = que.begin();
while (position--) { // 寻找在插入位置
it++;
}
que.insert(it, people[i]);
}
return vector<vector<int>>(que.begin(), que.end());
}
};
452. 用最少数量的箭引爆气球 - 力扣(LeetCode)
本题的思路,考虑到重叠区间,先按照每个区间的左区间进行排序,然后从第一个区间开始来求交集,如果第二个鱼第一个有交集,说明我们能够一剑刺穿,这里如何判断是否有交集,那就是你的左区间在我的右区间之内或相等。但是后面要更新此时的右区间值,是取最小值。这一步很关键。
class Solution {
public:
static bool cmp(const vector<int>& v1, const vector<int>& v2)
{
if (v1[0] == v2[0])return v1[1] > v2[1];
return v1[0] < v2[0];
}
int findMinArrowShots(vector<vector<int>>& points)
{
if (points.size() == 1)return 1;
sort(points.begin(), points.end(), cmp);//将其进行一个排序
int ArrowNum = 1;
int x= points[0][1];
for (int i = 1; i < points.size(); i++)
{
if (points[i][0] <= x)
{
x = min(x, points[i][1]);//很关键这一步
continue;
}
else {
ArrowNum++;
x = points[i][1];
}
}
return ArrowNum;
}
};