1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
   | 时间复杂度不过关就要优化 不用递归用循环 记录中间结果 if(n<=0)return 0 if(n===1)return 1 let n1 = 1  let n2 = 0  let res = 0 for(let i = 2 ;i<=n,i++){     res = n1+n2     n1=n2     n2=res } return res 此方法引出动态规划 =>大问题 连环问 青蛙跳台阶和斐波那契数列完全一样
  将数组中的0移动末尾 splice 的时间复杂度就是O(n) 外加遍历O(n) 总的为O(n^2) function moveZero(arr){     const length = arr.length     if(length===0)return;     let zerolength = 0     for(let i = 0;i<length-zerolength;i++){         if(arr[i]===0){             arr.push(0)              arr.splice(i,1)               i--               zerolength++         }     } } const arr= [1,0,3,4,0,0,11,0] moveZero(arr) console.log(arr) 时间复杂度为O(n^2) 算法不可用
  优化:双指针 定义j指向第一个0,i指向j后面的第一个非O 交换i和j的值,继续向后移动 只遍历一次,所以时间复杂度是O(n) function moveZero(arr){     const length = arr.length     if(length===0)return;     let i     let j = -1      for(let i = 0;i<length;i++){     	if(arr[i]===0){              if(j<0){                  j = i             }         }             if(arr[i]!==0&&j>=0){                          const n =arr[i]             arr[i] = arr[j]             arr[j]=n             j++         } 	} } const arr= [1,0,3,4,0,0,11,0] moveZero(arr) console.log(arr) 总结 数组是连续存储,要慎用splice unshift等API
   |