C++ 中的奇偶跳躍


假設我們有一個數組 A。從某個起始索引開始,我們可以進行一系列跳躍。序列中的位置 (1, 3, 5, ...) 被稱為奇數跳躍,序列中的位置 (2, 4, 6, ...) 被稱為偶數跳躍。

現在,我們可以從索引 i 跳到索引 j(其中 i < j)的方式如下:

  • 在奇數跳躍中,我們可以跳到索引 j,使得 A[i] <= A[j] 且 A[j] 是儘可能小的值。當有多個這樣的索引 j 時,我們只能跳到最小的索引 j。

  • 在偶數跳躍中,我們可以跳到索引 j,使得 A[i] >= A[j] 且 A[j] 是儘可能大的值。當有多個這樣的索引 j 時,我們只能跳到最小的索引 j。

  • 對於某些索引 i,可能不存在合法的跳躍。

現在,當從某個起始索引開始,我們可以透過跳躍若干次到達陣列的末尾時,該起始索引被稱為良好的。

我們需要找到良好的起始索引的數量。

因此,如果輸入類似於 [10,13,12,14,15],則輸出將為 2,因為有兩個位置索引 3 和 4,我們可以從它們到達末尾。

為了解決這個問題,我們將遵循以下步驟:

  • ret := 1

  • n := A 的大小

  • 定義一個大小為 n 的陣列 nextGreaterEqual,並將其填充為 -1

  • 定義一個大小為 n 的陣列 nextSmallerEqual,並將其填充為 -1

  • 定義一個 map st

  • 對於初始化 i := n - 1,當 i >= 0 時,更新(將 i 減 1),執行:

    • if := 值不大於 A[i] 的鍵值對

    • nextGreaterEqual[i] := 如果 (it) 不是最後一個元素,則為 it 的值,否則為 -1

    • 如果它不等於 st 的最後一個元素,並且 it 的第一個元素與 A[i] 相同,則:

      • (將 it 增加 1)

    • nextSmallerEqual[i] := 如果 (it) 不是第一個元素,則為 it 的前一個元素的值,否則為 -1

    • st[A[i]] := i

  • 定義一個大小為 n x 2 的二維陣列 v,並將其填充為 false

  • v[n - 1, 0] = v[n - 1, 1] = true

  • 對於初始化 i := n - 2,當 i >= 0 時,更新(將 i 減 1),執行:

    • 如果 nextGreaterEqual[i] 不等於 -1,則:

      • v[i, 1] := v[nextGreaterEqual[i], 0]

    • 如果 nextSmallerEqual[i] 不等於 -1,則:

      • v[i, 0] := v[nextSmallerEqual[i], 1]

    • 如果 v[i, 1] 不為零,則:

      • (將 ret 增加 1)

  • 返回 ret

讓我們看看以下實現,以便更好地理解:

示例

 線上演示

#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--) {
         map<int, int>::iterator 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;
   }
};
main(){
   Solution ob;
   vector<int> v = {10,13,12,14,15};
   cout << (ob.oddEvenJumps(v));
}

輸入

{10,13,12,14,15}

輸出

2

更新於: 2020-06-08

511 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告