1654 到家的最少跳躍次數

2021-10-18 16:45:23 字數 1618 閱讀 7830

題目描述:

有乙隻跳蚤的家在數軸上的位置 x 處。請你幫助它從位置 0 出發,到達它的家。

跳蚤跳躍的規則如下:

它可以 往前 跳恰好 a 個位置(即往右跳)。

它可以 往後 跳恰好 b 個位置(即往左跳)。

它不能 連續 往後跳 2 次。

它不能跳到任何 forbidden 陣列中的位置。

跳蚤可以往前跳 超過 它的家的位置,但是它 不能跳到負整數 的位置。

給你乙個整數陣列 forbidden ,其中 forbidden[i] 是跳蚤不能跳到的位置,同時給你整數 a, b 和 x ,請你返回跳蚤到家的最少跳躍次數。如果沒有恰好到達 x 的可行方案,請你返回 -1 。

示例 1:

輸入:forbidden = [14,4,18,1,15], a = 3, b = 15, x = 9

輸出:3

解釋:往前跳 3 次(0 -> 3 -> 6 -> 9),跳蚤就到家了。

示例 2:

輸入:forbidden = [8,3,16,6,12,20], a = 15, b = 13, x = 11

輸出:-1

示例 3:

輸入:forbidden = [1,6,2,14,5,17,4], a = 16, b = 9, x = 7

輸出:2

解釋:往前跳一次(0 -> 16),然後往回跳一次(16 -> 7),跳蚤就到家了。

1 <= forbidden.length <= 1000

1 <= a, b, forbidden[i] <= 2000

0 <= x <= 2000

forbidden 中所有位置互不相同。

位置 x 不在 forbidden 中。

方法1:

(1)模擬跳躍的過程,使用bfs;

(2)將所有的向前跳過的和禁止的點放入到雜湊中進行標識;

(3)使用對應的負值標識是向後跳躍跳到的位置;

(4)參考題解區的確定最大範圍為6000;

class

solution

unordered_set<

int> st;

for(

int& i:forbidden)

st.insert(0

);queue<

int>q;

//bfs

q.push(0

);int res=0;

//跳躍的次數

while

(!q.

empty()

)if(st.

count

(to_left)==0

&&to_left>0)

}else

int to_right=cur_index+a;

//向前跳

if(to_right==x)

if(st.

count

(to_right)==0

&&to_right<

6000)}

}return-1

;}};

Leetcode 1654 到家的最少跳躍次數

題意 有乙隻跳蚤的家在數軸上的位置x處。請你幫助它從位置0出發,到達它的家。跳蚤跳躍的規則如下 跳蚤可以往前跳超過它的家的位置,但是它不能跳到負整數的位置。給你乙個整數陣列forbidden,其中forbidden i 是跳蚤不能跳到的位置,同時給你整數a,b和x,請你返回跳蚤到家的最少跳躍次數。如...

5552 到家的最少跳躍次數 BFS

有乙隻跳蚤的家在數軸上的位置 x 處。請你幫助它從位置 0 出發,到達它的家。跳蚤跳躍的規則如下 它可以 往前 跳恰好 a 個位置 即往右跳 它可以 往後 跳恰好 b 個位置 即往左跳 它不能 連續 往後跳 2 次。它不能跳到任何 forbidden 陣列中的位置。跳蚤可以往前跳 超過 它的家的位置...

跳躍遊戲II(最少的可達跳躍次數)

給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以跳躍的最大長度。你的目標是使用最少的跳躍次數到達陣列的最後乙個位置。示例 輸入 2,3,1,1,4 輸出 2 解釋 跳到最後乙個位置的最小跳躍數是 2。從下標為 0 跳到下標為 1 的位置,跳 1 步,然後跳 3 步...