vue3 最長遞增子序列 diff優化
阿新 • • 發佈:2021-01-21
//vue3優化版(回頭我會完善下演算法思路)
function getSequence(arr) { const p = arr.slice() const result = [0] let i, j, u, v, c const len = arr.length for (i = 0; i < len; i++) { const arrI = arr[i] if (arrI !== 0) { j = result[result.length - 1] if (arr[j] < arrI) { p[i] = j result.push(i) continue } u = 0 v = result.length - 1 while (u < v) { c = ((u + v) / 2) | 0 if (arr[result[c]] < arrI) { u = c + 1 } else { v = c } } if (arrI < arr[result[u]]) { if (u > 0) { p[i] = result[u - 1] } result[u] = i } } } u = result.length v = result[u - 1] while (u-- > 0) { result[u] = v v = p[v] } return result } console.log(getSequence([10, 9, 2, 5, 3, 7, 101, 18]));
//演算法原型——基礎演算法版
//Objective is to find the longest increasing subsequence in an array. let nums = [10,9,2,5,3,7,101,18] //O(n^2) solution that uses dynamic programming to figure out if we want the //element in the subsequence or not. if (nums.length == 0) { return 0 } //Every element initially starts with a subsequence of length 1 let dp = new Array(nums.length).fill(1) //Use a nested iterator to compare all pairs of elements in the array for (let i = 0; i < nums.length; i++) { for (let j = 0; j < i; j++) { //If nums[i] = 5 && nums[j] = 2, then we can choose to add //the previous subsequence to the current one if (nums[i] > nums[j]) { dp[i] = Math.max(dp[i], dp[j] + 1) } } } return Math.max(...dp)