力扣 題目55--跳躍遊戲
阿新 • • 發佈:2022-05-18
題目
題解
我們可以記錄一下跳之後的最遠距離
並把能夠跳到的位置記錄 一下
比如我們
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 //記錄上次到達最遠的距離View Code6 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 returnfalse; 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 };
程式碼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