題目鏈結 跳躍遊戲
這個題讓我明白了,演算法題直接暴力是不行的,不要有僥倖心裡。但是,當你只會暴力的時候,還是先執行出來再進行修改吧。不然好的方法是不太容易直接想出來的。
思路:1 明確當前位置能否到達最後乙個位置,最好的判定時 當前座標i,對應的值nums[i] + i是改點能走到的最大座標處,所以當nums[i] + i >= nums.size()時,可以直接返回了。另乙個想法就是nums[i] - (nums.size() -i) >=0,其實都是一樣的,這裡我用的是後面的判定方法,也是遞迴的出口。
2 明確當前點i,需要就行多少次遞迴,即nums[i]次,因為他可以從接下來i+1到i+nums[i]內任何乙個位置出發,去尋找能否到達最終位置,需要乙個乙個嘗試,這也是這種方法慢的地方。
//時間超時
class solution
int i =1;
// cout<& nums)
};
思考:[9,5,3,2,1,0,2,0]的執行過程,用上面的方法是5->4>3>2>1>0>0>1>.....
後面就不看了,注意到0時,走不通,回到1,1對應的只有乙個遞迴,走完了回到2,此時2對應的第乙個遞迴(i = 1)走完了,
下乙個時(i = 2),對應0,但是我們知道0已經走過,但是從0開始是無法走通的,但是程式仍然會再次進行遞迴,所以造成不必要的浪費。
思考:定義乙個陣列,代表改點能否到達最後的位置,如果能則為1,就直接返回,說明改點走過了,不用走了,走也不通。要不然也不會回溯啊。
class solution ;
void solve(vectornums, bool &sig, int l, int n)
src[l] = 1;
if(l==n || nums[l] - (n - l) >=0)
//icout<=1; i--)
solve(nums,sig, i+ l, n);}}
bool canjump(vector& nums)
};//這個提示爆記憶體溢位,其實就是棧溢位,很正常,資料多了用遞迴就是這樣。
思路:倒著判斷點i能否到達最後點,如果能設定為1,再判斷前面的點j,能否到i。以此推到初始點。
class solution ;
src[n-1] = 1;
for(int i = n -2; i >= 0; i--)}}
return src[0] == 1;
}};//感謝老天,終於過了,但是時間複雜度為o(n2),太高了,繼續
思考:方法三中第二層迴圈的意思何在?說白了就是記錄乙個點,改點能否到達下乙個可行點。但是記錄的有點多,他記錄了每乙個點,我們只需要記錄最左邊的點能否到達終點,然後在最左邊點1再找乙個相對最左邊的點2能否到達1,即可。
class solution
}return leftpos == 0;
} };//o(n)
/*相對於第三種
其實count 就是nums[i] + i, j就相當於leftpos
*/
LeetCode55 跳躍遊戲
leetcode55.跳躍遊戲 給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以跳躍的最大長度。判斷你是否能夠到達最後乙個位置。示例 1 輸入 2,3,1,1,4 輸出 true 解釋 從位置 0 到 1 跳 1 步,然後跳 3 步到達最後乙個位置。示例 2 輸入...
LeetCode 55 跳躍遊戲
題目鏈結 題目描述 給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以跳躍的最大長度。判斷你是否能夠到達最後乙個位置。示例輸入 2,3,1,1,4 輸出 true 解釋 從位置 0 到 1 跳 1 步,然後跳 3 步到達最後乙個位置。輸入 3,2,1,0,4 輸出 ...
LeetCode 55 跳躍遊戲
問題 給定乙個非負整數陣列,你最初位於陣列的第乙個位置,陣列中的每個元素代表你在該位置可以跳躍的最大長度,判斷你是否能夠到達最後乙個位置。示例 1 輸入 2,3,1,1,4 輸出 true 解釋 從位置 0 到 1 跳 1 步,然後跳 3 步到達最後乙個位置。示例 2 輸入 3,2,1,0,4 輸出...