今天的题目加强了一些对于vector容器的理解,贪心算法的实现:,程序的整体思维。
思路:首先定义five,ten进行自加自减操作,然后直接对bill中的账单进行遍历,对元素做出判断,其元素只有5,10,20。写判断语句的时候要注意顺序,顺序变了也会错。代码如下:
class Solution {
public:
bool lemonadeChange(vector<int>& bills) {
vector<int> receipt;
int five=0;
int ten=0;
for(int nums:bills){
if(nums==5) five++;
if(nums==10){
if(five <= 0) return false;
ten++;
five--;
}
if(nums == 20){
if(ten > 0 && five > 0){
ten--;
five--;
}
else if(five >= 3){
five-=3;
}
else return false;
}
}
return true;
}
};
问题2:406. 根据身高重建队列 - 力扣(LeetCode)
思路:该题有两个维度,先根据身高对从高到低排序,然后再根据元素前个数确定位置。先插入身高高的,再插入低的便不会改变其个数。代码如下:
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>> que;
for (int i = 0; i < people.size(); i++) {
int position = people[i][1];
que.insert(que.begin() + position, people[i]);
}
return que;
}
};
问题3:452. 用最少数量的箭引爆气球 - 力扣(LeetCode)
思路:可以利用区间口的关系判断其是否相交,首先按照左区间进行排序,然后对其进行遍历并更新右区间。代码如下:
class Solution {
public:
static bool cmp(vector<int>& a,vector<int>& b){
return a[0]<b[0];
}
int findMinArrowShots(vector<vector<int>>& points) {
if(points.size()==0) return 0;
sort(points.begin(),points.end(),cmp);
int result=1;
for(int i=0;i<points.size()-1;i++){
if(points[i][1]<points[i+1][0]){
result++;
}
else{
points[i+1][1]=min(points[i+1][1],points[i][1]);
}
}
return result;
}
};