495. Teemo Attacking

来源:互联网 发布:淘宝考试题目答案 编辑:程序博客网 时间:2024/05/18 22:18

整体不是很难。

一开始超时了,主要是由于要不停维护state这张表格,耗费时间。因此修改为区间处理。

class Solution {public:    int findPoisonedDuration(vector<int>& timeSeries, int duration) {        if(timeSeries.size()==0)            return 0;        else        {            vector<int> state(timeSeries[timeSeries.size()-1]+duration,0);            int poisonedTime=0;            for(int i=0;i<timeSeries.size();i++)            {                for(int j=timeSeries[i];j<timeSeries[i]+duration;j++)                {                    if(state[j]==0)                    {                        poisonedTime++;                        state[j]=1;                    }                }                cout<<poisonedTime<<endl;            }            return poisonedTime;        }    }};

正确代码:
采用区间的greedy策略,将每一个小区间按照pair的第一维排序,然后建立一个queue维护,计算区间之间1的个数,得到最后的结果。

queue处理时要细心。

class Solution {public:    static bool cmp( pair<int,int>& a,  pair<int,int>& b)    {        if(a.first<b.first)            return true;        else            return false;    }    int findPoisonedDuration(vector<int>& timeSeries, int duration) {        if(timeSeries.size()==0)            return 0;        else        {            vector<pair<int, int>> range;            for(int i=0;i<timeSeries.size();i++)            {                pair<int, int> temp(timeSeries[i],timeSeries[i]+duration-1);                   range.push_back(temp);            }            sort(range.begin(),range.end(),cmp);            //process range            /*for(int i=0;i<range.size();i++)                cout<<range[i].first<< " "<<range[i].second<<endl;            */            int poisonedTime=0;            queue<pair<int,int>> findRange;            for(int i=0;i<range.size();i++)            {                if(!findRange.empty())                {                    if(findRange.back().second>=range[i].first)                    {                        pair<int,int> newPair(findRange.back().first,range[i].second);                        findRange.push(newPair);                        findRange.pop();                    }                    else                    {                        poisonedTime+=findRange.front().second-findRange.front().first+1;                        findRange.push(range[i]);                        findRange.pop();                    }                }                else                    findRange.push(range[i]);                //cout<<findRange.size()<<endl;                /*for(int i=0;i<findRange.size();i++)                    cout<<findRange.back().first<< " "<<findRange.back().second<<endl;*/            }            if(!findRange.empty())                poisonedTime+=findRange.front().second-findRange.front().first+1;            return poisonedTime;        }    }};
0 0
原创粉丝点击