一遍过,就是有10的时候尽量把10用掉,20是用不掉的,如果发现不够找回了,就return
false。
class Solution {
public:bool lemonadeChange(vector<int>& bills) {unordered_map<int,int> mp;for(int i=0;i<bills.size();i++){if(bills[i]==5){mp[5]++;}else if(bills[i]==10){mp[10]++;if(mp[5]){mp[5]--;}else return false;}else{mp[20]++;if(mp[10]){mp[10]--;if(mp[5]){mp[5]--;}else return false;}else{if(mp[5]>=3) mp[5]-=3;else return false;}}}return true;}
};
处理一边完,再处理另外一边。
使用vector是非常费时的,C++中vector(可以理解是一个动态数组,底层是普通数组实现的)如果插入元素大于预先普通数组大小,vector底部会有一个扩容的操作,即申请两倍于原先普通数组的大小,然后把数据拷贝到另一个更大的数组上。
list底层是链表实现,插入效率比vector高的多
看了题解。按照身高h来排序呢,身高一定是从大到小排(身高相同的话则k小的站前面),让高个子在前面。
cmp需要加static,表示类的函数。
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);list<vector<int>> q;for(int i=0;i<people.size();i++){int pos=people[i][1];list<vector<int>> ::iterator it=q.begin();while(pos--){it++;}q.insert(it,people[i]);}return vector<vector<int>>(q.begin(),q.end());}
};
c++的static使用:全局变量不但在本文件中可以被访问,在其他文件中同样可以访问。写代码时很容易在不同文件定义相同名字的全局变量,这就会引发冲突。
而静态全局变量只能在声明它的整个文件可见,限制了该变量的访问范围。
同样的,静态全局函数,在全局函数前加上static,表示只能在声明文件中被访问。
本来想着按气球终止位置排序后,每个右边界射箭,把左边界在这个右边界的气球都射掉。
不知道怎么遍历符合条件的气球,射掉后怎么删掉气球。【未】
如果把气球排序之后,从前到后遍历气球,被射过的气球仅仅跳过就行了,没有必要让气球数组remove气球,只要记录一下箭的数量就可以了。
为了让气球尽可能的重叠,需要对数组进行排序。
那么按照气球起始位置排序,还是按照气球终止位置排序呢?
其实都可以!只不过对应的遍历顺序不同,我就按照气球的起始位置排序了。
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;sort(points.begin(),points.end(),cmp);int res=1;for(int i=1;i<points.size();i++){if(points[i][0]>points[i-1][1]){ //为什么这里不判断后面的左边界是否小于此时的右边界呢,原因是如果i左边界大于,那么由于左边界升序排序,那么后面左边界只会更大。res++;}else{points[i][1]=min(points[i-1][1],points[i][1]);}}return res;}
};