From ccfa2c495fc5c7762517dc990a2fe58328a3292a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E4=BB=A4=E4=BB=A4?= Date: Fri, 8 Apr 2022 18:02:30 +0800 Subject: [PATCH 01/22] =?UTF-8?q?Update=200028.=E5=AE=9E=E7=8E=B0strStr.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 swift 前缀表两种实现方法 --- problems/0028.实现strStr.md | 107 ++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) diff --git a/problems/0028.实现strStr.md b/problems/0028.实现strStr.md index 634d8535..d67e5f70 100644 --- a/problems/0028.实现strStr.md +++ b/problems/0028.实现strStr.md @@ -1059,5 +1059,112 @@ func getNext(_ next: inout [Int], needle: [Character]) { ``` +> 前缀表右移 + +```swift +func strStr(_ haystack: String, _ needle: String) -> Int { + + let s = Array(haystack), p = Array(needle) + guard p.count != 0 else { return 0 } + + var j = 0 + var next = [Int].init(repeating: 0, count: p.count) + getNext(&next, p) + + for i in 0 ..< s.count { + + while j > 0 && s[i] != p[j] { + j = next[j] + } + + if s[i] == p[j] { + j += 1 + } + + if j == p.count { + return i - p.count + 1 + } + } + + return -1 + } + + // 前缀表后移一位,首位用 -1 填充 + func getNext(_ next: inout [Int], _ needle: [Character]) { + + guard needle.count > 1 else { return } + + var j = 0 + next[0] = j + + for i in 1 ..< needle.count-1 { + + while j > 0 && needle[i] != needle[j] { + j = next[j-1] + } + + if needle[i] == needle[j] { + j += 1 + } + + next[i] = j + } + next.removeLast() + next.insert(-1, at: 0) + } +``` + +> 前缀表统一不减一 +```swift + +func strStr(_ haystack: String, _ needle: String) -> Int { + + let s = Array(haystack), p = Array(needle) + guard p.count != 0 else { return 0 } + + var j = 0 + var next = [Int](repeating: 0, count: needle.count) + // KMP + getNext(&next, needle: p) + + for i in 0 ..< s.count { + while j > 0 && s[i] != p[j] { + j = next[j-1] + } + + if s[i] == p[j] { + j += 1 + } + + if j == p.count { + return i - p.count + 1 + } + } + return -1 + } + + //前缀表 + func getNext(_ next: inout [Int], needle: [Character]) { + + var j = 0 + next[0] = j + + for i in 1 ..< needle.count { + + while j>0 && needle[i] != needle[j] { + j = next[j-1] + } + + if needle[i] == needle[j] { + j += 1 + } + + next[i] = j + + } + } + +``` + -----------------------
From 559f03c92869ca55ae929d66de872f5ddda70567 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E4=BB=A4=E4=BB=A4?= Date: Fri, 8 Apr 2022 18:11:05 +0800 Subject: [PATCH 02/22] =?UTF-8?q?Update=200459.=E9=87=8D=E5=A4=8D=E7=9A=84?= =?UTF-8?q?=E5=AD=90=E5=AD=97=E7=AC=A6=E4=B8=B2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0459.重复的子字符串.md | 43 ++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/problems/0459.重复的子字符串.md b/problems/0459.重复的子字符串.md index ccfb485c..6a9b4260 100644 --- a/problems/0459.重复的子字符串.md +++ b/problems/0459.重复的子字符串.md @@ -421,5 +421,48 @@ function repeatedSubstringPattern(s: string): boolean { }; ``` + +Swift: + +> 前缀表统一减一 +```swift + func repeatedSubstringPattern(_ s: String) -> Bool { + + let sArr = Array(s) + let len = s.count + if len == 0 { + return false + } + var next = Array.init(repeating: -1, count: len) + + getNext(&next,sArr) + + if next.last != -1 && len % (len - (next[len-1] + 1)) == 0{ + return true + } + + return false + } + + func getNext(_ next: inout [Int], _ str:[Character]) { + + var j = -1 + next[0] = j + + for i in 1 ..< str.count { + + while j >= 0 && str[j+1] != str[i] { + j = next[j] + } + + if str[i] == str[j+1] { + j += 1 + } + + next[i] = j + } + } +``` + -----------------------
From ef44e750cec20980095e63db3c090c8df48f620c Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Mon, 11 Apr 2022 20:34:32 +0100 Subject: [PATCH 03/22] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200376.=E6=91=86?= =?UTF-8?q?=E5=8A=A8=E5=BA=8F=E5=88=97.md=20C=E8=AF=AD=E8=A8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0376.摆动序列.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/problems/0376.摆动序列.md b/problems/0376.摆动序列.md index 5076c9ad..6bd2277f 100644 --- a/problems/0376.摆动序列.md +++ b/problems/0376.摆动序列.md @@ -298,5 +298,32 @@ var wiggleMaxLength = function(nums) { }; ``` +### C +**贪心** +```c +int wiggleMaxLength(int* nums, int numsSize){ + if(numsSize <= 1) + return numsSize; + + int length = 1; + int preDiff , curDiff; + preDiff = curDiff = 0; + for(int i = 0; i < numsSize - 1; ++i) { + // 计算当前i元素与i+1元素差值 + curDiff = nums[i+1] - nums[i]; + + // 若preDiff与curDiff符号不符,则子序列长度+1。更新preDiff的符号 + // 若preDiff与curDiff符号一致,当前i元素为连续升序/连续降序子序列的中间元素。不被记录入长度 + // 注:当preDiff为0时,curDiff为正或为负都属于符号不同 + if((curDiff > 0 && preDiff <= 0) || (preDiff >= 0 && curDiff < 0)) { + preDiff = curDiff; + length++; + } + } + + return length; +} +``` + -----------------------
From 54d0d9d1c1a579e0a8750f1be864ad78b8d13c45 Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Tue, 12 Apr 2022 10:43:46 +0100 Subject: [PATCH 04/22] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200053.=E6=9C=80?= =?UTF-8?q?=E5=A4=A7=E5=AD=90=E6=95=B0=E7=BB=84=E5=92=8C.md=20C=E8=AF=AD?= =?UTF-8?q?=E8=A8=80=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0053.最大子序和.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/problems/0053.最大子序和.md b/problems/0053.最大子序和.md index 3d11c91e..9af02edf 100644 --- a/problems/0053.最大子序和.md +++ b/problems/0053.最大子序和.md @@ -230,6 +230,24 @@ var maxSubArray = function(nums) { }; ``` +### C: +```c +int maxSubArray(int* nums, int numsSize){ + int maxVal = INT_MIN; + int subArrSum = 0; + + int i; + for(i = 0; i < numsSize; ++i) { + subArrSum += nums[i]; + // 若当前局部和大于之前的最大结果,对结果进行更新 + maxVal = subArrSum > maxVal ? subArrSum : maxVal; + // 若当前局部和为负,对结果无益。则从nums[i+1]开始应重新计算。 + subArrSum = subArrSum < 0 ? 0 : subArrSum; + } + + return maxVal; +} +``` ----------------------- From af724ef6d5ed95c4ba545a932f8257b487648aec Mon Sep 17 00:00:00 2001 From: xuerbujia <83055661+xuerbujia@users.noreply.github.com> Date: Tue, 12 Apr 2022 17:45:50 +0800 Subject: [PATCH 05/22] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880143.=E9=87=8D?= =?UTF-8?q?=E6=8E=92=E9=93=BE=E8=A1=A8.md=EF=BC=89=EF=BC=9A=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0go=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0143.重排链表.md | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/problems/0143.重排链表.md b/problems/0143.重排链表.md index 00622623..790bcb48 100644 --- a/problems/0143.重排链表.md +++ b/problems/0143.重排链表.md @@ -336,7 +336,33 @@ class Solution: return pre ``` ### Go - +```go +# 方法三 分割链表 +func reorderList(head *ListNode) { + var slow=head + var fast=head + for fast!=nil&&fast.Next!=nil{ + slow=slow.Next + fast=fast.Next.Next + } //双指针将链表分为左右两部分 + var right =new(ListNode) + for slow!=nil{ + temp:=slow.Next + slow.Next=right.Next + right.Next=slow + slow=temp + } //翻转链表右半部分 + right=right.Next //right为反转后得右半部分 + h:=head + for right.Next!=nil{ + temp:=right.Next + right.Next=h.Next + h.Next=right + h=h.Next.Next + right=temp + } //将左右两部分重新组合 +} +``` ### JavaScript ```javascript From dd63a865717b0a439cc2ce2b5abab0a55d18d7de Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Tue, 12 Apr 2022 11:01:53 +0100 Subject: [PATCH 06/22] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200053.=E6=9C=80?= =?UTF-8?q?=E5=A4=A7=E5=AD=90=E6=95=B0=E7=BB=84=E5=92=8C.md=20C=E8=AF=AD?= =?UTF-8?q?=E8=A8=80=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0053.最大子序和.md | 34 ++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/problems/0053.最大子序和.md b/problems/0053.最大子序和.md index 9af02edf..3d4459a3 100644 --- a/problems/0053.最大子序和.md +++ b/problems/0053.最大子序和.md @@ -231,6 +231,7 @@ var maxSubArray = function(nums) { ``` ### C: +贪心: ```c int maxSubArray(int* nums, int numsSize){ int maxVal = INT_MIN; @@ -249,6 +250,39 @@ int maxSubArray(int* nums, int numsSize){ } ``` +动态规划: +```c +/** + * 解题思路:动态规划: + * 1. dp数组:dp[i]表示从0到i的子序列中最大序列和的值 + * 2. 递推公式:dp[i] = max(dp[i-1] + nums[i], nums[i]) + 若dp[i-1]<0,对最后结果无益。dp[i]则为nums[i]。 + * 3. dp数组初始化:dp[0]的最大子数组和为nums[0] + * 4. 推导顺序:从前往后遍历 + */ + +#define max(a, b) (((a) > (b)) ? (a) : (b)) + +int maxSubArray(int* nums, int numsSize){ + int dp[numsSize]; + // dp[0]最大子数组和为nums[0] + dp[0] = nums[0]; + // 若numsSize为1,应直接返回nums[0] + int subArrSum = nums[0]; + + int i; + for(i = 1; i < numsSize; ++i) { + dp[i] = max(dp[i - 1] + nums[i], nums[i]); + + // 若dp[i]大于之前记录的最大值,进行更新 + if(dp[i] > subArrSum) + subArrSum = dp[i]; + } + + return subArrSum; +} +``` + -----------------------
From 1b935259a6c83beab9f730059da4bec509bb1f61 Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Tue, 12 Apr 2022 21:01:23 +0100 Subject: [PATCH 07/22] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200122.=E4=B9=B0?= =?UTF-8?q?=E8=82=A1=E7=A5=A8=E7=9A=84=E6=9C=80=E4=BD=B3=E6=97=B6=E6=9C=BA?= =?UTF-8?q?II.md=20C=E8=AF=AD=E8=A8=80=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92?= =?UTF-8?q?=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0122.买卖股票的最佳时机II.md | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/problems/0122.买卖股票的最佳时机II.md b/problems/0122.买卖股票的最佳时机II.md index 83b852c6..1b84f728 100644 --- a/problems/0122.买卖股票的最佳时机II.md +++ b/problems/0122.买卖股票的最佳时机II.md @@ -269,7 +269,7 @@ const maxProfit = (prices) => { ``` C: - +贪心: ```c int maxProfit(int* prices, int pricesSize){ int result = 0; @@ -284,5 +284,27 @@ int maxProfit(int* prices, int pricesSize){ } ``` +动态规划: +```c +#define max(a, b) (((a) > (b)) ? (a) : (b)) + +int maxProfit(int* prices, int pricesSize){ + int dp[pricesSize][2]; + dp[0][0] = 0 - prices[0]; + dp[0][1] = 0; + + int i; + for(i = 1; i < pricesSize; ++i) { + // dp[i][0]为i-1天持股的钱数/在第i天用i-1天的钱买入的最大值。 + // 若i-1天持股,且第i天买入股票比i-1天持股时更亏,说明应在i-1天时持股 + dp[i][0] = max(dp[i-1][0], dp[i-1][1] - prices[i]); + //dp[i][1]为i-1天不持股钱数/在第i天卖出所持股票dp[i-1][0] + prices[i]的最大值 + dp[i][1] = max(dp[i-1][1], dp[i-1][0] + prices[i]); + } + // 返回在最后一天不持股时的钱数(将股票卖出后钱最大化) + return dp[pricesSize - 1][1]; +} +``` + -----------------------
From 0fc1cb334d4f8612e95eabfc9e97fe8d273dc25e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E4=BB=A4=E4=BB=A4?= Date: Wed, 13 Apr 2022 15:51:42 +0800 Subject: [PATCH 08/22] =?UTF-8?q?Update=200459.=E9=87=8D=E5=A4=8D=E7=9A=84?= =?UTF-8?q?=E5=AD=90=E5=AD=97=E7=AC=A6=E4=B8=B2.md=20=E6=B7=BB=E5=8A=A0swi?= =?UTF-8?q?ft=E6=96=B9=E6=B3=95(=E5=89=8D=E7=BC=80=E8=A1=A8=E7=BB=9F?= =?UTF-8?q?=E4=B8=80=E4=B8=8D=E5=87=8F=E4=B8=80)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0459.重复的子字符串.md | 40 ++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/problems/0459.重复的子字符串.md b/problems/0459.重复的子字符串.md index 6a9b4260..f2fe728d 100644 --- a/problems/0459.重复的子字符串.md +++ b/problems/0459.重复的子字符串.md @@ -463,6 +463,46 @@ Swift: } } ``` +> 前缀表统一不减一 +```swift + func repeatedSubstringPattern(_ s: String) -> Bool { + + let sArr = Array(s) + let len = sArr.count + if len == 0 { + return false + } + + var next = Array.init(repeating: 0, count: len) + getNext(&next, sArr) + + if next[len-1] != 0 && len % (len - next[len-1]) == 0 { + return true + } + + return false + } + + // 前缀表不减一 + func getNext(_ next: inout [Int], _ sArr:[Character]) { + + var j = 0 + next[0] = 0 + + for i in 1 ..< sArr.count { + while j > 0 && sArr[i] != sArr[j] { + j = next[j-1] + } + + if sArr[i] == sArr[j] { + j += 1 + } + + next[i] = j + } + } + +``` -----------------------
From cfb8ab8b936418f6b446bad655be491f9159be14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E4=BB=A4=E4=BB=A4?= Date: Wed, 13 Apr 2022 16:01:26 +0800 Subject: [PATCH 09/22] Revert "Merge branch 'youngyangyang04:master' into master" This reverts commit 33be177e63bc622c4e1e67d9e268bc13d4d5ba54, reversing changes made to 559f03c92869ca55ae929d66de872f5ddda70567. --- problems/0332.重新安排行程.md | 58 ----------------------------- 1 file changed, 58 deletions(-) diff --git a/problems/0332.重新安排行程.md b/problems/0332.重新安排行程.md index 041a7f03..01f81c4d 100644 --- a/problems/0332.重新安排行程.md +++ b/problems/0332.重新安排行程.md @@ -342,64 +342,6 @@ class Solution: return path ``` -### Go -```go -type pair struct { - target string - visited bool -} -type pairs []*pair - -func (p pairs) Len() int { - return len(p) -} -func (p pairs) Swap(i, j int) { - p[i], p[j] = p[j], p[i] -} -func (p pairs) Less(i, j int) bool { - return p[i].target < p[j].target -} - -func findItinerary(tickets [][]string) []string { - result := []string{} - // map[出发机场] pair{目的地,是否被访问过} - targets := make(map[string]pairs) - for _, ticket := range tickets { - if targets[ticket[0]] == nil { - targets[ticket[0]] = make(pairs, 0) - } - targets[ticket[0]] = append(targets[ticket[0]], &pair{target: ticket[1], visited: false}) - } - for k, _ := range targets { - sort.Sort(targets[k]) - } - result = append(result, "JFK") - var backtracking func() bool - backtracking = func() bool { - if len(tickets)+1 == len(result) { - return true - } - // 取出起飞航班对应的目的地 - for _, pair := range targets[result[len(result)-1]] { - if pair.visited == false { - result = append(result, pair.target) - pair.visited = true - if backtracking() { - return true - } - result = result[:len(result)-1] - pair.visited = false - } - } - return false - } - - backtracking() - - return result -} -``` - ### C语言 ```C From efe987be6b6a9cdc908d836e86954aab22227da7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E4=BB=A4=E4=BB=A4?= Date: Wed, 13 Apr 2022 16:07:23 +0800 Subject: [PATCH 10/22] =?UTF-8?q?Revert=20"Update=200459.=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E7=9A=84=E5=AD=90=E5=AD=97=E7=AC=A6=E4=B8=B2.md=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0swift=E6=96=B9=E6=B3=95(=E5=89=8D=E7=BC=80?= =?UTF-8?q?=E8=A1=A8=E7=BB=9F=E4=B8=80=E4=B8=8D=E5=87=8F=E4=B8=80)"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 0fc1cb334d4f8612e95eabfc9e97fe8d273dc25e. --- problems/0459.重复的子字符串.md | 40 -------------------------- 1 file changed, 40 deletions(-) diff --git a/problems/0459.重复的子字符串.md b/problems/0459.重复的子字符串.md index f2fe728d..6a9b4260 100644 --- a/problems/0459.重复的子字符串.md +++ b/problems/0459.重复的子字符串.md @@ -463,46 +463,6 @@ Swift: } } ``` -> 前缀表统一不减一 -```swift - func repeatedSubstringPattern(_ s: String) -> Bool { - - let sArr = Array(s) - let len = sArr.count - if len == 0 { - return false - } - - var next = Array.init(repeating: 0, count: len) - getNext(&next, sArr) - - if next[len-1] != 0 && len % (len - next[len-1]) == 0 { - return true - } - - return false - } - - // 前缀表不减一 - func getNext(_ next: inout [Int], _ sArr:[Character]) { - - var j = 0 - next[0] = 0 - - for i in 1 ..< sArr.count { - while j > 0 && sArr[i] != sArr[j] { - j = next[j-1] - } - - if sArr[i] == sArr[j] { - j += 1 - } - - next[i] = j - } - } - -``` -----------------------
From a391c2c949c393141e7aed3d1e8cdbf6b6a0b956 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E4=BB=A4=E4=BB=A4?= Date: Wed, 13 Apr 2022 16:10:50 +0800 Subject: [PATCH 11/22] =?UTF-8?q?Update=200459.=E9=87=8D=E5=A4=8D=E7=9A=84?= =?UTF-8?q?=E5=AD=90=E5=AD=97=E7=AC=A6=E4=B8=B2.md=20=E6=B7=BB=E5=8A=A0swi?= =?UTF-8?q?ft=E6=96=B9=E6=B3=95(=E5=89=8D=E7=BC=80=E8=A1=A8=E7=BB=9F?= =?UTF-8?q?=E4=B8=80=E4=B8=8D=E5=87=8F=E4=B8=80)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0459.重复的子字符串.md | 41 ++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/problems/0459.重复的子字符串.md b/problems/0459.重复的子字符串.md index 6a9b4260..a51c68ee 100644 --- a/problems/0459.重复的子字符串.md +++ b/problems/0459.重复的子字符串.md @@ -464,5 +464,46 @@ Swift: } ``` +> 前缀表统一不减一 +```swift + func repeatedSubstringPattern(_ s: String) -> Bool { + + let sArr = Array(s) + let len = sArr.count + if len == 0 { + return false + } + + var next = Array.init(repeating: 0, count: len) + getNext(&next, sArr) + + if next[len-1] != 0 && len % (len - next[len-1]) == 0 { + return true + } + + return false + } + + // 前缀表不减一 + func getNext(_ next: inout [Int], _ sArr:[Character]) { + + var j = 0 + next[0] = 0 + + for i in 1 ..< sArr.count { + + while j > 0 && sArr[i] != sArr[j] { + j = next[j-1] + } + + if sArr[i] == sArr[j] { + j += 1 + } + + next[i] = j + } + } +``` + -----------------------
From e1abedc13ad4d5f744ecc27fa9931aa24508364b Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Wed, 13 Apr 2022 09:41:50 +0100 Subject: [PATCH 12/22] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200055.=E8=B7=B3?= =?UTF-8?q?=E8=B7=83=E6=B8=B8=E6=88=8F.md=20C=E8=AF=AD=E8=A8=80=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0055.跳跃游戏.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/problems/0055.跳跃游戏.md b/problems/0055.跳跃游戏.md index c0890f75..4ba0c03b 100644 --- a/problems/0055.跳跃游戏.md +++ b/problems/0055.跳跃游戏.md @@ -154,6 +154,28 @@ var canJump = function(nums) { }; ``` +### C +```c +#define max(a, b) (((a) > (b)) ? (a) : (b)) + +bool canJump(int* nums, int numsSize){ + int cover = 0; + + int i; + // 只可能获取cover范围中的步数,所以i<=cover + for(i = 0; i <= cover; ++i) { + // 更新cover为从i出发能到达的最大值/cover的值中较大值 + cover = max(i + nums[i], cover); + + // 若更新后cover可以到达最后的元素,返回true + if(cover >= numsSize - 1) + return true; + } + + return false; +} +``` + -----------------------
From b73a7da7585b03b42ab51515f5463259ac2e0631 Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Fri, 15 Apr 2022 18:25:41 +0100 Subject: [PATCH 13/22] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=201005.K=E6=AC=A1?= =?UTF-8?q?=E5=8F=96=E5=8F=8D=E5=90=8E=E6=9C=80=E5=A4=A7=E5=8C=96=E7=9A=84?= =?UTF-8?q?=E6=95=B0=E7=BB=84=E5=92=8C.md=20C=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...1005.K次取反后最大化的数组和.md | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/problems/1005.K次取反后最大化的数组和.md b/problems/1005.K次取反后最大化的数组和.md index 45f186e2..0d122d91 100644 --- a/problems/1005.K次取反后最大化的数组和.md +++ b/problems/1005.K次取反后最大化的数组和.md @@ -211,5 +211,44 @@ var largestSumAfterKNegations = function(nums, k) { }; ``` +### C +```c +#define abs(a) (((a) > 0) ? (a) : (-(a))) + +// 对数组求和 +int sum(int *nums, int numsSize) { + int sum = 0; + + int i; + for(i = 0; i < numsSize; ++i) { + sum += nums[i]; + } + return sum; +} + +int cmp(const void* v1, const void* v2) { + return abs(*(int*)v2) - abs(*(int*)v1); +} + +int largestSumAfterKNegations(int* nums, int numsSize, int k){ + qsort(nums, numsSize, sizeof(int), cmp); + + int i; + for(i = 0; i < numsSize; ++i) { + // 遍历数组,若当前元素<0则将当前元素转变,k-- + if(nums[i] < 0 && k > 0) { + nums[i] *= -1; + --k; + } + } + + // 若遍历完数组后k还有剩余(此时所有元素应均为正),则将绝对值最小的元素nums[numsSize - 1]变为负 + if(k % 2 == 1) + nums[numsSize - 1] *= -1; + + return sum(nums, numsSize); +} +``` + -----------------------
From 7c26aba0e1d9ba38a631eb5dbae8577890deb2d2 Mon Sep 17 00:00:00 2001 From: Falldio <1031249495@qq.com> Date: Sun, 17 Apr 2022 11:59:30 +0800 Subject: [PATCH 14/22] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880209.=E9=95=BF?= =?UTF-8?q?=E5=BA=A6=E6=9C=80=E5=B0=8F=E7=9A=84=E5=AD=90=E6=95=B0=E7=BB=84?= =?UTF-8?q?.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0Kotlin=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0209.长度最小的子数组.md | 31 +++++++++++++++++++---- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/problems/0209.长度最小的子数组.md b/problems/0209.长度最小的子数组.md index 82a11381..fd72cf1b 100644 --- a/problems/0209.长度最小的子数组.md +++ b/problems/0209.长度最小的子数组.md @@ -198,7 +198,7 @@ JavaScript: var minSubArrayLen = function(target, nums) { // 长度计算一次 const len = nums.length; - let l = r = sum = 0, + let l = r = sum = 0, res = len + 1; // 子数组最大不会超过自身 while(r < len) { sum += nums[r++]; @@ -260,12 +260,12 @@ Rust: ```rust impl Solution { - pub fn min_sub_array_len(target: i32, nums: Vec) -> i32 { + pub fn min_sub_array_len(target: i32, nums: Vec) -> i32 { let (mut result, mut subLength): (i32, i32) = (i32::MAX, 0); let (mut sum, mut i) = (0, 0); - + for (pos, val) in nums.iter().enumerate() { - sum += val; + sum += val; while sum >= target { subLength = (pos - i + 1) as i32; if result > subLength { @@ -364,7 +364,7 @@ int minSubArrayLen(int target, int* nums, int numsSize){ int minLength = INT_MAX; int sum = 0; - int left = 0, right = 0; + int left = 0, right = 0; //右边界向右扩展 for(; right < numsSize; ++right) { sum += nums[right]; @@ -380,5 +380,26 @@ int minSubArrayLen(int target, int* nums, int numsSize){ } ``` +Kotlin: +```kotlin +class Solution { + fun minSubArrayLen(target: Int, nums: IntArray): Int { + var start = 0 + var end = 0 + var ret = Int.MAX_VALUE + var count = 0 + while (end < nums.size) { + count += nums[end] + while (count >= target) { + ret = if (ret > (end - start + 1)) end - start + 1 else ret + count -= nums[start++] + } + end++ + } + return if (ret == Int.MAX_VALUE) 0 else ret + } +} +``` + -----------------------
From 0375a5b147c40a449c04ef7f988dfcb2d93b9e01 Mon Sep 17 00:00:00 2001 From: Guacker <92098421+Guacker@users.noreply.github.com> Date: Sun, 17 Apr 2022 17:19:00 +0800 Subject: [PATCH 15/22] =?UTF-8?q?Update=20=E4=BA=8C=E5=8F=89=E6=A0=91?= =?UTF-8?q?=E7=9A=84=E9=80=92=E5=BD=92=E9=81=8D=E5=8E=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改了c语言实现的先序遍历函数名 和内部调用时用的函数名 及在preorderTraversal中的调用先序遍历操作的函数名 --- problems/二叉树的递归遍历.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/problems/二叉树的递归遍历.md b/problems/二叉树的递归遍历.md index 35d19d7b..612f2394 100644 --- a/problems/二叉树的递归遍历.md +++ b/problems/二叉树的递归遍历.md @@ -371,18 +371,18 @@ C: ```c //前序遍历: -void preOrderTraversal(struct TreeNode* root, int* ret, int* returnSize) { +void preOrder(struct TreeNode* root, int* ret, int* returnSize) { if(root == NULL) return; ret[(*returnSize)++] = root->val; - preOrderTraverse(root->left, ret, returnSize); - preOrderTraverse(root->right, ret, returnSize); + preOrder(root->left, ret, returnSize); + preOrder(root->right, ret, returnSize); } int* preorderTraversal(struct TreeNode* root, int* returnSize){ int* ret = (int*)malloc(sizeof(int) * 100); *returnSize = 0; - preOrderTraversal(root, ret, returnSize); + preOrder(root, ret, returnSize); return ret; } From db84840986aab5ce791230eba963084bf1d5ba4b Mon Sep 17 00:00:00 2001 From: GitHubQAQ <31883473+GitHubQAQ@users.noreply.github.com> Date: Tue, 19 Apr 2022 14:23:08 +0800 Subject: [PATCH 16/22] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=A2=84=E5=88=A4?= =?UTF-8?q?=E6=96=AD=E9=95=BF=E5=BA=A6=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在magazine中字符存入数组前,预先判断ransomNote和magazine的相对长度,进行处理。 --- problems/0383.赎金信.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/problems/0383.赎金信.md b/problems/0383.赎金信.md index 00707347..5d9e8295 100644 --- a/problems/0383.赎金信.md +++ b/problems/0383.赎金信.md @@ -84,6 +84,10 @@ class Solution { public: bool canConstruct(string ransomNote, string magazine) { int record[26] = {0}; + //add + if (ransomNote.size() > magazine.size()) { + return false; + } for (int i = 0; i < magazine.length(); i++) { // 通过recode数据记录 magazine里各个字符出现次数 record[magazine[i]-'a'] ++; From 68e47dc4b30ffe38d1a26bb5104614f2f1cc067a Mon Sep 17 00:00:00 2001 From: Steve2020 <841532108@qq.com> Date: Tue, 19 Apr 2022 17:10:20 +0800 Subject: [PATCH 17/22] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880452.=E7=94=A8?= =?UTF-8?q?=E6=9C=80=E5=B0=91=E6=95=B0=E9=87=8F=E7=9A=84=E7=AE=AD=E5=BC=95?= =?UTF-8?q?=E7=88=86=E6=B0=94=E7=90=83.md=EF=BC=89=EF=BC=9A=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0typescript=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0452.用最少数量的箭引爆气球.md | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/problems/0452.用最少数量的箭引爆气球.md b/problems/0452.用最少数量的箭引爆气球.md index 33bbad55..2ab14b61 100644 --- a/problems/0452.用最少数量的箭引爆气球.md +++ b/problems/0452.用最少数量的箭引爆气球.md @@ -193,7 +193,7 @@ func min(a,b int) int{ } return a } -``` +``` ### Javascript ```Javascript @@ -214,7 +214,31 @@ var findMinArrowShots = function(points) { }; ``` +### TypeScript + +```typescript +function findMinArrowShots(points: number[][]): number { + const length: number = points.length; + if (length === 0) return 0; + points.sort((a, b) => a[0] - b[0]); + let resCount: number = 1; + let right: number = points[0][1]; // 右边界 + let tempPoint: number[]; + for (let i = 1; i < length; i++) { + tempPoint = points[i]; + if (tempPoint[0] > right) { + resCount++; + right = tempPoint[1]; + } else { + right = Math.min(right, tempPoint[1]); + } + } + return resCount; +}; +``` + ### C + ```c int cmp(const void *a,const void *b) { From 84f41f6685e744b138890cf7143ed3069a02a78e Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Tue, 19 Apr 2022 17:00:17 +0100 Subject: [PATCH 18/22] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200135.=E5=88=86?= =?UTF-8?q?=E5=8F=91=E7=B3=96=E6=9E=9C.md=20C=E8=AF=AD=E8=A8=80=E8=A7=A3?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0135.分发糖果.md | 41 +++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/problems/0135.分发糖果.md b/problems/0135.分发糖果.md index ccdabc16..27071aee 100644 --- a/problems/0135.分发糖果.md +++ b/problems/0135.分发糖果.md @@ -238,6 +238,47 @@ var candy = function(ratings) { }; ``` +### C +```c +#define max(a, b) (((a) > (b)) ? (a) : (b)) + +int *initCandyArr(int size) { + int *candyArr = (int*)malloc(sizeof(int) * size); + + int i; + for(i = 0; i < size; ++i) + candyArr[i] = 1; + + return candyArr; +} + +int candy(int* ratings, int ratingsSize){ + // 初始化数组,每个小孩开始至少有一颗糖 + int *candyArr = initCandyArr(ratingsSize); + + int i; + // 先判断右边是否比左边评分高。若是,右边孩子的糖果为左边孩子+1(candyArr[i] = candyArr[i - 1] + 1) + for(i = 1; i < ratingsSize; ++i) { + if(ratings[i] > ratings[i - 1]) + candyArr[i] = candyArr[i - 1] + 1; + } + + // 再判断左边评分是否比右边高。 + // 若是,左边孩子糖果为右边孩子糖果+1/自己所持糖果最大值。(若糖果已经比右孩子+1多,则不需要更多糖果) + // 举例:ratings为[1, 2, 3, 1]。此时评分为3的孩子在判断右边比左边大后为3,虽然它比最末尾的1(ratings[3])大,但是candyArr[3]为1。所以不必更新candyArr[2] + for(i = ratingsSize - 2; i >= 0; --i) { + if(ratings[i] > ratings[i + 1]) + candyArr[i] = max(candyArr[i], candyArr[i + 1] + 1); + } + + // 求出糖果之和 + int result = 0; + for(i = 0; i < ratingsSize; ++i) { + result += candyArr[i]; + } + return result; +} +``` -----------------------
From b5f11af3edc66af674d486ace76cde8a99637170 Mon Sep 17 00:00:00 2001 From: zhenyu <48195906+szluyu99@users.noreply.github.com> Date: Wed, 20 Apr 2022 23:56:20 +0800 Subject: [PATCH 19/22] =?UTF-8?q?Update=20=E8=83=8C=E5=8C=85=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80=E5=AE=8C=E5=85=A8?= =?UTF-8?q?=E8=83=8C=E5=8C=85.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/背包问题理论基础完全背包.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/背包问题理论基础完全背包.md b/problems/背包问题理论基础完全背包.md index faa1dc46..3ec399f1 100644 --- a/problems/背包问题理论基础完全背包.md +++ b/problems/背包问题理论基础完全背包.md @@ -37,7 +37,7 @@ * [动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html) 首先在回顾一下01背包的核心代码 -``` +```cpp for(int i = 0; i < weight.size(); i++) { // 遍历物品 for(int j = bagWeight; j >= weight[i]; j--) { // 遍历背包容量 dp[j] = max(dp[j], dp[j - weight[i]] + value[i]); From dac0b4a12e43670eb54eaa6da5fa3f07cb707424 Mon Sep 17 00:00:00 2001 From: GitHubQAQ <31883473+GitHubQAQ@users.noreply.github.com> Date: Fri, 29 Apr 2022 21:03:27 +0800 Subject: [PATCH 20/22] =?UTF-8?q?Update=200106.=E4=BB=8E=E4=B8=AD=E5=BA=8F?= =?UTF-8?q?=E4=B8=8E=E5=90=8E=E5=BA=8F=E9=81=8D=E5=8E=86=E5=BA=8F=E5=88=97?= =?UTF-8?q?=E6=9E=84=E9=80=A0=E4=BA=8C=E5=8F=89=E6=A0=91.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 优化代码高亮 --- .../0106.从中序与后序遍历序列构造二叉树.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/problems/0106.从中序与后序遍历序列构造二叉树.md b/problems/0106.从中序与后序遍历序列构造二叉树.md index 496de431..4396bc76 100644 --- a/problems/0106.从中序与后序遍历序列构造二叉树.md +++ b/problems/0106.从中序与后序遍历序列构造二叉树.md @@ -103,7 +103,7 @@ TreeNode* traversal (vector& inorder, vector& postorder) { 中序数组相对比较好切,找到切割点(后序数组的最后一个元素)在中序数组的位置,然后切割,如下代码中我坚持左闭右开的原则: -```C++ +```CPP // 找到中序遍历的切割点 int delimiterIndex; for (delimiterIndex = 0; delimiterIndex < inorder.size(); delimiterIndex++) { @@ -130,7 +130,7 @@ vector rightInorder(inorder.begin() + delimiterIndex + 1, inorder.end() ); 代码如下: -``` +```CPP // postorder 舍弃末尾元素,因为这个元素就是中间节点,已经用过了 postorder.resize(postorder.size() - 1); @@ -144,7 +144,7 @@ vector rightPostorder(postorder.begin() + leftInorder.size(), postorder.end 接下来可以递归了,代码如下: -``` +```CPP root->left = traversal(leftInorder, leftPostorder); root->right = traversal(rightInorder, rightPostorder); ``` From 132e57e2ddd801d7360401e746d945957c7e0801 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E4=BB=A4=E4=BB=A4?= Date: Sat, 7 May 2022 09:57:27 +0800 Subject: [PATCH 21/22] =?UTF-8?q?Update=200332.=E9=87=8D=E6=96=B0=E5=AE=89?= =?UTF-8?q?=E6=8E=92=E8=A1=8C=E7=A8=8B.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 恢复0332 原go代码 --- problems/0332.重新安排行程.md | 58 +++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/problems/0332.重新安排行程.md b/problems/0332.重新安排行程.md index d087d97b..c71b2a93 100644 --- a/problems/0332.重新安排行程.md +++ b/problems/0332.重新安排行程.md @@ -342,6 +342,64 @@ class Solution: return path ``` +### GO +```go +type pair struct { + target string + visited bool +} +type pairs []*pair + +func (p pairs) Len() int { + return len(p) +} +func (p pairs) Swap(i, j int) { + p[i], p[j] = p[j], p[i] +} +func (p pairs) Less(i, j int) bool { + return p[i].target < p[j].target +} + +func findItinerary(tickets [][]string) []string { + result := []string{} + // map[出发机场] pair{目的地,是否被访问过} + targets := make(map[string]pairs) + for _, ticket := range tickets { + if targets[ticket[0]] == nil { + targets[ticket[0]] = make(pairs, 0) + } + targets[ticket[0]] = append(targets[ticket[0]], &pair{target: ticket[1], visited: false}) + } + for k, _ := range targets { + sort.Sort(targets[k]) + } + result = append(result, "JFK") + var backtracking func() bool + backtracking = func() bool { + if len(tickets)+1 == len(result) { + return true + } + // 取出起飞航班对应的目的地 + for _, pair := range targets[result[len(result)-1]] { + if pair.visited == false { + result = append(result, pair.target) + pair.visited = true + if backtracking() { + return true + } + result = result[:len(result)-1] + pair.visited = false + } + } + return false + } + + backtracking() + + return result +} +``` + ### C语言 ```C From 29f41716f971506a001e8eb369b3f62964b43e8e Mon Sep 17 00:00:00 2001 From: GitHubQAQ <31883473+GitHubQAQ@users.noreply.github.com> Date: Sat, 7 May 2022 10:12:58 +0800 Subject: [PATCH 22/22] =?UTF-8?q?Update=200093.=E5=A4=8D=E5=8E=9FIP?= =?UTF-8?q?=E5=9C=B0=E5=9D=80.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 优化C++版本剪枝 当字符串长度小于4时,无法组成正确的IP地址,直接返回。 关于判断是否为数字的部分,是否有必要(题目明确说明s仅由数字组成) [从解题角度可以删去,保留的话增加容错,个人意见] --- problems/0093.复原IP地址.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/0093.复原IP地址.md b/problems/0093.复原IP地址.md index 7910fc50..6401824b 100644 --- a/problems/0093.复原IP地址.md +++ b/problems/0093.复原IP地址.md @@ -227,7 +227,7 @@ private: public: vector restoreIpAddresses(string s) { result.clear(); - if (s.size() > 12) return result; // 算是剪枝了 + if (s.size() < 4 || s.size() > 12) return result; // 算是剪枝了 backtracking(s, 0, 0); return result; }