力扣OJ 503. 下一个更大元素 II

给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。

示例 1:

输入: [1,2,1]
输出: [2,-1,2]
解释: 第一个 1 的下一个更大的数是 2;
数字 2 找不到下一个更大的数; 
第二个 1 的下一个最大的数需要循环搜索,结果也是 2。

 

//翻转vector
template
vector frev(vector v)
{
    vector ans;
    for(int i=v.size()-1;i>=0;i--)ans.push_back(v[i]);
    return ans;
}
//vector乘一个数
template
void fcheng(vector &v,T2 n)
{
    for(int i=v.size()-1;i>=0;i--)v[i]*=n;
}
//vector加一个数
template
void fjia(vector &v,T2 n)
{
    for(int i=v.size()-1;i>=0;i--)v[i]+=n;
}
//id处,覆盖或者添加x
template
void finsert(vector&v,int id,T x)
{
    if(id<0||id>v.size())return;
    if(id==v.size())v.push_back(x);
    v[id]=x;
}

//返回vector每个数前面最近的满足pr关系的数的ID,-1 或者 0到size-1
templateinline
vectorfirstInLeft(vectorv,P pr)
{
    vector ans;
    if(v.size()==0)return ans;
    stackst;
    st.push(0);
    ans.push_back(-1);
    for(int i=1;i
vector fminlef(vector v)
{
    return firstInLeft(v,[](T a,T b){return a
vector fminlef2(vector v)
{
    return firstInLeft(v,[](T a,T b){return a<=b;});
}
//返回vector每个数前面最近的比它大的数的ID,-1 或者 0到size-1
template
vector fmaxlef(vector v)
{
    fcheng(v,-1);
    vectorans=fminlef(v);
    return ans;
}
//返回vector每个数前面最近的比它大或等于的数的ID,-1 或者 0到size-1
template
vector fmaxlef2(vector v)
{
    fcheng(v,-1);
    vectorans=fminlef2(v);
    return ans;
}


//返回vector每个数后面最近的比它小的数的ID,size 或者 0到size-1
template
vector fminrig(vector v)
{
    vectorv1=frev(v),v2=fminlef(v1);
    fcheng(v2,-1);
    fjia(v2,v.size()-1);
    return frev(v2);
}
//返回vector每个数后面最近的比它小或等于的数的ID,size 或者 0到size-1
template
vector fminrig2(vector v)
{
    vectorv1=frev(v),v2=fminlef2(v1);
    fcheng(v2,-1);
    fjia(v2,v.size()-1);
    return frev(v2);
}
//返回vector每个数后面最近的比它大的数的ID,size 或者 0到size-1
template
vector fmaxrig(vector v)
{
    vectorv1=frev(v),v2=fmaxlef(v1);
    fcheng(v2,-1);
    fjia(v2,v.size()-1);
    return frev(v2);
}
//返回vector每个数后面最近的比它大或等于的数的ID,size 或者 0到size-1
template
vector fmaxrig2(vector v)
{
    vectorv1=frev(v),v2=fmaxlef2(v1);
    fcheng(v2,-1);
    fjia(v2,v.size()-1);
    return frev(v2);
}

//把v和id转化为v[id]
template
vector fgetNumFromId(vector &v,vectorid)
{
    vectorans;
    ans.resize(id.size());
    for(int i=0;i=0 && id[i]
template
map vectorToMap(vector &v1,vector &v2)
{
    mapm;
    for(int i=0;i
vector vmToVector(vector &v,map&m)
{
    vectorans;
    ans.resize(v.size());
    for(int i=0;i nextGreaterElements(vector& nums) {
        vectort=nums;
        t.resize(nums.size()*2);
        copy(nums.begin(),nums.end(),t.begin()+nums.size());
        vectortmp=fgetNumFromId(t,fmaxrig(t));
        vectorans=nums;
        copy(tmp.begin(),tmp.begin()+tmp.size()/2,ans.begin());
        return ans;
    }
};

 

你可能感兴趣的:(new)