1.每个位置能跳的位置由本身位置和次数的奇偶性决定。
首先把每个位置 奇次跳的位置 和 偶次跳的位置找出来。
方法:先对数值排序满足第一个要求。然后借助单调栈找到可以跳到位置。
2.之后从最后一个位置向后遍历,确定每个位置能否跳到最后一个位置。
class Solution {
public:
vector<int> make(vector<int>& B){
int n=B.size();
vector<int> ans(n,-1);
stack<int> dr;
for(auto x:B){
while(!dr.empty()&&x>dr.top()){
ans[dr.top()]=x;
dr.pop();
}
dr.push(x);
}
return ans;
}
static bool cmp(pair<int,int>& a,pair<int,int>& b){
if(a.first>b.first) return true;
else if(a.first==b.first&&a.second<b.second) return true;
return false;
}
int oddEvenJumps(vector<int>& A) {
int n=A.size();
vector<pair<int,int>> ccs(n);
for(int i=0;i<n;i++){
ccs[i].first=A[i];
ccs[i].second=i;
}
vector<int> oddnext,evenext,B(n);
sort(ccs.begin(),ccs.end());
for(int i=0;i<n;i++) B[i]=ccs[i].second;
oddnext=make(B);
sort(ccs.begin(),ccs.end(),cmp);
for(int i=0;i<n;i++) B[i]=ccs[i].second;
evenext=make(B);
vector<bool> odd(n,false),even(n,false);
odd[n-1]=even[n-1]=true;
for(int i=n-2;i>=0;i--){
if(oddnext[i]!=-1) odd[i]=even[oddnext[i]];
if(evenext[i]!=-1) even[i]=odd[evenext[i]];
}
int ans=0;
for(int i=0;i<n;i++) if(odd[i]) ans++;
return ans;
}
};