0
点赞
收藏
分享

微信扫一扫

设计模式之基于接口而非实现的设计原则

zhyuzh3d 04-01 22:31 阅读 1

一遍过,就是有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;
        
    }
};
举报

相关推荐

0 条评论