本题要求是否能给顾客正确找零,由于收的钱金额只有5、10、20三种,因此在遇到5元时直接收入,遇到10元需要找零5元,遇到20元优先找零10+5,如果,没有10元则找零5+5+5,每次找零后看5、10两种金额是否为负来判断能否正确找零。
具体代码如下:
class Solution {
public:
bool lemonadeChange(vector<int>& bills) {
vector<int>money(3,0);
for(int i=0;i<bills.size();i++)
{
if(bills[i]==5)
{
money[0]++;
}
else if(bills[i]==10)
{
money[1]++;
money[0]--;
}
else if(bills[i]==20)
{
if(money[1]>0)
{
money[1]--;
money[0]--;
}
else
{
money[0]-=3;
}
money[2]++;
}
for(int i=0;i<money.size();i++)
{
if(money[i]<0)
{
return false;
}
}
}
return true;
}
};
本题要求根据身高要求重建队列,由于有两方面需要考虑,因此首先将元素按身高进行排列,然后将排列在前比自己高的人数作为插入的序号向前插入,最后得到的队列即为正确的身高队列。
具体代码如下:
class Solution {
public:
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);
vector<vector<int>>queue;
for(int i=0;i<people.size();i++)
{
int position=people[i][1];
queue.insert(queue.begin()+position,people[i]);
}
return queue;
}
};
本题要求解扎爆气球所需的最少箭数,也就是求有多少气球的区间是重叠在一起的。首先将给定的数组按照气球的左边界进行排序,如果下一个气球的左边界大于上一个气球的右边界则表明这两个气球没有重叠部分,所射箭数要加1,反之,需要判断该气球的下一个气球是否也与上面的气球重叠,这里要对右边界进行变换,取这两个气球右边界的最小值,如果重叠,则不用再将箭数加1。
具体代码如下:
class Solution {
public:
static bool cmp(const vector<int>&a,const vector<int>&b)
{
return a[0]<b[0];
}
int findMinArrowShots(vector<vector<int>>& points) {
if(points.size()==0)
{
return 0;
}
int result=1;
sort(points.begin(),points.end(),cmp);
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;
}
};
本文解析了LeetCode中的三个问题:第860题找零算法、第406题队列重构(按身高排序)和第452题最少箭数求解(气球重叠)。介绍了如何利用编程技巧解决这些与数据结构和排序相关的问题。
89

被折叠的 条评论
为什么被折叠?



