LeetCode 55. Jump Game

55. Jump Game

Given an array of non-negative integers, you are initially positioned at the first index of the array.
Each element in the array represents your maximum jump length at that position.
Determine if you are able to reach the last index.

個人解法:

理解題意,其實能否跳到終點取決于是否有跨不過去的0點,除此以外所有的點哪怕再慢也能把你帶到終點。
所以思路就是遍歷所有的零點,判斷它是否能被跳過。

/**
* 55. Jump Game
* @param {number[]} nums
* @return {boolean}
*/

var canJump = function (nums) {
   if (nums.length <= 1) {
       return true;
   }
   let zeroList = [];
   for (let i = 0; i < nums.length; i++) {
       if (nums[i]) {
           continue;
       }
       zeroList.push(i);
   }
   for (let i = 0; i < zeroList.length; i++) {
       let start = -1
       let end = zeroList[i];
       let flag = false;
       for (let j = end - 1; j > start; j--) {
           if (i === zeroList.length - 1 && nums[nums.length - 1] === 0) {
               if (end - j <= nums[j]) {
                   flag = true;
                   break;
               }
           } else {
               if (end - j < nums[j]) {
                   flag = true;
                   break;
               }
           }
       }
       if (!flag)
           return false;
   }
   return true;
};

一開始我覺得下面那個解法我覺得比上面那個好點,跑出來卻比上一個慢10%左右。
這個算法總體思路相似,差異點在于從最后一個零點開始,取到第一個可以超過或到達該零點的點,跳過中途所有的零點,直接取到上一次取到的點的上一個零點。
感覺上是會快,但是這個算法只是在理想情況下快很多,達到接近O(n)的復(fù)雜度,而且這個O(n)實際上遠遠快于上一個O(n),在最差情況則幾乎是O(n^2)的復(fù)雜度,所以綜合跑下來差不多但是略慢。

// alternative solution;
var canJump = function (nums) {
   if (nums.length <= 1) {
       return true;
   }
   let zeroList = [];
   for (let i = 0; i < nums.length; i++) {
       if (nums[i]) {
           continue;
       }
       if (i)
           zeroList.push(i);
       else
           return false;
   }
   for (let i = zeroList.length - 1; i >= 0; i--) {
       for (let j = 0; j < zeroList[i]; j++) {
           if (i === zeroList.length - 1 && nums[nums.length - 1] === 0) {
               if (zeroList[i] - j <= nums[j]) {
                   i = zeroList.findIndex(x => x > j);
                   break;
               }
           } else {
               if (zeroList[i] - j < nums[j]) {
                   i = zeroList.findIndex(x => x > j);
                   break;
               }
           }
           if (j === zeroList[i] - 1) {
               return false;
           }
       }
   }
   return true;
};
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容