diff --git "a/Week01/1.\344\270\244\346\225\260\344\271\213\345\222\214.js" "b/Week01/1.\344\270\244\346\225\260\344\271\213\345\222\214.js" new file mode 100644 index 000000000..0dd7a3509 --- /dev/null +++ "b/Week01/1.\344\270\244\346\225\260\344\271\213\345\222\214.js" @@ -0,0 +1,11 @@ +var twoSum = function (nums, target) { + let obj = {}; + let cha = 0; + for (let i = 0; i < nums.length; i++) { + cha = target - nums[i]; + if (obj[cha] != undefined) { + return [obj[cha], i]; + } + obj[nums[i]] = i; + } +}; diff --git "a/Week01/21.\345\220\210\345\271\266\344\270\244\344\270\252\346\234\211\345\272\217\351\223\276\350\241\250.js" "b/Week01/21.\345\220\210\345\271\266\344\270\244\344\270\252\346\234\211\345\272\217\351\223\276\350\241\250.js" new file mode 100644 index 000000000..310f6cdec --- /dev/null +++ "b/Week01/21.\345\220\210\345\271\266\344\270\244\344\270\252\346\234\211\345\272\217\351\223\276\350\241\250.js" @@ -0,0 +1,16 @@ +var mergeTwoLists = function (l1, l2) { + let prehead = new ListNode(-1); + let prev = prehead; + while (l1 != null && l2 != null) { + if (l1.val <= l2.val) { + prev.next = l1; + l1 = l1.next; + } else { + prev.next = l2; + l2 = l2.next; + } + prev = prev.next; + } + prev.next = l1 === null ? l2 : l1; + return prehead.next; +}; diff --git "a/Week01/283.\347\247\273\345\212\250\351\233\266.js" "b/Week01/283.\347\247\273\345\212\250\351\233\266.js" new file mode 100644 index 000000000..309492b1e --- /dev/null +++ "b/Week01/283.\347\247\273\345\212\250\351\233\266.js" @@ -0,0 +1,11 @@ +var moveZeroes = function (nums) { + let j = 0; + for (let i = 0; i < nums.length; i++) { + if (nums[i] !== 0) { + nums[j] = nums[i]; + if (i > j) nums[i] = 0; + j++; + } + } + return nums; +}; diff --git "a/Week01/88.\345\220\210\345\271\266\344\270\244\344\270\252\346\234\211\345\272\217\346\225\260\347\273\204.js" "b/Week01/88.\345\220\210\345\271\266\344\270\244\344\270\252\346\234\211\345\272\217\346\225\260\347\273\204.js" new file mode 100644 index 000000000..6aca9aaaf --- /dev/null +++ "b/Week01/88.\345\220\210\345\271\266\344\270\244\344\270\252\346\234\211\345\272\217\346\225\260\347\273\204.js" @@ -0,0 +1,8 @@ +var merge = function (nums1, m, nums2, n) { + var index = m + n - 1; + m--; + n--; + while (n >= 0) { + nums1[index--] = nums1[m] > nums2[n] ? nums1[m--] : nums2[n--]; + } +}; diff --git a/Week01/NOTE.md b/Week01/NOTE.md index 50de30414..2552fe215 100644 --- a/Week01/NOTE.md +++ b/Week01/NOTE.md @@ -1 +1,8 @@ -学习笔记 \ No newline at end of file + +1. 两边限,左右夹逼 + for(let i = 0; i< a.length -1; i 0) { + let node = stack.pop(); + node && arr.push(node.val); // node不为空时,向arr中推入节点值 + node && node.right && stack.push(node.right); // 模拟栈,所以先压右节点 + node && node.left && stack.push(node.left); // 后入先出,后压左节点 + } + return arr +}; \ No newline at end of file diff --git "a/Week02/264. \344\270\221\346\225\260 II.js" "b/Week02/264. \344\270\221\346\225\260 II.js" new file mode 100644 index 000000000..75166970b --- /dev/null +++ "b/Week02/264. \344\270\221\346\225\260 II.js" @@ -0,0 +1,31 @@ + +var nthUglyNumber = function(n) { + + if (!n) { + return 0; + } + + let i2 = 0, i3 = 0, i5 = 0; + let out = [1]; + + while (!out[n-1]) { + let c2 = out[i2] * 2; + let c3 = out[i3] * 3; + let c5 = out[i5] * 5; + let next = Math.min(Math.min(c2, c3), c5); + out.push(next); + + if (next === c2) { + i2++; + } + if (next === c3) { + i3++; + } + if (next === c5) { + i5++; + } + + } + + return out[n-1]; +}; \ No newline at end of file diff --git "a/Week02/347. \345\211\215 K \344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.js" "b/Week02/347. \345\211\215 K \344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.js" new file mode 100644 index 000000000..ac6a93a51 --- /dev/null +++ "b/Week02/347. \345\211\215 K \344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.js" @@ -0,0 +1,34 @@ +let topKFrequent = function(nums, k) { + let map = new Map(), arr = [...new Set(nums)] + nums.map((num) => { + if(map.has(num)) map.set(num, map.get(num)+1) + else map.set(num, 1) + }) + + // 如果元素数量小于等于 k + if(map.size <= k) { + return [...map.keys()] + } + + return bucketSort(map, k) +}; + +// 桶排序 +let bucketSort = (map, k) => { + let arr = [], res = [] + map.forEach((value, key) => { + // 利用映射关系(出现频率作为下标)将数据分配到各个桶中 + if(!arr[value]) { + arr[value] = [key] + } else { + arr[value].push(key) + } + }) + // 倒序遍历获取出现频率最大的前k个数 + for(let i = arr.length - 1;i >= 0 && res.length < k;i--){ + if(arr[i]) { + res.push(...arr[i]) + } + } + return res +} \ No newline at end of file diff --git "a/Week02/429. N\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.js" "b/Week02/429. N\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.js" new file mode 100644 index 000000000..8288b072b --- /dev/null +++ "b/Week02/429. N\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.js" @@ -0,0 +1,17 @@ +var levelOrder = function(root) { + let nums = []; + search(nums, root , 0); + return nums; +}; +function search(nums, root, k){ + if(root== null){ + return + } + if(nums[k] == undefined){ + nums[k] = [] + } + nums[k].push(root.val); + for(let i = 0;i < root.children.length;i++){ + search(nums,root.children[i],k+1) + } +} \ No newline at end of file diff --git "a/Week02/49. \345\255\227\346\257\215\345\274\202\344\275\215\350\257\215\345\210\206\347\273\204.js" "b/Week02/49. \345\255\227\346\257\215\345\274\202\344\275\215\350\257\215\345\210\206\347\273\204.js" new file mode 100644 index 000000000..557eb6423 --- /dev/null +++ "b/Week02/49. \345\255\227\346\257\215\345\274\202\344\275\215\350\257\215\345\210\206\347\273\204.js" @@ -0,0 +1,18 @@ +var groupAnagrams = function (strs) { + // 1.长度为0,长度为1校验 + if (strs.length === 0) return []; + if (strs.length === 1) return [strs]; + // 2.新建map + let words = new Map(); + // 3.循环赋值map + for (let val of strs) { + let valSort = [...val].sort().join(""); + if (words.size > 0 && words.has(valSort)) { + words.get(valSort).push(val); + } else { + words.set(valSort, [val]); + } + } + // 4.输出结果 + return [...words.values()]; +}; diff --git "a/Week02/589. N\345\217\211\346\240\221\347\232\204\345\211\215\345\272\217\351\201\215\345\216\206.js" "b/Week02/589. N\345\217\211\346\240\221\347\232\204\345\211\215\345\272\217\351\201\215\345\216\206.js" new file mode 100644 index 000000000..833cb62e4 --- /dev/null +++ "b/Week02/589. N\345\217\211\346\240\221\347\232\204\345\211\215\345\272\217\351\201\215\345\216\206.js" @@ -0,0 +1,13 @@ +var preorder = function (root) { + if (!root) return []; + let res = [], + arr = [root]; + while (arr.length) { + var cur = arr.pop(); + res.push(cur.val); + for (var i = cur.children.length - 1; i >= 0; i--) { + arr.push(cur.children[i]); + } + } + return res; +}; diff --git "a/Week02/94. \344\272\214\345\217\211\346\240\221\347\232\204\344\270\255\345\272\217\351\201\215\345\216\206.js" "b/Week02/94. \344\272\214\345\217\211\346\240\221\347\232\204\344\270\255\345\272\217\351\201\215\345\216\206.js" new file mode 100644 index 000000000..855b8add0 --- /dev/null +++ "b/Week02/94. \344\272\214\345\217\211\346\240\221\347\232\204\344\270\255\345\272\217\351\201\215\345\216\206.js" @@ -0,0 +1,14 @@ +var inorderTraversal = function(root) { + let nums = []; + let stack = []; + while(root || stack.length){ + while(root){ + stack.push(root); + root = root.left; + } + root = stack.pop(); + nums.push(root.val); + root = root.right; + } + return nums; +} \ No newline at end of file diff --git a/Week02/NOTE.md b/Week02/NOTE.md index 50de30414..b18f05fdf 100644 --- a/Week02/NOTE.md +++ b/Week02/NOTE.md @@ -1 +1,43 @@ -学习笔记 \ No newline at end of file +学习笔记 +1.中序遍历 根-左-右 +var preorderTraversal = function(root) { + const res = [] + function traversal (root) { + if (root !== null) { + res.push(root.val) // 访问根节点的值 + traversal(root.left) // 递归遍历左子树 + traversal(root.right) // 递归遍历右子树 + } + } + traversal(root) + return res +} +2.前序遍历 左-根-右 +var preorderTraversal = function(root) { + const res = [] + function traversal (root) { + if (root !== null) { + traversal(root.left) // 递归遍历左子树 + res.push(root.val) // 访问根节点的值 + traversal(root.right) // 递归遍历右子树 + } + } + traversal(root) + return res +} +3.后序遍历 左-右-根 +var preorderTraversal = function(root) { + const res = [] + function traversal (root) { + if (root !== null) { + traversal(root.left) // 递归遍历左子树 + traversal(root.right) // 递归遍历右子树 + res.push(root.val) // 访问根节点的值 + } + } + traversal(root) + return res +} +4.链表靠遍数 +5.栈 先进后出 +6.队列 先进先出 \ No newline at end of file diff --git "a/Week03/105.\344\273\216\345\211\215\345\272\217\344\270\216\344\270\255\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.js" "b/Week03/105.\344\273\216\345\211\215\345\272\217\344\270\216\344\270\255\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.js" new file mode 100644 index 000000000..c688c7af7 --- /dev/null +++ "b/Week03/105.\344\273\216\345\211\215\345\272\217\344\270\216\344\270\255\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221.js" @@ -0,0 +1,26 @@ +/** + * Definition for a binary tree node. + * function TreeNode(val) { + * this.val = val; + * this.left = this.right = null; + * } + */ +/** + * @param {number[]} preorder + * @param {number[]} inorder + * @return {TreeNode} + */ +var buildTree = function (preorder, inorder) { + let hash = {}; + inorder.forEach((e, i) => { + hash[e] = i; + }); + let recur = function (start, end) { + if (start > end) return null; + let root = new TreeNode(preorder.shift()); + root.left = recur(start, hash[root.val] - 1); + root.right = recur(hash[root.val] + 1, end); + return root; + }; + return recur(0, inorder.length - 1); +}; diff --git "a/Week03/236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.js" "b/Week03/236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.js" new file mode 100644 index 000000000..3305ebe37 --- /dev/null +++ "b/Week03/236.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.js" @@ -0,0 +1,21 @@ +/** + * Definition for a binary tree node. + * function TreeNode(val) { + * this.val = val; + * this.left = this.right = null; + * } + */ +/** + * @param {TreeNode} root + * @param {TreeNode} p + * @param {TreeNode} q + * @return {TreeNode} + */ +const lowestCommonAncestor = (root, p, q) => { + if (!root || root === q || root === p) return root; + const left = lowestCommonAncestor(root.left, p, q); + const right = lowestCommonAncestor(root.right, p, q); + if (!left) return right; + if (!right) return left; + return root; +}; diff --git "a/Week03/46.\345\205\250\346\216\222\345\210\227.js" "b/Week03/46.\345\205\250\346\216\222\345\210\227.js" new file mode 100644 index 000000000..a76e5980a --- /dev/null +++ "b/Week03/46.\345\205\250\346\216\222\345\210\227.js" @@ -0,0 +1,24 @@ +/** + * @param {number[]} nums + * @return {number[][]} + */ +var permute = function (nums) { + let length = nums.length; + let res = [], + arr = []; + search(res, arr, nums, length, 0); + return res; +}; +function search(res, arr, nums, k, step) { + if (arr.length == k) { + res.push(arr.slice()); + return; + } + for (let i = 0; i < k; i++) { + if (arr.includes(nums[i])) continue; + arr.push(nums[i]); + search(res, arr, nums, k, step + 1); + arr.pop(); + } + return res; +} diff --git "a/Week03/47.\345\205\250\346\216\222\345\210\2272.js" "b/Week03/47.\345\205\250\346\216\222\345\210\2272.js" new file mode 100644 index 000000000..79ad86429 --- /dev/null +++ "b/Week03/47.\345\205\250\346\216\222\345\210\2272.js" @@ -0,0 +1,55 @@ +/** + * @param {number[]} nums + * @return {number[][]} + */ +/** + * @param {number[]} nums + * @return {number[][]} + */ +var permuteUnique = function (nums) { + let n = nums.length; + nums = nums.sort((a, b) => { + return a - b; + }); + let res = []; + let tmpPath = []; + let hash = {}; + let backtrack = (tmpPath) => { + if (tmpPath.length == n) { + res.push(tmpPath); + return; + } + for (let i = 0; i < n; i++) { + if (hash[i] || (i > 0 && !hash[i - 1] && nums[i - 1] == nums[i])) + continue; + hash[i] = true; + tmpPath.push(nums[i]); + backtrack(tmpPath.slice()); + hash[i] = false; + tmpPath.pop(); + } + }; + backtrack(tmpPath); + return res; +}; +// var permuteUnique = function(nums) { +//  let data = []; +//  nums = nums.sort(); +//  function _permute(curr, remaining) { +//      if (!remaining.length) { +//          data.push(curr); +//          return; +//      } +//      for (let i = 0; i < remaining.length; i++) { +//          if (i > 0 && remaining[i] === remaining[i - 1]) { +//              continue; +//          } else { +//              curr.push(remaining[i]); +//              _permute([...curr], [...remaining.slice(0, i), ...remaining.slice(i + 1)]); +//              curr.pop(); +//          } +//      } +//  } +//  _permute([], nums); +//  return data; +// } diff --git "a/Week03/77.\347\273\204\345\220\210.js" "b/Week03/77.\347\273\204\345\220\210.js" new file mode 100644 index 000000000..65319ea2b --- /dev/null +++ "b/Week03/77.\347\273\204\345\220\210.js" @@ -0,0 +1,25 @@ +/** + * @param {number} n + * @param {number} k + * @return {number[][]} + */ +var combine = function (n, k) { + if (k == 0) return [[]]; + var res = [], + could = []; + + return dfs(1, n, k, res, could); +}; +function dfs(step, n, k, res, could) { + if (could.length == k) { + res.push(could.slice(0)); + + return; + } + for (var i = step; i <= n; i++) { + could.push(i); + dfs(i + 1, n, k, res, could); + could.pop(); + } + return res; +} diff --git a/Week03/NOTE.md b/Week03/NOTE.md index 50de30414..bc5dde11a 100644 --- a/Week03/NOTE.md +++ b/Week03/NOTE.md @@ -1 +1,35 @@ -学习笔记 \ No newline at end of file +学习笔记 +1.递归模板 +``` + function recursion(level,param1,param2...){ + //递归终结条件 + if(level>MAX_LEVEL){ + process_result; + return + } + //处理当前层逻辑 + process(level,data) + //下探到下一层 + recursion (level+1,p1,p2...) + //分治在这里多一个组合结果的过程 + result = 。。。。。。 + } + 不要人肉递归 + 找重复子问题 + 数学归纳法的思想 +``` +2.回溯 +if(满足条件){ + return 跳出 +} +function dfs(step){ + 判断边界 + {相应操作} + 尝试可能 + { + 满足条件 + 标记 + 继续下一步dfs(step+1) + 恢复初始(回溯时间) + } +} diff --git "a/Week04/153. \345\257\273\346\211\276\346\227\213\350\275\254\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\347\232\204\346\234\200\345\260\217\345\200\274.js" "b/Week04/153. \345\257\273\346\211\276\346\227\213\350\275\254\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\347\232\204\346\234\200\345\260\217\345\200\274.js" new file mode 100644 index 000000000..d3323cd27 --- /dev/null +++ "b/Week04/153. \345\257\273\346\211\276\346\227\213\350\275\254\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\347\232\204\346\234\200\345\260\217\345\200\274.js" @@ -0,0 +1,13 @@ +var findMin = function (nums) { + var left = 0; + var right = nums.length - 1; + while (left < right) { + var mid = Math.floor((left + right) / 2); + if (nums[mid] > nums[right]) { + left = mid + 1; + } else { + right = mid; + } + } + return nums[left]; +}; diff --git "a/Week04/200. \345\262\233\345\261\277\346\225\260\351\207\217.js" "b/Week04/200. \345\262\233\345\261\277\346\225\260\351\207\217.js" new file mode 100644 index 000000000..ecf840771 --- /dev/null +++ "b/Week04/200. \345\262\233\345\261\277\346\225\260\351\207\217.js" @@ -0,0 +1,35 @@ +/* + * @lc app=leetcode id=200 lang=javascript + * + * [200] Number of Islands + */ +function helper(grid, i, j, rows, cols) { + if (i < 0 || j < 0 || i > rows - 1 || j > cols - 1 || grid[i][j] === "0") + return; + + grid[i][j] = "0"; + + helper(grid, i + 1, j, rows, cols); + helper(grid, i, j + 1, rows, cols); + helper(grid, i - 1, j, rows, cols); + helper(grid, i, j - 1, rows, cols); +} +/** + * @param {character[][]} grid + * @return {number} + */ +var numIslands = function (grid) { + let res = 0; + const rows = grid.length; + if (rows === 0) return 0; + const cols = grid[0].length; + for (let i = 0; i < rows; i++) { + for (let j = 0; j < cols; j++) { + if (grid[i][j] === "1") { + helper(grid, i, j, rows, cols); + res++; + } + } + } + return res; +}; diff --git "a/Week04/33. \346\220\234\347\264\242\346\227\213\350\275\254\346\216\222\345\272\217\346\225\260\347\273\204.js" "b/Week04/33. \346\220\234\347\264\242\346\227\213\350\275\254\346\216\222\345\272\217\346\225\260\347\273\204.js" new file mode 100644 index 000000000..b484dd685 --- /dev/null +++ "b/Week04/33. \346\220\234\347\264\242\346\227\213\350\275\254\346\216\222\345\272\217\346\225\260\347\273\204.js" @@ -0,0 +1,30 @@ +/** + * @param {number[]} nums + * @param {number} target + * @return {number} + */ +var search = function (nums, target) { + let start = 0; + let end = nums.length - 1; + while (start <= end) { + let mid = Math.floor((start + end) / 2); + if (nums[mid] == target) return mid; + // mid > start 说明是递增的,mid左边不需要,反之右边不需要 + if (nums[start] <= nums[mid]) { + // target 在start和mid之间,说明右边界需要左移,反之右移 + if (nums[start] <= target && target <= nums[mid]) { + end = mid - 1; + } else { + start = mid + 1; + } + } else { + // target 在mid和end之间,说明左边界需要右移动,反之左移动 + if (nums[mid] <= target && target <= nums[end]) { + start = mid + 1; + } else { + end = mid - 1; + } + } + } + return -1; +}; diff --git "a/Week04/55.\350\267\263\350\267\203\346\270\270\346\210\217.js" "b/Week04/55.\350\267\263\350\267\203\346\270\270\346\210\217.js" new file mode 100644 index 000000000..396c3133c --- /dev/null +++ "b/Week04/55.\350\267\263\350\267\203\346\270\270\346\210\217.js" @@ -0,0 +1,14 @@ +/** + * @param {number[]} nums + * @return {boolean} + */ +var canJump = function (nums) { + if (nums === null) return false; + let endReachable = nums.length - 1; + for (let i = nums.length - 1; i >= 0; i--) { + if (nums[i] + i >= endReachable) { + endReachable = i; + } + } + return endReachable == 0; +}; diff --git a/Week04/NOTE.md b/Week04/NOTE.md index 50de30414..9c3042cb4 100644 --- a/Week04/NOTE.md +++ b/Week04/NOTE.md @@ -1 +1,62 @@ -学习笔记 \ No newline at end of file +# 学习笔记 + +## 深度优先搜索 + +```bash + function def (node){ + if (node in visited){ + return; + } + # process currect node + visited.push(node); + dfs(node.left); + dfs(node.right); + } +``` + +```bash + visited = new Set(); + function dfs(node,visited){ + visited.add(node); + # process currect node here + for( let next-node of node.children){ + if(!visited.has(next-node)){ + dfs(next-node,visited) + } + } + } +``` + +## 广度优先搜索 + +```bash + function BFS(graph,start,end){ + queue = []; + queue.push([start]); + visited.add(start); + while(queue.length){ + node = queue.pop(); + visited.add(node); + process(node); + nodes = generate_related_nodes(node); + queue.push(nodes); + } + # other processing work + } +``` + +## 二分查找 + +```bash + left,right - 0 ,len(array)-1; + while(left <= right){ + mid = (left + right) / 2; + if(array[mid] == target ) { + #find the target + break or return result + }else if(array[mid] = 0; i--) { + for (let j = colLength - 1; j >= 0; j--) { + if (i == rowLenth - 1 && j != colLength - 1) { + grid[i][j] = grid[i][j] + grid[i][j + 1]; + } else if (j == colLength - 1 && i != rowLenth - 1) { + grid[i][j] = grid[i][j] + grid[i + 1][j]; + } else if (i != rowLenth - 1 && j != colLength - 1) { + grid[i][j] = grid[i][j] + Math.min(grid[i + 1][j], grid[i][j + 1]); + } else { + } + } + } + return grid[0][0]; +}; diff --git a/Week06/NOTE.md b/Week06/NOTE.md index 50de30414..8993643ca 100644 --- a/Week06/NOTE.md +++ b/Week06/NOTE.md @@ -1 +1,7 @@ -学习笔记 \ No newline at end of file +### 学习笔记 + +1. 重复性分治 + +2. 定义状态数组 + +3. DP方程 diff --git a/Week07/200.js b/Week07/200.js new file mode 100644 index 000000000..ecf840771 --- /dev/null +++ b/Week07/200.js @@ -0,0 +1,35 @@ +/* + * @lc app=leetcode id=200 lang=javascript + * + * [200] Number of Islands + */ +function helper(grid, i, j, rows, cols) { + if (i < 0 || j < 0 || i > rows - 1 || j > cols - 1 || grid[i][j] === "0") + return; + + grid[i][j] = "0"; + + helper(grid, i + 1, j, rows, cols); + helper(grid, i, j + 1, rows, cols); + helper(grid, i - 1, j, rows, cols); + helper(grid, i, j - 1, rows, cols); +} +/** + * @param {character[][]} grid + * @return {number} + */ +var numIslands = function (grid) { + let res = 0; + const rows = grid.length; + if (rows === 0) return 0; + const cols = grid[0].length; + for (let i = 0; i < rows; i++) { + for (let j = 0; j < cols; j++) { + if (grid[i][j] === "1") { + helper(grid, i, j, rows, cols); + res++; + } + } + } + return res; +}; diff --git a/Week07/208.js b/Week07/208.js new file mode 100644 index 000000000..6ec582e32 --- /dev/null +++ b/Week07/208.js @@ -0,0 +1,72 @@ +/** + * Initialize your data structure here. + */ + +var TrieNode = function () { + this.next = {}; + this.isEnd = false; +}; + +/** + * Initialize your data structure here. + */ +var Trie = function () { + this.root = new TrieNode(); +}; + +/** + * Inserts a word into the trie. + * @param {string} word + * @return {void} + */ +Trie.prototype.insert = function (word) { + if (!word) return false; + + let node = this.root; + for (let i = 0; i < word.length; ++i) { + if (!node.next[word[i]]) { + node.next[word[i]] = new TrieNode(); + } + node = node.next[word[i]]; + } + node.isEnd = true; + return true; +}; + +/** + * Returns if the word is in the trie. + * @param {string} word + * @return {boolean} + */ +Trie.prototype.search = function (word) { + if (!word) return false; + + let node = this.root; + for (let i = 0; i < word.length; ++i) { + if (node.next[word[i]]) { + node = node.next[word[i]]; + } else { + return false; + } + } + return node.isEnd; +}; + +/** + * Returns if there is any word in the trie that starts with the given prefix. + * @param {string} prefix + * @return {boolean} + */ +Trie.prototype.startsWith = function (prefix) { + if (!prefix) return true; + + let node = this.root; + for (let i = 0; i < prefix.length; ++i) { + if (node.next[prefix[i]]) { + node = node.next[prefix[i]]; + } else { + return false; + } + } + return true; +}; \ No newline at end of file diff --git a/Week07/NOTE.md b/Week07/NOTE.md index 50de30414..74aac9022 100644 --- a/Week07/NOTE.md +++ b/Week07/NOTE.md @@ -1 +1,2 @@ -学习笔记 \ No newline at end of file +学习笔记 + diff --git "a/Week08/191. \344\275\2151\347\232\204\344\270\252\346\225\260.js" "b/Week08/191. \344\275\2151\347\232\204\344\270\252\346\225\260.js" new file mode 100644 index 000000000..70c23d363 --- /dev/null +++ "b/Week08/191. \344\275\2151\347\232\204\344\270\252\346\225\260.js" @@ -0,0 +1,15 @@ +/** + * @param {number} n - a positive integer + * @return {number} + */ +var hammingWeight = function (n) { + let count = 0; + let mask = 1; + for (let i = 0; i < 32; i++) { + if ((n & mask) != 0) { + count++; + } + mask <<= 1; + } + return count; +}; diff --git "a/Week08/231. 2\347\232\204\345\271\202.js" "b/Week08/231. 2\347\232\204\345\271\202.js" new file mode 100644 index 000000000..8336aefb5 --- /dev/null +++ "b/Week08/231. 2\347\232\204\345\271\202.js" @@ -0,0 +1,18 @@ +/** + * @param {number} n + * @return {boolean} + */ +var isPowerOfTwo = function(n) { + + if(n<1){ + return false; + } + + let m = n & (n-1); + if(m==0){ + return true; + }else{ + return false; + } + +}; diff --git a/Week08/NOTE.md b/Week08/NOTE.md index 50de30414..f4a13a2d6 100644 --- a/Week08/NOTE.md +++ b/Week08/NOTE.md @@ -1 +1,32 @@ -学习笔记 \ No newline at end of file +学习笔记 + +#JavaScript 位运算符 + +| 运算符 | 名称 |描述| +| :---- | :---- |:----| +| & | AND |如果两位都是 1 则设置每位为 1 | +| | | OR | 如果两位之一为 1 则设置每位为 1 | +| ^ | XOR |如果两位只有一位为 1 则设置每位为 1 | +| ~ | NOT |反转所有位 | +| << | 零填充左位移 |通过从右推入零向左位移,并使最左边的位脱落。 | +| >> | 有符号右位移 |通过从左推入最左位的拷贝来向右位移,并使最右边的位脱落。 | +| >>> | 零填充右位移 |通过从左推入零来向右位移,并使最右边的位脱落。 | + +#快速排序算法 +```js +var quickSort = function(arr) { +  if (arr.length <= 1) { return arr; } +  var pivotIndex = Math.floor(arr.length / 2); +  var pivot = arr.splice(pivotIndex, 1)[0]; +  var left = []; +  var right = []; +  for (var i = 0; i < arr.length; i++){ +    if (arr[i] < pivot) { +      left.push(arr[i]); +    } else { +      right.push(arr[i]); +    } +  } +  return quickSort(left).concat([pivot], quickSort(right)); +}; +``` \ No newline at end of file diff --git a/Week09/151.js b/Week09/151.js new file mode 100644 index 000000000..223749ffe --- /dev/null +++ b/Week09/151.js @@ -0,0 +1,3 @@ +var reverseWords = function(s) { + return s.split(" ").filter(v => v != "").reverse().join(" "); +}; \ No newline at end of file diff --git a/Week09/387.js b/Week09/387.js new file mode 100644 index 000000000..9aa479a09 --- /dev/null +++ b/Week09/387.js @@ -0,0 +1,8 @@ +var firstUniqChar = function(s) { + for (let i = 0; i < s.length; i++) { + if (s.indexOf(s[i]) === s.lastIndexOf(s[i])) { + return i + } + } + return -1 +}; \ No newline at end of file diff --git a/Week09/NOTE.md b/Week09/NOTE.md index 50de30414..bc29a8ac7 100644 --- a/Week09/NOTE.md +++ b/Week09/NOTE.md @@ -1 +1,42 @@ -学习笔记 \ No newline at end of file +学习笔记 +Rabin-Karp +```js + function rabinKarpSearch(text, pattern) { + const D = 256; + const Q = 9997; + + let N = text.length; + let M = pattern.length; + let patHash = 0; + let txtHash = 0; + + for (let i = 0; i < M; i++) { + patHash = (D * patHash + pattern[i].codePointAt(0)) % Q; + txtHash = (D * txtHash + text[i].codePointAt(0)) % Q; + } + + let highestPow = 1; // 256 ** (M - 1); + for (let i = 0; i < M - 1; i++) { + highestPow = (highestPow * D) % Q; + } + + let i, j; + for (i = 0; i < N - M + 1; i++) { + if (patHash === txtHash) { + for (j = 0; j < M; j++) { + if (pattern[j] !== text[i + j]) break; + } + if (j === M) return i; + } + if (i < N - M) { + txtHash = (D * (txtHash - text[i].codePointAt(0) * highestPow) + text[i + M].codePointAt(0)) % Q; + if (txtHash < 0) { + txtHash += Q; + } + } + } + return -1; + } + + console.log(rabinKarpSearch("abcabcabx", "abcabx")); +``` diff --git a/week10/js.md b/week10/js.md new file mode 100644 index 000000000..20ffb8eb5 --- /dev/null +++ b/week10/js.md @@ -0,0 +1,11 @@ +# 毕业总结 + +## 五毒神掌刷题法 + +## 坚持学习的态度 + +## 每天进步一点的喜悦 + +## 算法入门了解 + +## 对未来有些许期望