From 8a7ea66c6f136ff802dd81411f21381dbcdb357f Mon Sep 17 00:00:00 2001 From: Logen <47022821+Logenleedev@users.noreply.github.com> Date: Thu, 16 Feb 2023 19:19:49 -0600 Subject: [PATCH 1/9] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=A7=A3=E9=A2=98?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0189.旋转数组.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/problems/0189.旋转数组.md b/problems/0189.旋转数组.md index 8a7b0227..35819694 100644 --- a/problems/0189.旋转数组.md +++ b/problems/0189.旋转数组.md @@ -108,6 +108,7 @@ class Solution { ## Python +方法一:局部翻转 + 整体翻转 ```python class Solution: def rotate(self, A: List[int], k: int) -> None: @@ -123,6 +124,21 @@ class Solution: reverse(k, n - 1) ``` +方法二:利用余数 + +```python +class Solution: + def rotate(self, nums: List[int], k: int) -> None: + copy = nums[:] + + for i in range(len(nums)): + nums[(i + k) % len(nums)] = copy[i] + + return nums + + # 备注:这个方法会导致空间复杂度变成 O(n) 因为我们要创建一个 copy 数组。但是不失为一种思路。 +``` + ## Go ```go From ca628323d60513178ba19e192d6bbfae94c2e947 Mon Sep 17 00:00:00 2001 From: KieranTou Date: Fri, 17 Feb 2023 10:00:34 +0800 Subject: [PATCH 2/9] =?UTF-8?q?=E6=9B=B4=E6=AD=A3=E6=8E=92=E7=89=88?= =?UTF-8?q?=E9=94=99=E8=AF=AF=20=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=9B=B4=E6=98=93=E7=90=86=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0035.搜索插入位置.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/problems/0035.搜索插入位置.md b/problems/0035.搜索插入位置.md index dd15b36b..4d9ee74f 100644 --- a/problems/0035.搜索插入位置.md +++ b/problems/0035.搜索插入位置.md @@ -250,23 +250,23 @@ public int searchInsert(int[] nums, int target) { -Golang: +### Golang -```golang +```go // 第一种二分法 func searchInsert(nums []int, target int) int { - l, r := 0, len(nums) - 1 - for l <= r{ - m := l + (r - l)/2 - if nums[m] == target{ - return m - }else if nums[m] > target{ - r = m - 1 - }else{ - l = m + 1 - } - } - return r + 1 + left, right := 0, len(nums)-1 + for left <= right { + mid := left + (right-left)/2 + if nums[mid] == target { + return mid + } else if nums[mid] > target { + right = mid - 1 + } else { + left = mid + 1 + } + } + return len(nums) } ``` From 55b6e432cafb08d64de589681902e0700bd88ea8 Mon Sep 17 00:00:00 2001 From: KieranTou Date: Fri, 17 Feb 2023 14:20:18 +0800 Subject: [PATCH 3/9] =?UTF-8?q?=E8=BF=99=E7=A7=8D=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E7=9A=84=E5=AE=9E=E7=8E=B0=E6=80=9D=E8=B7=AF=E5=92=8C=E5=8D=A1?= =?UTF-8?q?=E5=B0=94=E5=93=A5=E8=AE=B2=E7=9A=84=E4=B8=8D=E4=B8=80=E6=A0=B7?= =?UTF-8?q?=20=E8=A1=A5=E5=85=85=E5=8D=A1=E5=B0=94=E5=93=A5=E7=9A=84?= =?UTF-8?q?=E8=A7=A3=E9=A2=98=E6=80=9D=E8=B7=AF=E6=96=B9=E4=BE=BF=E5=A4=A7?= =?UTF-8?q?=E5=AE=B6=E7=90=86=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0059.螺旋矩阵II.md | 55 +++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/problems/0059.螺旋矩阵II.md b/problems/0059.螺旋矩阵II.md index 78336d5a..d9a656b9 100644 --- a/problems/0059.螺旋矩阵II.md +++ b/problems/0059.螺旋矩阵II.md @@ -300,6 +300,61 @@ function generateMatrix(n: number): number[][] { Go: +```go +package main + +import "fmt" + +func main() { + n := 3 + fmt.Println(generateMatrix(n)) +} + +func generateMatrix(n int) [][]int { + startx, starty := 0, 0 + var loop int = n / 2 + var center int = n / 2 + count := 1 + offset := 1 + res := make([][]int, n) + for i := 0; i < n; i++ { + res[i] = make([]int, n) + } + for loop > 0 { + i, j := startx, starty + + //行数不变 列数在变 + for j = starty; j < n-offset; j++ { + res[startx][j] = count + count++ + } + //列数不变是j 行数变 + for i = startx; i < n-offset; i++ { + res[i][j] = count + count++ + } + //行数不变 i 列数变 j-- + for ; j > starty; j-- { + res[i][j] = count + count++ + } + //列不变 行变 + for ; i > startx; i-- { + res[i][j] = count + count++ + } + startx++ + starty++ + offset++ + loop-- + } + if n%2 == 1 { + res[center][center] = n * n + } + return res +} +``` + ```go func generateMatrix(n int) [][]int { top, bottom := 0, n-1 From 9e2793ae99d107e2948ddcb6013fbf47709bbdfd Mon Sep 17 00:00:00 2001 From: KieranTou Date: Fri, 17 Feb 2023 16:00:57 +0800 Subject: [PATCH 4/9] =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E9=93=BE=E8=A1=A8=20?= =?UTF-8?q?=E6=B2=A1=E6=9C=89Go=E5=8D=95=E9=93=BE=E8=A1=A8=E7=9A=84?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=8F=AA=E6=9C=89=E5=BE=AA=E7=8E=AF=E5=8F=8C?= =?UTF-8?q?=E9=93=BE=E8=A1=A8=20=E6=B7=BB=E5=8A=A0=E5=8D=95=E9=93=BE?= =?UTF-8?q?=E8=A1=A8=E5=AE=9E=E7=8E=B0=E4=BE=BF=E4=BA=8E=E7=90=86=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0707.设计链表.md | 100 ++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) diff --git a/problems/0707.设计链表.md b/problems/0707.设计链表.md index b82a645e..43ed2622 100644 --- a/problems/0707.设计链表.md +++ b/problems/0707.设计链表.md @@ -652,6 +652,106 @@ class MyLinkedList: Go: +```go +//单链表实现 +package main + +import "fmt" + +func main() { + var list = new(SingleLinkedList) + list.Init() + list.addAtHead(100) + list.addAtTail(242) + list.addAtTail(777) + list.addAtIndex(1, 99999) + list.printLinkedList() +} + +// 单链表写法 // + +type SingleNode struct { + Val int + Next *SingleNode +} + +type SingleLinkedList struct { + dummyHead *SingleNode + Size int +} + +// 初始化链表 +func (list *SingleLinkedList) Init() *SingleLinkedList { + list.Size = 0 + list.dummyHead = new(SingleNode) + return list +} + +// 获取第index个节点数值 +func (list *SingleLinkedList) get(index int) int { + if list != nil || index < 0 || index > list.Size { + return -1 + } + // 让cur等于真正头节点 + cur := list.dummyHead.Next + for i := 0; i < index; i++ { + cur = cur.Next + } + return cur.Val +} + +// 在链表最前面插入一个节点 +func (list *SingleLinkedList) addAtHead(val int) { + // 以下两行代码可用一行代替 + // newNode := new(SingleNode) + // newNode.Val = val + newNode := &SingleNode{Val: val} + + newNode.Next = list.dummyHead.Next + list.dummyHead.Next = newNode + list.Size++ +} + +// 在链表最后面插入一个节点 +func (list *SingleLinkedList) addAtTail(val int) { + newNode := &SingleNode{Val: val} + cur := list.dummyHead + for cur.Next != nil { + cur = cur.Next + } + cur.Next = newNode + list.Size++ +} + +// 打印链表 +func (list *SingleLinkedList) printLinkedList() { + cur := list.dummyHead + for cur.Next != nil { + fmt.Println(cur.Next.Val) + cur = cur.Next + } +} + +// 在第index个节点之前插入新节点 +func (list *SingleLinkedList) addAtIndex(index int, val int) { + if index < 0 { + index = 0 + } else if index > list.Size { + return + } + + newNode := &SingleNode{Val: val} + cur := list.dummyHead //用虚拟头节点不用考虑在头部插入的情况 + for i := 0; i < index; i++ { + cur = cur.Next + } + newNode.Next = cur.Next + cur.Next = newNode + list.Size++ +} + +``` + ```go //循环双链表 type MyLinkedList struct { From 12d1ae53960b06698006b83a1b6832e8bc1d486a Mon Sep 17 00:00:00 2001 From: fw_qaq Date: Fri, 17 Feb 2023 19:16:35 +0800 Subject: [PATCH 5/9] =?UTF-8?q?Update=200093.=E5=A4=8D=E5=8E=9FIP=E5=9C=B0?= =?UTF-8?q?=E5=9D=80.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `&Vec` 内部实现包括指向堆上分配的缓冲区的指针、容量和长度信息等,在这里我们不需要那么多没用的信息,这可以减少一部分开销 --- problems/0093.复原IP地址.md | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/problems/0093.复原IP地址.md b/problems/0093.复原IP地址.md index a825b815..1f99a7a5 100644 --- a/problems/0093.复原IP地址.md +++ b/problems/0093.复原IP地址.md @@ -566,14 +566,24 @@ function restoreIpAddresses(s: string): string[] { ```Rust impl Solution { - fn is_valid(s: &Vec, start: usize, end: usize) -> bool { - if start > end { return false; } - if s[start] == '0' && start != end { return false; } + fn is_valid(s: &[char], start: usize, end: usize) -> bool { + if start > end { + return false; + } + if s[start] == '0' && start != end { + return false; + } let mut num = 0; - for i in start..=end { - if s[i] > '9' || s[i] < '0' { return false; } - if let Some(digit) = s[i].to_digit(10) { num = num * 10 + digit; } - if num > 255 { return false; } + for &c in s.iter().take(end + 1).skip(start) { + if !('0'..='9').contains(&c) { + return false; + } + if let Some(digit) = c.to_digit(10) { + num = num * 10 + digit; + } + if num > 255 { + return false; + } } true } From 2fc3e83bcf7c053420a5ebb485608c0ccce17ced Mon Sep 17 00:00:00 2001 From: ZerenZhang2022 <118794589+ZerenZhang2022@users.noreply.github.com> Date: Sat, 18 Feb 2023 17:27:51 -0500 Subject: [PATCH 6/9] =?UTF-8?q?Update=200763.=E5=88=92=E5=88=86=E5=AD=97?= =?UTF-8?q?=E6=AF=8D=E5=8C=BA=E9=97=B4.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit python 解法三:区间合并法 (结合下一题 56. Merge Intervals 的写法) --- problems/0763.划分字母区间.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/problems/0763.划分字母区间.md b/problems/0763.划分字母区间.md index 6c4f1c5e..6667e740 100644 --- a/problems/0763.划分字母区间.md +++ b/problems/0763.划分字母区间.md @@ -276,6 +276,33 @@ class Solution: # 最右侧区间(字符串长度为1时的特殊情况也包含于其中) res.append(right - left + 1) return res + +# 解法三:区间合并法 (结合下一题 56. Merge Intervals 的写法) +class Solution: # + def partitionLabels(self, s: str) -> List[int]: + aaa = list(set(s)) + #aaa.sort() + bbb = list(s) + ccc = [] + for i in reversed(bbb): + ccc.append(i) + intervals = [] + for i in range(len(aaa)): + intervals.append([bbb.index(aaa[i]),len(bbb)-ccc.index(aaa[i])-1]) + # 先求出各个字母的存在区间,之后利用区间合并方法得出所有不相邻的最大区间。 + intervals.sort(key = lambda x:x[0]) + newinterval = [] + left, right = intervals[0][0], intervals[0][1] + for i in range(1,len(intervals)): + if intervals[i][0] in range(left, right+1): + right = max(intervals[i][1],intervals[i-1][1],right) + left = min(intervals[i-1][0],left) + else: + newinterval.append(right-left+1) + left = intervals[i][0] + right = intervals[i][1] + newinterval.append(right-left+1) + return newinterval ``` ### Go From 974e66aba2e86d68b71c91bbc6bcf80baac7dbc5 Mon Sep 17 00:00:00 2001 From: lee3yearsold <56989190+lee3yearsold@users.noreply.github.com> Date: Mon, 20 Feb 2023 11:08:26 +0800 Subject: [PATCH 7/9] Add files via upload --- ...包的排列问题二维迭代理解).md | 145 ++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 problems/0377-组合总和IV(完全背包的排列问题二维迭代理解).md diff --git a/problems/0377-组合总和IV(完全背包的排列问题二维迭代理解).md b/problems/0377-组合总和IV(完全背包的排列问题二维迭代理解).md new file mode 100644 index 00000000..276329c5 --- /dev/null +++ b/problems/0377-组合总和IV(完全背包的排列问题二维迭代理解).md @@ -0,0 +1,145 @@ +# 完全背包的排列问题模拟 + +#### Problem + +1. 排列问题是完全背包中十分棘手的问题。 +2. 其在迭代过程中需要先迭代背包容量,再迭代物品个数,使得其在代码理解上较难入手。 + +#### Contribution + +本文档以力扣上[组合总和IV](https://leetcode.cn/problems/combination-sum-iv/)为例,提供一个二维dp的代码例子,并提供模拟过程以便于理解 + +#### Code + +```cpp +int combinationSum4(vector& nums, int target) { + // 定义背包容量为target,物品个数为nums.size()的dp数组 + // dp[i][j]表示将第0-i个物品添加入排列中,和为j的排列方式 + vector> dp (nums.size(), vector(target+1,0)); + + // 表示有0,1,...,n个物品可选择的情况下,和为0的选择方法为1:什么都不取 + for(int i = 0; i < nums.size(); i++) dp[i][0] = 1; + + // 必须按列遍历,因为右边数组需要知道左边数组最低部的信息(排列问题) + // 后面的模拟可以更清楚的表现这么操作的原因 + for(int i = 1; i <= target; i++){ + for(int j = 0; j < nums.size(); j++){ + // 只有nums[j]可以取的情况 + if(j == 0){ + if(nums[j] > i) dp[j][i] = 0; + // 如果背包容量放不下 那么此时没有排列方式 + else dp[j][i] = dp[nums.size()-1][i-nums[j]]; + // 如果背包容量放的下 全排列方式为dp[最底层][容量-该物品容量]排列方式后面放一个nums[j] + } + // 有多个nums数可以取 + else{ + // 如果背包容量放不下 那么沿用0-j-1个物品的排列方式 + if(nums[j] > i) dp[j][i] = dp[j-1][i]; + // 如果背包容量放得下 在dp[最底层][容量-该物品容量]排列方式后面放一个nums[j]后面放个nums[j] + // INT_MAX避免溢出 + else if(i >= nums[j] && dp[j-1][i] < INT_MAX - dp[nums.size()-1][i-nums[j]]) + dp[j][i] = dp[j-1][i] + dp[nums.size()-1][i-nums[j]]; + } + } + } + // 打印dp数组 + for(int i = 0; i < nums.size(); i++){ + for(int j = 0; j <= target; j++){ + cout< Date: Tue, 21 Feb 2023 12:01:03 +0800 Subject: [PATCH 8/9] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=87=AA=E8=BF=B0?= =?UTF-8?q?=E6=96=87=E6=A1=A3=EF=BC=88README.md=EF=BC=89=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=EF=BC=8C=E6=8F=90=E5=8D=87=E6=96=87=E6=A1=A3=E7=BE=8E=E8=A7=82?= =?UTF-8?q?=E5=BA=A6=E5=92=8C=E4=B8=93=E4=B8=9A=E6=80=A7=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c6d6bfe2..a2da1550 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ > 2. **正式出版** :[《代码随想录》](https://programmercarl.com/other/publish.html) 。 > 3. **PDF版本** : [「代码随想录」算法精讲 PDF 版本](https://programmercarl.com/other/algo_pdf.html) 。 > 4. **算法公开课** : [《代码随想录》算法视频公开课](https://www.bilibili.com/video/BV1fA4y1o715) 。 -> 5. **最强八股文:**:[代码随想录知识星球精华PDF](https://www.programmercarl.com/other/kstar_baguwen.html) +> 5. **最强八股文** : [代码随想录知识星球精华PDF](https://www.programmercarl.com/other/kstar_baguwen.html) 。 > 6. **刷题顺序** : README已经将刷题顺序排好了,按照顺序一道一道刷就可以。 > 7. **学习社区** : 一起学习打卡/面试技巧/如何选择offer/大厂内推/职场规则/简历修改/技术分享/程序人生。欢迎加入[「代码随想录」知识星球](https://programmercarl.com/other/kstar.html) 。 > 8. **提交代码**:本项目统一使用C++语言进行讲解,但已经有Java、Python、Go、JavaScript等等多语言版本,感谢[这里的每一位贡献者](https://github.com/youngyangyang04/leetcode-master/graphs/contributors),如果你也想贡献代码点亮你的头像,[点击这里](https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A)了解提交代码的方式。 From 85b5186117ae1e3a80b58bcfe49ce1c387c6e18b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E6=97=A0=E7=BC=BA?= Date: Tue, 21 Feb 2023 12:05:58 +0800 Subject: [PATCH 9/9] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=87=AA=E8=BF=B0?= =?UTF-8?q?=E6=96=87=E6=A1=A3=EF=BC=88README.md=EF=BC=89=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=EF=BC=8C=E6=8F=90=E5=8D=87=E6=96=87=E6=A1=A3=E7=BE=8E=E8=A7=82?= =?UTF-8?q?=E5=BA=A6=E5=92=8C=E4=B8=93=E4=B8=9A=E6=80=A7=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index a2da1550..aa6c93ee 100644 --- a/README.md +++ b/README.md @@ -2,14 +2,14 @@ 👉 推荐 [在线阅读](http://programmercarl.com/) (Github在国内访问经常不稳定) 👉 推荐 [Gitee同步](https://gitee.com/programmercarl/leetcode-master) -> 1. **介绍**:本项目是一套完整的刷题计划,旨在帮助大家少走弯路,循序渐进学算法,[关注作者](#关于作者) +> 1. **介绍** :本项目是一套完整的刷题计划,旨在帮助大家少走弯路,循序渐进学算法,[关注作者](#关于作者) > 2. **正式出版** :[《代码随想录》](https://programmercarl.com/other/publish.html) 。 -> 3. **PDF版本** : [「代码随想录」算法精讲 PDF 版本](https://programmercarl.com/other/algo_pdf.html) 。 -> 4. **算法公开课** : [《代码随想录》算法视频公开课](https://www.bilibili.com/video/BV1fA4y1o715) 。 -> 5. **最强八股文** : [代码随想录知识星球精华PDF](https://www.programmercarl.com/other/kstar_baguwen.html) 。 -> 6. **刷题顺序** : README已经将刷题顺序排好了,按照顺序一道一道刷就可以。 -> 7. **学习社区** : 一起学习打卡/面试技巧/如何选择offer/大厂内推/职场规则/简历修改/技术分享/程序人生。欢迎加入[「代码随想录」知识星球](https://programmercarl.com/other/kstar.html) 。 -> 8. **提交代码**:本项目统一使用C++语言进行讲解,但已经有Java、Python、Go、JavaScript等等多语言版本,感谢[这里的每一位贡献者](https://github.com/youngyangyang04/leetcode-master/graphs/contributors),如果你也想贡献代码点亮你的头像,[点击这里](https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A)了解提交代码的方式。 +> 3. **PDF版本** :[「代码随想录」算法精讲 PDF 版本](https://programmercarl.com/other/algo_pdf.html) 。 +> 4. **算法公开课** :[《代码随想录》算法视频公开课](https://www.bilibili.com/video/BV1fA4y1o715) 。 +> 5. **最强八股文** :[代码随想录知识星球精华PDF](https://www.programmercarl.com/other/kstar_baguwen.html) 。 +> 6. **刷题顺序** :README已经将刷题顺序排好了,按照顺序一道一道刷就可以。 +> 7. **学习社区** :一起学习打卡/面试技巧/如何选择offer/大厂内推/职场规则/简历修改/技术分享/程序人生。欢迎加入[「代码随想录」知识星球](https://programmercarl.com/other/kstar.html) 。 +> 8. **提交代码** :本项目统一使用C++语言进行讲解,但已经有Java、Python、Go、JavaScript等等多语言版本,感谢[这里的每一位贡献者](https://github.com/youngyangyang04/leetcode-master/graphs/contributors),如果你也想贡献代码点亮你的头像,[点击这里](https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A)了解提交代码的方式。 > 9. **转载须知** :以下所有文章皆为我([程序员Carl](https://github.com/youngyangyang04))的原创。引用本项目文章请注明出处,发现恶意抄袭或搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境!