1. 程式人生 > 其它 >力扣 題目55--跳躍遊戲

力扣 題目55--跳躍遊戲

題目


題解

我們可以記錄一下跳之後的最遠距離

並把能夠跳到的位置記錄 一下

比如我們

vector<int> loop(nums.size(), 0);

當某個數可以被跳入時 對應位置的loop變為1

以3,2,1,0,4為例

一開始跳3 那麼我們將 2,1,0 loop位置改為1

這樣遍歷到4時loop對應位置是0 即發現沒有能夠跳到的 即返回false;

一些技巧

1.實際上我們可以發現 如果不能跳 那麼就一定是卡在0 後面的都不能跳入 所以我們只要每一輪判斷loop對應位置是否為0即可

2.我們可以判斷每一輪迴圈的最遠距離是否比當前的最遠距離 還遠 如果遠 就將差的那部分loop改為1 然後更新最遠距離

3.如果在2中將差的部分改為1時 遍歷到最後了 直接返回true

以上基本是就可以通過了 但是提交之後發現空間複雜度不太理想 那麼應該思考如何在原來的陣列上動手腳而不是新開一個容器

題目中要求提到 nums[i] <= 10的5次方 那麼我們將能跳的數全部+10的5次方 然後更新一下其他條件就可以了

程式碼

程式碼1 新開容器

 1 class Solution {
 2 public:
 3     bool canJump(vector<int>& nums) {
 4         int position = 0;
 5         //記錄上次到達最遠的距離
6 int far = 0; 7 //全部最大用來比較 8 if (nums.size() == 1) { 9 return 1; 10 } 11 vector<int> loop(nums.size(), 0); 12 loop[0] = 1; 13 for (; position < nums.size() - 1; position++) { 14 if (loop[position] == 0) { 15 return
false; 16 } 17 if (far>= position+ nums[position]) { 18 continue; 19 } 20 for (int i = 1; i < position+ nums[position]-far+1&& far + i<nums.size(); i++) { 21 loop[far + i] = 1; 22 if ((far + i) == nums.size() - 1) { 23 return true; 24 } 25 } 26 far = position+ nums[position]; 27 } 28 return false; 29 } 30 };
View Code

程式碼2 10的5次方

 1 class Solution {
 2 public:
 3     bool canJump(vector<int>& nums) {
 4         int position = 0;
 5         //記錄上次到達最遠的距離
 6         int far = 0;
 7         //如果只有一個 必定為true
 8         if (nums.size() == 1) {
 9             return 1;
10         }
11         //第一個+100000
12         nums[0] += 100000;
13         //迴圈
14         for (; position < nums.size() - 1; position++) {
15             //如果nums[position]<100000 說明沒有跳到 直接返回false
16             if (nums[position]< 100000) {
17                 return false;
18             }
19             //如果far最遠大於position + nums[position]-100000 即最大跳的距離 直接結束本來迴圈即可
20             if (far >= position + nums[position]- 100000) {
21                 continue;
22             }
23             //如果far小於position + nums[position]-100000  則更新
24             for (int i = 1; i < position + nums[position] - far + 1 - 100000 && far + i < nums.size(); i++) {
25                 nums[far + i] += 100000;
26                 //如果遍歷到nums.size() - 1說明可以跳到最後 則直接返回true
27                 if ((far + i) == nums.size() - 1) {
28                     return true;
29                 }
30             }
31             //更新
32             far = position + nums[position] - 100000;
33         }
34         return false;
35     }
36 };
View Code