出自華為實習機試第二題:
先輸入乙個數字代表數字總數
然後依次輸入幾個數字,代表當前位置能跳躍的最大步數,求到最後乙個位置的最小跳躍次數。
示例
輸入:
7 2
3 2
1 2
1 5
代表輸入7個數,最小跳躍次數為3,可以是從2-2-2-5或者2-3-2-5,都是跳躍三次
輸出為3
仔細閱讀一下題目,可以考慮遍歷搜尋的方法,也可以是動態規劃,用迭代的方式來做,在時間複雜度和空間複雜度上都能有優勢。
將一組數記為:a0
,a1,
a2,.
..,a
n a0,
a1,a
2,..
.,an
, 調到第
i i
個數的最小跳躍次數為re
si' role="presentation">res
ires
i。 則迭代公式為: re
s1=0
r es
1=
0res
i=mi
n(re
sk+1
ifak
−i+k
>=0|
k=0,
...,
i−1)
,i>
1 res
i=mi
n(re
sk+1
ifak
−i+k
>=0|
k=0,
...,
i−1)
,i
>
1迭代結果如下:i0
1234
56aiai
23
2121
5102
1①31
1①4*
22②5
*223
②6**
**3③
7***
*33③
第i i
行的①代表si
=1' role="presentation">si=
1si=
1,②代表si
=2s i=
2,
i i
行j' role="presentation">j
j列的數表示re
sk+1
r es
k+
1,且滿足ak
−i+k
>=
0 ak−
i+
k>=
0即從第
i i
個數可以一步調到第
j' role="presentation">j
j個數
i i
行j' role="presentation">jj列的
∗ ∗
表示不滿足ak
−i+k
>=
0' role="presentation">ak−
i+k>=0a
k−i+
k>=
0,即從第
i i
個數無法一步調到第
j' role="presentation">jj個數
// test_huawei.cpp: 定義控制台應用程式的入口點。
//#include "stdafx.h"
#include
using
namespace
std;
int main()
}res[0] = 0;
int temp = int_max;
for (int i = 1; i < n; i++)
}res[i] = temp;
}cout
<< res[n-1] << endl;
return
0;}
LeetCode LCP 09 最小跳躍次數
首先理解題意 有n個小球從 0 到 n 1 排序,然後每個小球都可以跳躍到當前位置記錄的值上,同時可以任意的跳躍到左邊,當然0的時候只能向右跳躍。例如 jump 2,5,1,1,1,1 當小球在0的位置上時,只能夠向右跳2位即達到jump 2 上當到達a 2 的時候就可以左右橫跳了,當然只能向右一位...
跳躍遊戲II(最少的可達跳躍次數)
給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以跳躍的最大長度。你的目標是使用最少的跳躍次數到達陣列的最後乙個位置。示例 輸入 2,3,1,1,4 輸出 2 解釋 跳到最後乙個位置的最小跳躍數是 2。從下標為 0 跳到下標為 1 的位置,跳 1 步,然後跳 3 步...
1654 到家的最少跳躍次數
題目描述 有乙隻跳蚤的家在數軸上的位置 x 處。請你幫助它從位置 0 出發,到達它的家。跳蚤跳躍的規則如下 它可以 往前 跳恰好 a 個位置 即往右跳 它可以 往後 跳恰好 b 個位置 即往左跳 它不能 連續 往後跳 2 次。它不能跳到任何 forbidden 陣列中的位置。跳蚤可以往前跳 超過 它...