題目描述:
有乙隻跳蚤的家在數軸上的位置 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 步...