力扣(134.860.406.452)补9.26

力扣200题了,留个小小的纪念。

134.加油站

这题我用2层循环可以通过35/39个用例,但是卡在一个死变态的,数据贼多,超过时间限制了。

class Solution {

public:

    int canCompleteCircuit(vector& gas, vector& cost) {

        for(int i=0;i

            if(gas[i]>=cost[i]){

                int sum=gas[i]-cost[i];

                int j=0;

                for(j=(i+1)%gas.size();j!=i;j=(j+1)%gas.size()){

                    sum=sum+gas[j]-cost[j];

                    if(sum<0||(sum==0&&(j+1)%gas.size()!=i)) break;

                }

                if(j==i){

                    return i;

                }

            } 

        }

        return -1;

    }

};

不过我现在也发现了,贪心不是一个意义非常明确的算法,感觉就是没有一个固定的套路,更多的是数学上的思考吧。所以除了暴力我完全不会这题。题解也没看明白。。算了,我真的头疼了。。这题就当没做过有缘再见吧。做题别那么轴。

860.柠檬水找零

没想出来,这题一开始没想清楚怎么做,怎么也想不到贪心算法上,其实贪心,就是数学思维题,想通了就简单,想不通就一直卡着。其实就是记录自己手里的5元,10元,钞票的个数。

因为10元钞票只能用于顾客给20元的时候,所以优先找别人10元钞票,再找5元的,只要手里钞票不出现负数就可以了。

这个就是考思维的地方。

class Solution {

public:

    bool lemonadeChange(vector& bills) {

        vector a(2,0);

        if(bills[0]!=5){

            return false;

        }

        a[0]=1;

        for(int i=1;i

            if(bills[i]==5){

                a[0]++;

            }

            if(bills[i]==10){                

                a[1]++;

                a[0]--;

            }

            if(bills[i]==20){

                if(a[1]>=1) 

                {a[1]--;

                a[0]-=1;}

                else{

                    a[0]-=3;

                }

            }

            if(a[0]<0||a[1]<0)

            return false;

        }

        return true;

    }

};

406.根据身高重建队列

c++的东西早就忘了差不多了,要不是4月8号有个蓝桥杯,都没什么能督促我刷算法了。

begin:返回指向容器第一个元素的迭代器

end:返回指向容器最后一个元素下一个位置的迭代器

str1=str1(被插入字符串).insert(插入位置,str2(被插入字符串),n ,m)

在下标处插入东西,原来的东西整体后移。

ps:n,m分别是插入字符串要截取的(真正要插入的部分)即在str2.n位置数m个,不写这个的话就是将str2整个全部插入。

力扣(134.860.406.452)补9.26_第1张图片

这里自己模拟一遍会发现思路比较清晰了。先对数组进行排序在插入很重要。

class Solution {

public:

    vector> reconstructQueue(vector>& people) {

        sort(people.begin(),people.end(),[](const vector&u,const vector&v){

            return u[0]>v[0]||(u[0]==v[0]&&u[1]

        });

        vector> ans;

        for(int i=0;i

            if(people[i][1]

            ans.insert(ans.begin()+people[i][1],people[i]);

            else ans.push_back(people[i]);

        }

        return ans;

    }

};

452.用最少数量的箭引爆气球

这题的贪心我实在不明白,凭啥局部最优能得到整体最优,凭啥,凭啥。。。没有严格的数学证明,我实在不能接受啊啊啊啊啊啊啊。

 

 

 

 

 

 

你可能感兴趣的:(力扣,c++,算法,数据结构,贪心算法,leetcode)