Cho mảng A. Từ chỉ số bắt đầu, thực hiện chuỗi nhảy. Nhảy thứ 1,3,5... là nhảy lẻ; 2,4,6... là nhảy chẵn. Từ i nhảy đến j (i Chỉ số tốt nếu từ đó có thể đến cuối mảng. Đếm số chỉ số tốt. Ví dụ: [10,13,12,14,15] → 2 (chỉ số 3 và 4). Tiền xử lý nextGreaterEqual và nextSmallerEqual bằng map (BST):
Giải pháp
Ví dụ mã C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int oddEvenJumps(vector<int>& A) {
int ret = 1;
int n = A.size();
vector<int> nextGreaterEqual(n, -1);
vector<int> nextSmallerEqual(n, -1);
map<int, int> st;
for (int i = n - 1; i >= 0; i--) {
auto it = st.lower_bound(A[i]);
nextGreaterEqual[i] = (it != st.end()) ? it->second : -1;
if (it != st.end() && it->first == A[i]) it++;
nextSmallerEqual[i] = (it != st.begin()) ? prev(it)->second : -1;
st[A[i]] = i;
}
vector<vector<bool> > v(n, vector<bool>(2, false));
v[n-1][0] = v[n-1][1] = true;
for (int i = n - 2; i >= 0; i--) {
if (nextGreaterEqual[i] != -1)
v[i][1] = v[nextGreaterEqual[i]][0];
if (nextSmallerEqual[i] != -1)
v[i][0] = v[nextSmallerEqual[i]][1];
if (v[i][1]) ret++;
}
return ret;
}
};
int main() {
Solution ob;
vector<int> v = {10,13,12,14,15};
cout << (ob.oddEvenJumps(v));
return 0;
}
Đầu vào
{10,13,12,14,15}
Đầu ra
2