加油站

抽象,想到了一些,但是思路并没有缕清楚。
class Solution {
public:
int canCompleteCircuit(vector& gas, vector& cost) {
int rest;
for (int i = 0; i < cost.size(); i++) {
rest = gas[i] - cost[i];
int index = (i + 1) % cost.size();
while (index != i && rest > 0) {
rest += gas[index] - cost[index];
index = (index + 1) % cost.size();
}
if (index == i && rest >= 0) {
return i;
}
}
return -1;
}
};

分发糖果

题目描述

给一队小朋友发糖,相邻小朋友友分高的必须糖多。
基底:每个都有一颗糖。

class Solution {
public:
    int candy(vector<int>& ratings) {
        //int count=0;
        vector<int> CandyVect(ratings.size(),1);
     for(int i=1;i<ratings.size();i++)  {
        if(ratings[i]>ratings[i-1])
        CandyVect[i]=CandyVect[i-1]+1;
     }
       for(int i=ratings.size()-2;i>=0;i--)  {
        if(ratings[i]>ratings[i+1])
        CandyVect[i]=max(CandyVect[i],CandyVect[i+1]+1);//
     }
     int sum=0;
     for(int i=0;i<CandyVect.size();i++) {sum+=CandyVect[i];}
      return sum;  
    }
};

问题

为什么要从两边看呢?
如果ratings{1,2,3,3,?} 那么candy必须是{1,2,3,?}
如果ratings{1,2,3,2,1} 那么candy必须是{1,2,3,2,1}
在基底之上,不能通过判断i和i+1确定i+1的candy数,需要考虑i+1 后面的ratings值。

卖lemon water

问题理解

一开始试图找路径,看题解发现竟然可以就用当下情况分类,并记录过去状态解决。其实在分析过程中也是使用了这种策略,这个思路其实是很自然的。

class Solution {
public:
    bool lemonadeChange(vector<int>& bills) {
        int five = 0, ten = 0;
        for (int i = 0; i < bills.size(); i++) {
            if (bills[i] == 5) {
                five++;
                // return true;
            }
            if (bills[i] == 10) {
                if (five == 0) {
                    return false;
                } else {
                    five--;
                    ten++;
                }
            }
            if (bills[i] == 20) {
                if (ten > 0 && five > 0) {
                    ten--;
                    five--;
                } else if (five >= 3) {
                    five -= 3;
                } else
                    return false;
            }
        }
        return true;
    }
};

根据身高重建队列

问题理解

class Solution {
    static bool cmd(const vector<int>& a,const vector<int>& b){
        if(a[0]==b[0])  return a[1]<b[1];
        return a[0]>b[0];
    }
public:
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
        vector<vector<int>> queue;
        sort(people.begin(),people.end(),cmd);
        for(int i=0;i<people.size();i++){
            int position=people[i][1];
            queue.insert(queue.begin()+position,people[i]);
        }
        return queue;
    }
};

不应该一开始看测试用例的输出,从输入开始想办法才对。确实是根据身高重建序列。

posted on 2025-12-06 00:43  FAfa_C++  阅读(6)  评论(0)    收藏  举报