From 030009023ffa80f49297f05f32ffb4f28ed65e1c Mon Sep 17 00:00:00 2001 From: mmdapl <2237221210@qq.com> Date: Wed, 5 May 2021 12:59:45 +0800 Subject: [PATCH] [5.5 coding] --- README.md | 82 +++++++++--------- 算法/.DS_Store | Bin 8196 -> 8196 bytes 算法/剑指/Readme.md | 40 ++++----- 算法/剑指/动态规划/Fibonacci.js | 41 +++++++++ .../剑指/动态规划/FindGreatestSumOfSubArray.js | 35 ++++++++ 算法/剑指/动态规划/jumpFloor.js | 46 +++++++++- 算法/剑指/动态规划/jumpFloorII.js | 25 +++++- 算法/剑指/动态规划/multiply.js | 23 +++++ 算法/剑指/动态规划/rectCover.js | 36 ++++++++ 9 files changed, 265 insertions(+), 63 deletions(-) create mode 100644 算法/剑指/动态规划/Fibonacci.js create mode 100644 算法/剑指/动态规划/FindGreatestSumOfSubArray.js create mode 100644 算法/剑指/动态规划/multiply.js create mode 100644 算法/剑指/动态规划/rectCover.js diff --git a/README.md b/README.md index e7bfa65..08fd072 100644 --- a/README.md +++ b/README.md @@ -183,25 +183,28 @@ - 栈的压入、弹出序列 + ### 双指针 -- 和为S的两个数字 -- 和为S的连续正数序列 -- 翻转单词顺序列 -- 左旋转字符串 +- [【中等】和为S的两个数字](./算法/剑指/双指针/FindNumbersWithSum.js) +- [【中等】和为S的连续正数序列](./算法/剑指/双指针/FindContinuousSequence.js) +- [【中等】左旋转字符串](./算法/剑指/双指针/LeftRotateString.js) +- [【较难】翻转单词顺序列](./算法/剑指/双指针/ReverseSentence.js) + ### 链表 -- 从尾到头打印链表 -- 在O(1)时间内删除链表节点 -- 删除链表中重复的结点 -- 链表中倒数第K个结点 -- 链表中环的入口结点 -- 反转链表 -- 合并两个排序的链表 -- 复杂链表的复制 -- 两个链表的第一个公共结点 +- [【简单】合并两个排序的链表](./算法/剑指/链表/Merge.js) +- [【简单】两个链表的第一个公共结点](./算法/剑指/链表/FindFirstCommonNode.js) +- [【中等】链表中倒数第K个结点](./算法/剑指/链表/FindKthToTail.js) +- [【中等】反转链表](./算法/剑指/链表/ReverseList.js) +- [【较难】从尾到头打印链表](./算法/剑指/链表/printListFromTailToHead.js) +- ~~在O(1)时间内删除链表节点~~ +- [【较难】删除链表中重复的结点](./算法/剑指/链表/deleteDuplication.js) +- 链表中环的入口结点[暂时没思路] +- 【较难】复杂链表的复制[暂时没有思路] + ### 树 @@ -223,62 +226,62 @@ - 树中两个节点的最低公共祖先 -### 贪心思想 +### 综合类型 + +#### 贪心思想 - 剪绳子 -- 股票的最大利润 +- [【LeetCode题目】股票的最大利润](./算法/剑指/贪心思想/maxProfit.js) -### 二分查找 +#### 二分查找 -- 旋转数组的最小数字 -- 数字在排序数组中出现的次数 +- [【简单】旋转数组的最小数字](./算法/剑指/二分查找/minNumberInRotateArray.js) +- [【中等】数字在排序数组中出现的次数](./算法/剑指/二分查找/GetNumberOfK.js) -### 分治 +#### 分治 -- 数值的整数次方 +- [【中等】数值的整数次方](./分治/Power.js) -### 搜索 +#### 搜索 -- 矩阵中的路劲 +- 矩阵中的路径 有难度 - 机器人的运动范围 - 字符串的排列 -### 排列 +#### 排列 -- 调整数组顺序使奇数位于偶数前面 -- 把数组排成最小的数 -- 数组中的逆序对 +- [【中等】调整数组顺序使奇数位于偶数前面](./算法/剑指/排列/reOrderArray.js) +- [【较难】把数组排成最小的数](./算法/剑指/双指针/ReverseSentence.js) +- 数组中的逆序对 困难 -### 动态规划 +#### 动态规划 -- 斐波拉契数列 -- 矩形覆盖 -- 跳台阶 -- 变态跳台阶 -- 连续子数组的最大和 -- 礼物的最大价值 -- 最长不含重复字符的子字符串 +- [【入门】斐波拉契数列](./算法/剑指/动态规划/Fibonacci.js) +- [【简单】变态跳台阶 找规律 可跳任意阶](./算法/剑指/动态规划/jumpFloorII.js) +- [【简单】连续子数组的最大和 时间复杂度O(n)](./算法/剑指/动态规划/FindGreatestSumOfSubArray.js) +- [【简单】构建乘积数组](./算法/剑指/动态规划/multiply.js) +- [【中等】矩形覆盖](./算法/剑指/动态规划/rectCover.js) +- [【中等】跳台阶 非递归,要么跳一阶,要么跳两阶](./算法/剑指/动态规划/jumpFloor.js) - 丑数 -- n个骰子的点数 -- 构建乘积数组 -### 数学 + +#### 数学问题 - 数组中出现次数超过一半的数字 - 圆圈中最后剩下的数 - 从1到n整数中1出现的次数 -### 位运算 +#### 位运算 - 二进制中1的个数 - 数组中只出现一次的数字 -### 其他 +### 其他分类 - 打印从 1 到最大的 n 位数 - 正则表达式匹配 @@ -292,7 +295,6 @@ - #### [前端常考](https://www.nowcoder.com/activity/oj?tab=3) diff --git a/算法/.DS_Store b/算法/.DS_Store index 5073204514cf32f53f05177795359fbeca179d68..6c22f2e471d08b0abdcb15df75732d4376960421 100644 GIT binary patch delta 21 ccmZp1XmQwZM1;fG&{Rjk(7 @@ -76,62 +76,62 @@ - 树中两个节点的最低公共祖先 -### 贪心思想 +### 综合类型 + +#### 贪心思想 - 剪绳子 - [【LeetCode题目】股票的最大利润](./贪心思想/maxProfit.js) -### 二分查找 +#### 二分查找 - [【简单】旋转数组的最小数字](./二分查找/minNumberInRotateArray.js) - [【中等】数字在排序数组中出现的次数](./二分查找/GetNumberOfK.js) -### 分治 +#### 分治 - [【中等】数值的整数次方](./分治/Power.js) -### 搜索 +#### 搜索 - 矩阵中的路径 有难度 - 机器人的运动范围 - 字符串的排列 -### 排列 +#### 排列 - [【中等】调整数组顺序使奇数位于偶数前面](./排列/reOrderArray.js) - [【较难】把数组排成最小的数](./双指针/ReverseSentence.js) -- 数组中的逆序对 +- 数组中的逆序对 困难 -### 动态规划 +#### 动态规划 -- 斐波拉契数列 -- 矩形覆盖 -- 跳台阶 -- 变态跳台阶 -- 连续子数组的最大和 -- 礼物的最大价值 -- 最长不含重复字符的子字符串 +- [【入门】斐波拉契数列](./动态规划/Fibonacci.js) +- [【简单】变态跳台阶 找规律 可跳任意阶](./动态规划/jumpFloorII.js) +- [【简单】连续子数组的最大和 时间复杂度O(n)](./动态规划/FindGreatestSumOfSubArray.js) +- [【简单】构建乘积数组](./动态规划/multiply.js) +- [【中等】矩形覆盖](./动态规划/rectCover.js) +- [【中等】跳台阶 非递归,要么跳一阶,要么跳两阶](./动态规划/jumpFloor.js) - 丑数 -- n个骰子的点数 -- 构建乘积数组 -### 数学 + +#### 数学问题 - 数组中出现次数超过一半的数字 - 圆圈中最后剩下的数 - 从1到n整数中1出现的次数 -### 位运算 +#### 位运算 - 二进制中1的个数 - 数组中只出现一次的数字 -### 其他 +### 其他分类 - 打印从 1 到最大的 n 位数 - 正则表达式匹配 diff --git a/算法/剑指/动态规划/Fibonacci.js b/算法/剑指/动态规划/Fibonacci.js new file mode 100644 index 0000000..d4e6ca2 --- /dev/null +++ b/算法/剑指/动态规划/Fibonacci.js @@ -0,0 +1,41 @@ +/* + * @Description: 【入门】斐波拉契数列 + * @Version: Beta1.0 + * @Author: 【B站&公众号】Rong姐姐好可爱 + * @Date: 2021-05-05 11:00:05 + * @LastEditors: 【B站&公众号】Rong姐姐好可爱 + * @LastEditTime: 2021-05-05 11:10:56 + */ + +function Fibonacci (n) { + // write code here + // 递归调用 + return n < 2 ? n : Fibonacci(n - 1) + Fibonacci(n - 2) +} + + +// 非递归实现 +function Fibonacci01 (n) { + + let a = 0, b = 1; + + if (n < 2) { + return n; + } + let result = 0 + for (let index = 2; index <= n; index++) { + // 求和 + result = a + b; + a = b; + b = result; + } + // 返回结果 + return result; +} + + + + +module.exports = { + Fibonacci: Fibonacci01 +}; diff --git a/算法/剑指/动态规划/FindGreatestSumOfSubArray.js b/算法/剑指/动态规划/FindGreatestSumOfSubArray.js new file mode 100644 index 0000000..a52fc51 --- /dev/null +++ b/算法/剑指/动态规划/FindGreatestSumOfSubArray.js @@ -0,0 +1,35 @@ +/* + * @Description: 【简单】连续子数组的最大和 时间复杂度O(n) + * @Version: Beta1.0 + * @Author: 【B站&公众号】Rong姐姐好可爱 + * @Date: 2021-05-05 11:34:21 + * @LastEditors: 【B站&公众号】Rong姐姐好可爱 + * @LastEditTime: 2021-05-05 11:45:11 + */ + +function FindGreatestSumOfSubArray (array) { + + // 标记指针 + let index = 0; + // 子串的累计结果 + let sum = 0; + // 子串的累加和最大值,当标记位从 + let max = array[index]; + + + // 循环 + while (index < array.length) { + sum += array[index]; + max = sum > max ? sum : max; + + // 注意,重新计数,累计求和,从0开始 + sum = sum > 0 ? sum : 0 + index++ + } + return max; + +} + +module.exports = { + FindGreatestSumOfSubArray: FindGreatestSumOfSubArray +}; diff --git a/算法/剑指/动态规划/jumpFloor.js b/算法/剑指/动态规划/jumpFloor.js index a846122..f93fb01 100644 --- a/算法/剑指/动态规划/jumpFloor.js +++ b/算法/剑指/动态规划/jumpFloor.js @@ -1,8 +1,50 @@ /* - * @Description: + * @Description: 【中等】跳台阶 递归,要么跳一阶,要么跳两阶 * @Version: Beta1.0 * @Author: 【B站&公众号】Rong姐姐好可爱 * @Date: 2021-04-28 23:41:55 * @LastEditors: 【B站&公众号】Rong姐姐好可爱 - * @LastEditTime: 2021-04-28 23:41:55 + * @LastEditTime: 2021-05-05 11:32:38 */ + + + +/** + * + * 思路: 对于第number台阶,只能从第number-1或者number-2上跳上来 + * 记作: G(number)=G(number-1)+G(number-2) + * 即: 从第number-1跳上来的次数+从第number-2上跳上来的次数 + * + */ + +// 递归实现 +function jumpFloor (number) { + // write code here + // 递归,要么跳一阶,要么跳两阶 + return number < 3 ? number : jumpFloor(number - 1) + jumpFloor(number - 2) +} + +// 非递归调用 +function jumpFloor01 (number) { + + let a = 1; + let b = 2; + let result = 0; + + if (number < 3) { + return number + } + + for (let index = 3; index <= number; index++) { + result = a + b; + a = b; + b = result; + } + + // 返回 + return result; +} + +module.exports = { + jumpFloor: jumpFloor +}; \ No newline at end of file diff --git a/算法/剑指/动态规划/jumpFloorII.js b/算法/剑指/动态规划/jumpFloorII.js index 1bbc346..7215aeb 100644 --- a/算法/剑指/动态规划/jumpFloorII.js +++ b/算法/剑指/动态规划/jumpFloorII.js @@ -4,5 +4,28 @@ * @Author: 【B站&公众号】Rong姐姐好可爱 * @Date: 2021-04-28 23:41:50 * @LastEditors: 【B站&公众号】Rong姐姐好可爱 - * @LastEditTime: 2021-04-28 23:41:51 + * @LastEditTime: 2021-05-05 11:26:46 */ + +function jumpFloorII (number) { + // write code here + + // 我tm跳1 还剩下n-1阶 记作 G(n-1) 可选 + // 我tm跳2 还剩下n-2阶 记作 G(n-2) 可选 + // .... + // 我tm跳n-1 还剩下1阶 记作 G(1) 可选 + + // 归纳出: G(n-1)=G(1)+G(2)+.....+G(n-2); + // G(n)=G(1)+G(2)+.....+G(n-2)+G(n-1) + + // 两个相减 G(n)=2* G(n-1) 去递归 G(1)=1 , G(2)=2 G(3)=2*G(2)=4 + + // 开始代码 + // return Math.pow(2,number-1) + // 位运算 + // return 1<<(number-1) + return 1 << --number +} +module.exports = { + jumpFloorII: jumpFloorII +}; \ No newline at end of file diff --git a/算法/剑指/动态规划/multiply.js b/算法/剑指/动态规划/multiply.js new file mode 100644 index 0000000..bce9739 --- /dev/null +++ b/算法/剑指/动态规划/multiply.js @@ -0,0 +1,23 @@ +/* + * @Description: 【简单】构建乘积数组 + * @Version: Beta1.0 + * @Author: 【B站&公众号】Rong姐姐好可爱 + * @Date: 2021-04-24 11:51:20 + * @LastEditors: 【B站&公众号】Rong姐姐好可爱 + * @LastEditTime: 2021-05-05 12:48:43 + */ + + +function multiply (array) { + let result = []; + + for (let index = 0; index < array.length; index++) { + // result.push(array.slice(0, index).reduce((res, item) => res * item, 1) * array.slice(index + 1).reduce((res, item) => res * item, 1)) + result.push([...array.slice(0, index), ...array.slice(index + 1)].reduce((res, item) => { + return res * item; + },1)) // 给res的初始值为1 + } + return result; +} + +console.log(multiply([1, 2, 3, 4, 5])) \ No newline at end of file diff --git a/算法/剑指/动态规划/rectCover.js b/算法/剑指/动态规划/rectCover.js new file mode 100644 index 0000000..d3d531f --- /dev/null +++ b/算法/剑指/动态规划/rectCover.js @@ -0,0 +1,36 @@ +/* + * @Description: 【中等】矩形覆盖 + * @Version: Beta1.0 + * @Author: 【B站&公众号】Rong姐姐好可爱 + * @Date: 2021-05-05 11:17:02 + * @LastEditors: 【B站&公众号】Rong姐姐好可爱 + * @LastEditTime: 2021-05-05 11:18:08 + */ + +function rectCover (number) { + // write code here + // 应该也是个递归 斐波拉契变形 + // n=1 ---> 1 + // n=2 ---> 2 + // n=3 ---> 3 <---- 1+2 + // n=4 ---> 5 <---- 2+3 + + let a = 1; // n=1的情况 + let b = 2; // n=2的情况 + + if (number < 3) { + return number; + } + + let result = 0; + for (let index = 3; index <= number; index++) { + result = a + b; + a = b; + b = result; + } + return result; + +} +module.exports = { + rectCover: rectCover +}; \ No newline at end of file