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
|