diff --git a/Week_01/id_39/LeetCode_101_39.js b/Week_01/id_39/LeetCode_101_39.js new file mode 100644 index 00000000..b1c567b9 --- /dev/null +++ b/Week_01/id_39/LeetCode_101_39.js @@ -0,0 +1,32 @@ +/** + * Definition for a binary tree node. + * function TreeNode(val) { + * this.val = val; + * this.left = this.right = null; + * } + */ +/** + * @param {TreeNode} root + * @return {boolean} + * https://leetcode.com/problems/symmetric-tree/ + */ + +// 递归法 +var treeSymmetric = function(t1, t2) { + if (t1 == null || t2 == null) { + return t1 == t2; + } + if (t1.val !== t2.val) { + return false; + } + return treeSymmetric(t1.left, t2.right) && treeSymmetric(t1.right, t2.left); +}; +var isSymmetric = function(root) { + if (!root) { + return true; + } + return treeSymmetric(root.left, root.right); +}; + + +// 迭代法 \ No newline at end of file diff --git a/Week_01/id_39/LeetCode_1021_39.js b/Week_01/id_39/LeetCode_1021_39.js new file mode 100644 index 00000000..aff8cbc1 --- /dev/null +++ b/Week_01/id_39/LeetCode_1021_39.js @@ -0,0 +1,21 @@ +/** + * @param {string} S + * @return {string} + * https://leetcode.com/problems/remove-outermost-parentheses/ + * 标志位,刨除标志位为0的时候,其余时候都移到结果中 + */ +var removeOuterParentheses = function(S) { + let sign = 0; + let result = ''; + let i = 0; + while (i < S.length) { + let cur = S.charAt(i); + if (cur === '(' && sign++ > 0) { + result += cur; + } else if (cur === ')' && sign-- > 1) { + result += cur; + } + i++; + } + return result; +}; diff --git a/Week_01/id_39/LeetCode_1047_39.js b/Week_01/id_39/LeetCode_1047_39.js new file mode 100644 index 00000000..f454ab00 --- /dev/null +++ b/Week_01/id_39/LeetCode_1047_39.js @@ -0,0 +1,21 @@ +/** + * @param {string} S + * @return {string} + * https://leetcode.com/problems/remove-all-adjacent-duplicates-in-string/ + */ +var removeDuplicates = function(S) { + let arr = S.split(''); + let stack = []; + for (let j = 0; j < arr.length; j++) { + if (!stack.length) { + stack.push(arr[j]); + continue; + } + let prev = stack.pop(); + if (arr[j] !== prev) { + stack.push(prev); + stack.push(arr[j]); + } + } + return stack.join(''); +}; \ No newline at end of file diff --git a/Week_01/id_39/LeetCode_104_39.js b/Week_01/id_39/LeetCode_104_39.js new file mode 100644 index 00000000..8bcb7db7 --- /dev/null +++ b/Week_01/id_39/LeetCode_104_39.js @@ -0,0 +1,55 @@ +/** + * Definition for a binary tree node. + * function TreeNode(val) { + * this.val = val; + * this.left = this.right = null; + * } + */ +/** + * @param {TreeNode} root + * @return {number} + * https://leetcode.com/problems/maximum-depth-of-binary-tree/ + */ +// 广度优先搜索 +var maxDepth = function(root) { + if (!root) { + return 0; + } + + let queue = []; + let level = [root]; + let depth = 0; + + while (level.length) { + depth++; + + while (level.length) { + let node = level.shift(); + if (node.left) { + queue.push(node.left); + } + if (node.right) { + queue.push(node.right); + } + } + level = queue; + queue = []; + } + + return depth; +}; + +// DFS 深度优先搜索 递归形式 +var maxDepth = function(root) { + if (!root) { + return 0; + } + return Math.max(maxDepth(root.left) + 1, maxDepth(root.right) + 1); +}; + +// DFS 深度优先搜索 非递归形式 +var maxDepth = function(root) { + if (!root) { + return 0; + } +}; diff --git a/Week_01/id_39/LeetCode_111_39.js b/Week_01/id_39/LeetCode_111_39.js new file mode 100644 index 00000000..f85507a6 --- /dev/null +++ b/Week_01/id_39/LeetCode_111_39.js @@ -0,0 +1,25 @@ +/** + * Definition for a binary tree node. + * function TreeNode(val) { + * this.val = val; + * this.left = this.right = null; + * } + */ +/** + * @param {TreeNode} root + * @return {number} + * https://leetcode.com/problems/minimum-depth-of-binary-tree/ + * 注意:最小深度是根节点到叶子节点,so 如果只有根节点和它都某一子节点,则深度为2 + */ + +var minDepth = function(root) { + if (!root) { + return 0; + } + let left = minDepth(root.left); + let right = minDepth(root.right); + if (left == 0 || right == 0) { + return left + right + 1; + } + return Math.min(left, right) + 1; +}; diff --git a/Week_01/id_39/LeetCode_141_39.js b/Week_01/id_39/LeetCode_141_39.js new file mode 100644 index 00000000..9acc19aa --- /dev/null +++ b/Week_01/id_39/LeetCode_141_39.js @@ -0,0 +1,56 @@ +/** + * Definition for a binary tree node. + * function TreeNode(val) { + * this.val = val; + * this.left = this.right = null; + * } + */ +/** + * @param {TreeNode} root + * @return {number} + * https://leetcode.com/problems/maximum-depth-of-binary-tree/ + */ +// 广度优先搜索 +var maxDepth = function(root) { + if (!root) { + return 0; + } + + let queue = []; + let level = [root]; + let depth = 0; + + while (level.length) { + depth++; + + while (level.length) { + let node = level.shift(); + if (node.left) { + queue.push(node.left); + } + if (node.right) { + queue.push(node.right); + } + } + level = queue; + queue = []; + } + + return depth; +}; + +// DFS 深度优先搜索 递归形式 +var maxDepth = function(root) { + if (!root) { + return 0; + } + return Math.max(maxDepth(root.left) + 1, maxDepth(root.right) + 1); +}; + +// DFS 深度优先搜索 非递归形式 +var maxDepth = function(root) { + if (!root) { + return 0; + } + // +}; diff --git a/Week_01/id_39/LeetCode_15_39.js b/Week_01/id_39/LeetCode_15_39.js new file mode 100644 index 00000000..adb96e45 --- /dev/null +++ b/Week_01/id_39/LeetCode_15_39.js @@ -0,0 +1,52 @@ +/** + * @param {number[]} nums + * @return {number[][]} + * https://leetcode.com/problems/3sum/ + * 备注:这一版太乱了, 内存性能都非常差!!! + */ + +var threeSum = function(arrs) { + if (arrs.length < 3) { + return []; + } + let nums = []; + let map = new Map(); + for (let i = 0; i < arrs.length; i++) { + let cur = arrs[i]; + if (map.has(cur)) { + let count = map.get(cur); + if (count < 3) { + map.set(cur, count + 1); + nums.push(cur); + } + } else { + map.set(cur, 1); + nums.push(cur); + } + } + // nums = temps; + let result = new Set(); + for (let i = 0; i < nums.length; i++) { + for (let j = 0; j < nums.length; j++) { + let a = nums[i]; + let b = nums[j]; + let c = (-1) * (a + b); + if (map.has(c)) { + if ((a == b && b == c && c == a) && map.get(a) < 3) { + continue; + } + if ((a == b || a == c) && map.get(a) < 2) { + continue; + } + if (b == c && map.get(b) < 2) { + continue; + } + let arr = [a, b, c].sort().join(','); + result.add(arr); + } + } + } + return Array.from(result, (val) => { + return val.split(',') + }); +}; \ No newline at end of file diff --git a/Week_01/id_39/LeetCode_189_39.js b/Week_01/id_39/LeetCode_189_39.js new file mode 100644 index 00000000..7ff4e78d --- /dev/null +++ b/Week_01/id_39/LeetCode_189_39.js @@ -0,0 +1,26 @@ +/** + * @param {number[]} nums + * @param {number} k + * @return {void} Do not return anything, modify nums in-place instead. + * https://leetcode.com/problems/rotate-array/ + * 思路:比较难想,3次reverse + * tips: 3种不同思路 + */ +var reverse = function(nums, i, j) { + while(i < j) { + temp = nums[i]; + nums[i] = nums[j]; + nums[j] = temp + i++; + j--; + } +} + +var rotate = function(nums, k) { + let len = nums.length; + k %= len; + + reverse(nums, 0, len - k - 1); + reverse(nums, len - k, len - 1); + reverse(nums, 0, len - 1); +}; \ No newline at end of file diff --git a/Week_01/id_39/LeetCode_21_39.js b/Week_01/id_39/LeetCode_21_39.js new file mode 100644 index 00000000..b4a972d8 --- /dev/null +++ b/Week_01/id_39/LeetCode_21_39.js @@ -0,0 +1,43 @@ +/** + * Definition for singly-linked list. + * function ListNode(val) { + * this.val = val; + * this.next = null; + * } + */ +/** + * @param {ListNode} l1 + * @param {ListNode} l2 + * @return {ListNode} + * https://leetcode.com/problems/merge-two-sorted-lists/ + * 思路:新建一个链表,头指针是一个哨兵位,遍历两个链表,比较大小,小的在前,并指针移到下一位 + */ + +function ListNode(val) { + this.val = val; + this.next = null; +} + +var mergeTwoLists = function(l1, l2) { + if (!l1 && !l2) { + return null; + } + let head = new ListNode(null); + let cur1 = l1; + let cur2 = l2; + let cur = head; + while(cur1 || cur2) { + if ((cur1 && !cur2) || (cur1 && cur2 && (cur2.val > cur1.val))) { + cur.next = new ListNode(cur1.val); + cur = cur.next; + cur1 = cur1.next; + continue; + } else { + cur.next = new ListNode(cur2.val); + cur = cur.next; + cur2 = cur2.next; + continue; + } + } + return head.next; +}; \ No newline at end of file diff --git a/Week_01/id_39/LeetCode_236_39.js b/Week_01/id_39/LeetCode_236_39.js new file mode 100644 index 00000000..6650210a --- /dev/null +++ b/Week_01/id_39/LeetCode_236_39.js @@ -0,0 +1,25 @@ +/** + * 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} + * https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/ + */ + +// 分别在左右子树查找p或者q,找到了就返回 +var lowestCommonAncestor = function(root, p, q) { + if (!root || root == p || root == q) { + return root; + } + let left = lowestCommonAncestor(root.left, p, q); + let right = lowestCommonAncestor(root.right, p, q); + + return left == null ? right : right == null ? left : root; +}; diff --git a/Week_01/id_39/LeetCode_242_39.js b/Week_01/id_39/LeetCode_242_39.js new file mode 100644 index 00000000..95a60633 --- /dev/null +++ b/Week_01/id_39/LeetCode_242_39.js @@ -0,0 +1,38 @@ +/** + * @param {string} s + * @param {string} t + * @return {boolean} + * https://leetcode.com/problems/valid-anagram/ + * 思路:一个map、len做加减,比较两个是否一样; + * 也可以排序做(nLogN) + */ +var isAnagram = function(s, t) { + let sArr = s.split(''); + let tArr = t.split(''); + let map = {}; + let len = 0; + for (let i = 0; i < sArr.length; i++) { + let cur = sArr[i]; + if (map[cur]) { + map[cur] = map[cur] + 1; + } else { + map[cur] = 1; + len++; + } + } + for (let i = 0; i < tArr.length; i++) { + let cur = tArr[i]; + if (map[cur]) { + map[cur] = map[cur] - 1; + if (map[cur] === 0) { + len--; + } + if (map[cur] < 0) { + return false; + } + } else { + return false; + } + } + return len === 0 ? true : false; +}; diff --git a/Week_01/id_39/LeetCode_24_39.js b/Week_01/id_39/LeetCode_24_39.js new file mode 100644 index 00000000..26ac99bd --- /dev/null +++ b/Week_01/id_39/LeetCode_24_39.js @@ -0,0 +1,34 @@ +/** + * Definition for singly-linked list. + * function ListNode(val) { + * this.val = val; + * this.next = null; + * } + */ +/** + * @param {ListNode} head + * @return {ListNode} + * https://leetcode.com/problems/swap-nodes-in-pairs/ + * 思路:画图!!! 偶数项指向奇数项,第一个奇数项指向下一个偶数项,如若不存在则指向奇数项,都不存在指向null(重要!!!防止循环引用); + */ +var swapPairs = function(head) { + if (!head || !head.next) { + return head; + } + let res = head.next; + let odd = head; + let even = odd.next; + while(odd && even) { + let nextOdd = even.next; + even.next = odd; + if (nextOdd) { + odd.next = nextOdd.next ? nextOdd.next : nextOdd; + odd = nextOdd; + even = nextOdd.next; + } else { + odd.next = nextOdd + break; + } + } + return res; + }; \ No newline at end of file diff --git a/Week_01/id_39/LeetCode_257_39.js b/Week_01/id_39/LeetCode_257_39.js new file mode 100644 index 00000000..89977952 --- /dev/null +++ b/Week_01/id_39/LeetCode_257_39.js @@ -0,0 +1,35 @@ +/** + * Definition for a binary tree node. + * function TreeNode(val) { + * this.val = val; + * this.left = this.right = null; + * } + */ +/** + * @param {TreeNode} root + * @return {string[]} + * https://leetcode.com/problems/binary-tree-paths/submissions/ + */ +var traverse = function(root, path, result) { + if (!root.left && !root.right) { + result.push(path + root.val); + return; + } + path = path + root.val + '->'; + + if (root.left) { + traverse(root.left, path, result); + } + if (root.right) { + traverse(root.right, path, result); + } +}; + +var binaryTreePaths = function(root) { + if (!root) { + return []; + } + let result = []; + traverse(root, '', result); + return result; +}; diff --git a/Week_01/id_39/LeetCode_26_39.js b/Week_01/id_39/LeetCode_26_39.js new file mode 100644 index 00000000..0a19a4d4 --- /dev/null +++ b/Week_01/id_39/LeetCode_26_39.js @@ -0,0 +1,26 @@ +/** + * @param {number[]} nums + * @return {number} + * https://leetcode.com/problems/remove-duplicates-from-sorted-array/ + * 思路:对比前后两个数据,如果不相等,则把后面一个和起始第一个不重复位置的后一个交换 + */ +var swap = function(arr, i, j) { + let temp = arr[i]; + arr[i] = arr[j]; + arr[j] = temp; +} +var removeDuplicates = function(nums) { + // 起始第一个不重复的点 + let notRepeat = 1; + let max = nums[0]; + let i = 1; + while(i < nums.length) { + if (nums[i] !== nums[i-1] && nums[i] > max) { + max = nums[i]; + swap(nums, notRepeat, i); + notRepeat++ + } + i++; + } + return notRepeat; +}; \ No newline at end of file diff --git a/Week_01/id_39/LeetCode_441_39.js b/Week_01/id_39/LeetCode_441_39.js new file mode 100644 index 00000000..fd20250a --- /dev/null +++ b/Week_01/id_39/LeetCode_441_39.js @@ -0,0 +1,33 @@ +/** + * @param {number} n + * @return {number} + * 未使用二分查找 + * https://leetcode.com/problems/arranging-coins/ + */ +var arrangeCoins = function(n) { + let l = 1; + let max = 0; + while (true) { + n = n - l; + l++; + if (n < 0) { + break; + } + max++; + } + return max; +}; + +var arrangeCoins = function(n) { + let l = 1; + let max = 0; + while (true) { + n = n - l; + l++; + if (n < 0) { + break; + } + max++; + } + return max; +}; \ No newline at end of file diff --git a/Week_01/id_39/LeetCode_49_39.js b/Week_01/id_39/LeetCode_49_39.js new file mode 100644 index 00000000..363a06c6 --- /dev/null +++ b/Week_01/id_39/LeetCode_49_39.js @@ -0,0 +1,26 @@ +/** + * @param {string[]} strs + * @return {string[][]} + * https://leetcode.com/problems/group-anagrams/ + * 空间换时间 + */ +var groupAnagrams = function(strs) { + let temp = {}; + let result = []; + let groupId = 0; + for (let i = 0; i < strs.length; i++) { + let sorted = strs[i] + .split('') + .sort() + .join(''); + if (!temp[sorted] && temp[sorted] != 0) { + temp[sorted] = groupId; + groupId++; + } + if (!result[temp[sorted]]) { + result[temp[sorted]] = []; + } + result[temp[sorted]].push(strs[i]); + } + return result; +}; diff --git a/Week_01/id_39/LeetCode_50_39.js b/Week_01/id_39/LeetCode_50_39.js new file mode 100644 index 00000000..0a47f0ea --- /dev/null +++ b/Week_01/id_39/LeetCode_50_39.js @@ -0,0 +1,22 @@ +/** + * @param {number} x + * @param {number} n + * @return {number} + * https://leetcode.com/problems/powx-n/ + * 分治法(递归), 不用递归的一种还没理解 + */ +var myPow = function(x, n) { + if (n === 0) { + return 1; + } + if (n === 1) { + return x; + } + if (n < 0) { + return 1 / myPow(x, -n); + } + if (n % 2 === 1) { + return x * myPow(x * x, (n - 1) / 2); + } + return myPow(x * x, n / 2); +}; diff --git a/Week_01/id_39/LeetCode_84_39.js b/Week_01/id_39/LeetCode_84_39.js new file mode 100644 index 00000000..e161bb53 --- /dev/null +++ b/Week_01/id_39/LeetCode_84_39.js @@ -0,0 +1,25 @@ +/** + * @param {number[]} heights + * @return {number} + * 目前只能理解暴力法。。。另一种单调栈的等理解之后添加 + */ +// 暴力法,计算每一种的可能 O(n^2) +var largestRectangleArea = function(heights) { + if (!heights.length) { + return 0; + } + let maxArea = 0; + for (let i = 0; i < heights.length; i++) { + let min = heights[i]; + for (let j = i; j < heights.length; j++) { + if (heights[j] < min) { + min = heights[j]; + } + let area = (j - i + 1) * min; + if (area > maxArea) { + maxArea = area; + } + } + } + return maxArea; +}; diff --git a/Week_01/id_39/LeetCode_88_39.js b/Week_01/id_39/LeetCode_88_39.js new file mode 100644 index 00000000..ac1509f7 --- /dev/null +++ b/Week_01/id_39/LeetCode_88_39.js @@ -0,0 +1,20 @@ +/** + * @param {number[]} nums1 + * @param {number} m + * @param {number[]} nums2 + * @param {number} n + * @return {void} Do not return anything, modify nums1 in-place instead. + * https://leetcode.com/problems/merge-sorted-array/ + */ +var merge = function(nums1, m, nums2, n) { + let last = m + n - 1; + m--; + n--; + while (m >= 0 || n >= 0) { + if (nums2[n] > nums1[m] || m < 0) { + nums1[last--] = nums2[n--]; + } else { + nums1[last--] = nums1[m--]; + } + } +}; \ No newline at end of file diff --git "a/Week_01/id_39/\347\256\227\346\263\225\344\270\216\346\225\260\346\215\256\347\273\223\346\236\204.png" "b/Week_01/id_39/\347\256\227\346\263\225\344\270\216\346\225\260\346\215\256\347\273\223\346\236\204.png" new file mode 100644 index 00000000..9a78481d Binary files /dev/null and "b/Week_01/id_39/\347\256\227\346\263\225\344\270\216\346\225\260\346\215\256\347\273\223\346\236\204.png" differ