From be40b09991fed2d2f2612c24c8cb5115c2fcb7b0 Mon Sep 17 00:00:00 2001
From: yqq
Date: Mon, 14 Jun 2021 16:34:46 +0800
Subject: [PATCH 0001/3468] adddddd
---
...64\242\346\217\222\345\205\245\344\275\215\347\275\256.md" | 4 ++--
...05\250\350\203\214\345\214\205\347\211\210\346\234\254.md" | 3 ++-
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md"
index e891e3c519..a8da304544 100644
--- "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md"
+++ "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md"
@@ -76,7 +76,7 @@ public:
```
时间复杂度:O(n)
-时间复杂度:O(1)
+空间复杂度:O(1)
效率如下:
@@ -158,7 +158,7 @@ public:
**大家要仔细看注释,思考为什么要写while (left < right), 为什么要写right = middle**。
-```
+```cpp
class Solution {
public:
int searchInsert(vector& nums, int target) {
diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md"
index d6b1245083..f92e6716c5 100644
--- "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md"
+++ "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md"
@@ -88,7 +88,8 @@
以上分析完毕,C++代码如下:
-```
+
+```cpp
class Solution {
public:
int climbStairs(int n) {
From 1aab307ed7a0e9c539bc450fdf7fbdc3082a1b67 Mon Sep 17 00:00:00 2001
From: Eyjan_Huang <81480748+Eyjan-Huang@users.noreply.github.com>
Date: Sat, 14 Aug 2021 23:18:15 +0800
Subject: [PATCH 0002/3468] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E9=9D=A2?=
=?UTF-8?q?=E8=AF=95=E9=A2=9802.07=20=E9=93=BE=E8=A1=A8=E7=9B=B8=E4=BA=A4p?=
=?UTF-8?q?ython=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
用更简单的逻辑完成这道题。
---
...76\350\241\250\347\233\270\344\272\244.md" | 37 ++++++-------------
1 file changed, 12 insertions(+), 25 deletions(-)
diff --git "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md"
index 9acda71ce6..8c3a583139 100644
--- "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md"
+++ "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md"
@@ -160,34 +160,21 @@ Python:
class Solution:
def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
- lengthA,lengthB = 0,0
- curA,curB = headA,headB
- while(curA!=None): #求链表A的长度
- curA = curA.next
- lengthA +=1
-
- while(curB!=None): #求链表B的长度
- curB = curB.next
- lengthB +=1
-
- curA, curB = headA, headB
+ """
+ 根据快慢法则,走的快的一定会追上走得慢的。
+ 在这道题里,有的链表短,他走完了就去走另一条链表,我们可以理解为走的快的指针。
- if lengthB>lengthA: #让curA为最长链表的头,lenA为其长度
- lengthA, lengthB = lengthB, lengthA
- curA, curB = curB, curA
+ 那么,只要其中一个链表走完了,就去走另一条链表的路。如果有交点,他们最终一定会在同一个
+ 位置相遇
+ """
+ cur_a, cur_b = headA, headB # 用两个指针代替a和b
- gap = lengthA - lengthB #求长度差
- while(gap!=0):
- curA = curA.next #让curA和curB在同一起点上
- gap -= 1
- while(curA!=None):
- if curA == curB:
- return curA
- else:
- curA = curA.next
- curB = curB.next
- return None
+ while cur_a != cur_b:
+ cur_a = cur_a.next if cur_a else headB # 如果a走完了,那么就切换到b走
+ cur_b = cur_b.next if cur_b else headA # 同理,b走完了就切换到a
+
+ return cur_a
```
Go:
From abb9cfd5be04acf55f41f0438abe43b587354b3e Mon Sep 17 00:00:00 2001
From: liyao <->
Date: Sat, 14 Aug 2021 16:24:20 +0100
Subject: [PATCH 0003/3468] =?UTF-8?q?=E6=9B=B4=E6=AD=A3=20=E6=9C=80?=
=?UTF-8?q?=E9=95=BF=E9=80=92=E5=A2=9E=E5=AD=90=E5=BA=8F=E5=88=97=20?=
=?UTF-8?q?=E7=AE=97=E6=B3=95=E5=A4=8D=E6=9D=82=E5=BA=A6=EF=BC=8C=E6=B7=BB?=
=?UTF-8?q?=E5=8A=A0O(nlogn)=E6=97=B6=E9=97=B4=E5=A4=8D=E6=9D=82=E5=BA=A6?=
=?UTF-8?q?=E7=AE=97=E6=B3=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...07\345\255\220\345\272\217\345\210\227.md" | 124 +++++++++++++++++-
1 file changed, 122 insertions(+), 2 deletions(-)
diff --git "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md"
index 57edd13ecf..1161e15898 100644
--- "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md"
+++ "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md"
@@ -33,7 +33,7 @@
* 1 <= nums.length <= 2500
* -10^4 <= nums[i] <= 104
-
+## 方法一 动态规划
## 思路
最长上升子序列是动规的经典题目,这里dp[i]是可以根据dp[j] (j < i)推导出来的,那么依然用动规五部曲来分析详细一波:
@@ -190,10 +190,130 @@ const lengthOfLIS = (nums) => {
};
```
*复杂度分析*
-- 时间复杂度:O(nlogn)。数组 nums 的长度为 n,我们依次用数组中的元素去更新 dp 数组,相当于插入最后递增的元素,而更新 dp 数组时需要进行 O(logn) 的二分搜索,所以总时间复杂度为 O(nlogn)。
+- 时间复杂度:O(n^2)。数组 nums 的长度为 n,我们依次用数组中的元素去遍历 dp 数组,而遍历 dp 数组时需要进行 O(n) 次搜索,所以总时间复杂度为 O(n^2)。
- 空间复杂度:O(n),需要额外使用长度为 n 的 dp 数组。
+## 方法二 贪心策略+二分搜索
+
+使用贪心策略和二分搜索可以进一步将算法时间复杂度将为O(nlogn)。
+
+## 思路
+
+为了使得到的子序列尽可能长,我们需要使序列上升得尽可能慢。
+
+对于长度为n的数组 nums,我们从0到n-1依次遍历数组中的每个元素nums[i],更新在0到i范围内最长上升子序列的长度len,以及 在0到i范围内,上升子序列的长度为1到len时,对应长度子序列最右端的最小值,将结果保存在list中。实际编码过程中,list长度即为len。
+
+## 可行性
+当我们遍历完数组nums中第n-1个元素时,list中保存的是0到n-1范围内最长上升子序列的长度,即为所求。
+
+## 算法复杂度分析
+1. list中的元素是单调递增的。可以用反证法来证明:假设对于0<=i=list[j],那么我们可以在list[j]对应的子序列中删除最后j-i个元素得到长度与list[i]相同的子序列,其最右端的值maxlist[len-1],此时,list中子序列长度为1到len的对应的最右端最小值不变,并新增长度为len+1的子序列,最右端的最小值为nums[i],时间复杂度O(1);
+
+ 2. if(nums[i]<=list[len-1]),此时,我们可以在0到len-1范围内找到k,list[k]为>=nums[i]的最小值,由于list单调递增,所以我们可以使用二分搜索在O(logn)的时间复杂度内找到k。
+ 1. 对于0<=jnums[i];
+
+3. 综上,算法时间复杂度为O(nlogn),空间复杂度为O(n),需要O(n)的空间保存list。
+
+代码如下
+
+Java
+```java
+class Solution {
+ public int lengthOfLIS(int[] nums) {
+ int n = nums.length;
+ if(n==0){return 0;}
+
+ List list=new ArrayList<>();
+ list.add(nums[0]);
+ for (int i = 1; i < n; ++i) {
+ if (nums[i] > list.get(list.size()-1)) {
+ list.add(nums[i]);
+ } else {
+ int k=binarySearch(list,nums[i]);
+ list.set(k,nums[i]);
+ }
+ }
+ return list.size();
+ }
+
+ int binarySearch(Listlist, int num){
+ int len=list.size();
+ int l=0,r=len-1,ans=len-1;
+ while(l<=r){
+ int mid=l+(r-l)/2;
+ if(list.get(mid) list[len-1]) {
+ list[len++]=nums[i];
+ } else {
+ int k=binarySearch(list,len,nums[i]);
+ list[k]=nums[i];
+ }
+ }
+ return len;
+ }
+
+ int binarySearch(int[] list,int len, int num){
+
+ int l=0,r=len-1,ans=len-1;
+ while(l<=r){
+ int mid=l+(r-l)/2;
+ if(list[mid]
Date: Sun, 15 Aug 2021 00:42:42 +0800
Subject: [PATCH 0004/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A00977=E6=9C=89?=
=?UTF-8?q?=E5=BA=8F=E6=95=B0=E7=BB=84=E7=9A=84=E5=B9=B3=E6=96=B9=20Ruby?=
=?UTF-8?q?=20=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...204\347\232\204\345\271\263\346\226\271.md" | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md"
index 9e71ec0d8c..71c4640198 100644
--- "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md"
+++ "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md"
@@ -252,6 +252,24 @@ func sortedSquares(_ nums: [Int]) -> [Int] {
}
```
+Ruby:
+
+```ruby
+def sorted_squares(nums)
+ left, right, result = 0, nums.size - 1, []
+ while left <= right
+ if nums[left]**2 > nums[right]**2
+ result << nums[left]**2
+ left += 1
+ else
+ result << nums[right]**2
+ right -= 1
+ end
+ end
+ result.reverse
+end
+```
+
-----------------------
From 12e1cd35441cdc6ca30a190eebd6cbe945a06f66 Mon Sep 17 00:00:00 2001
From: Steve0x2a
Date: Sun, 15 Aug 2021 13:33:14 +0800
Subject: [PATCH 0005/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A00724=E5=AF=BB?=
=?UTF-8?q?=E6=89=BE=E6=95=B0=E7=BB=84=E7=9A=84=E4=B8=AD=E5=BF=83=E7=B4=A2?=
=?UTF-8?q?=E5=BC=95=20Python=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...4\344\270\255\345\277\203\347\264\242\345\274\225.md" | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git "a/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" "b/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md"
index 3ed68d4705..052d4c02d7 100644
--- "a/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md"
+++ "b/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md"
@@ -90,6 +90,15 @@ class Solution {
## Python
```python
+class Solution:
+ def pivotIndex(self, nums: List[int]) -> int:
+ numSum = sum(nums) #数组总和
+ leftSum = 0
+ for i in range(len(nums)):
+ if numSum - leftSum -nums[i] == leftSum: #左右和相等
+ return i
+ leftSum += nums[i]
+ return -1
```
## Go
From 082e3ae66e2c36508aadfc4fea58a32fbf8b803f Mon Sep 17 00:00:00 2001
From: Steve0x2a
Date: Sun, 15 Aug 2021 13:58:49 +0800
Subject: [PATCH 0006/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A00922=E6=8C=89?=
=?UTF-8?q?=E5=A5=87=E5=81=B6=E6=8E=92=E5=BA=8F=E6=95=B0=E7=BB=84II=20Pyth?=
=?UTF-8?q?on=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...\345\272\217\346\225\260\347\273\204II.md" | 27 ++++++++++++++++++-
1 file changed, 26 insertions(+), 1 deletion(-)
diff --git "a/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md" "b/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md"
index 92db204d09..97d7091e42 100644
--- "a/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md"
+++ "b/problems/0922.\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204II.md"
@@ -149,7 +149,32 @@ class Solution {
## Python
-```python
+```python3
+#方法2
+class Solution:
+ def sortArrayByParityII(self, nums: List[int]) -> List[int]:
+ result = [0]*len(nums)
+ evenIndex = 0
+ oddIndex = 1
+ for i in range(len(nums)):
+ if nums[i] % 2: #奇数
+ result[oddIndex] = nums[i]
+ oddIndex += 2
+ else: #偶数
+ result[evenIndex] = nums[i]
+ evenIndex += 2
+ return result
+
+#方法3
+class Solution:
+ def sortArrayByParityII(self, nums: List[int]) -> List[int]:
+ oddIndex = 1
+ for i in range(0,len(nums),2): #步长为2
+ if nums[i] % 2: #偶数位遇到奇数
+ while nums[oddIndex] % 2: #奇数位找偶数
+ oddIndex += 2
+ nums[i], nums[oddIndex] = nums[oddIndex], nums[i]
+ return nums
```
## Go
From a108aadfb58516205cdc2d5b53406efea784e910 Mon Sep 17 00:00:00 2001
From: Steve0x2a
Date: Sun, 15 Aug 2021 14:15:43 +0800
Subject: [PATCH 0007/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A00234=E5=9B=9E?=
=?UTF-8?q?=E6=96=87=E9=93=BE=E8=A1=A8=20Python=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...36\346\226\207\351\223\276\350\241\250.md" | 57 ++++++++++++++++++-
1 file changed, 56 insertions(+), 1 deletion(-)
diff --git "a/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" "b/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md"
index 6a24b1d09c..b3ad899caa 100644
--- "a/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md"
+++ "b/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md"
@@ -148,7 +148,62 @@ public:
## Python
-```python
+```python3
+#数组模拟
+class Solution:
+ def isPalindrome(self, head: ListNode) -> bool:
+ length = 0
+ tmp = head
+ while tmp: #求链表长度
+ length += 1
+ tmp = tmp.next
+
+ result = [0] * length
+ tmp = head
+ index = 0
+ while tmp: #链表元素加入数组
+ result[index] = tmp.val
+ index += 1
+ tmp = tmp.next
+
+ i, j = 0, length - 1
+ while i < j: # 判断回文
+ if result[i] != result[j]:
+ return False
+ i += 1
+ j -= 1
+ return True
+
+#反转后半部分链表
+class Solution:
+ def isPalindrome(self, head: ListNode) -> bool:
+ if head == None or head.next == None:
+ return True
+ slow, fast = head, head
+ while fast and fast.next:
+ pre = slow
+ slow = slow.next
+ fast = fast.next.next
+
+ pre.next = None # 分割链表
+ cur1 = head # 前半部分
+ cur2 = self.reverseList(slow) # 反转后半部分,总链表长度如果是奇数,cur2比cur1多一个节点
+ while cur1:
+ if cur1.val != cur2.val:
+ return False
+ cur1 = cur1.next
+ cur2 = cur2.next
+ return True
+
+ def reverseList(self, head: ListNode) -> ListNode:
+ cur = head
+ pre = None
+ while(cur!=None):
+ temp = cur.next # 保存一下cur的下一个节点
+ cur.next = pre # 反转
+ pre = cur
+ cur = temp
+ return pre
```
## Go
From 2f39c7df81006b963f48cf79251e1f83ff8a61bb Mon Sep 17 00:00:00 2001
From: Steve0x2a
Date: Sun, 15 Aug 2021 14:40:48 +0800
Subject: [PATCH 0008/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A00143=E9=87=8D?=
=?UTF-8?q?=E6=8E=92=E9=93=BE=E8=A1=A8=20Python=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...15\346\216\222\351\223\276\350\241\250.md" | 56 ++++++++++++++++++-
1 file changed, 55 insertions(+), 1 deletion(-)
diff --git "a/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md" "b/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md"
index 6223205132..76df63b7df 100644
--- "a/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md"
+++ "b/problems/0143.\351\207\215\346\216\222\351\223\276\350\241\250.md"
@@ -222,7 +222,61 @@ public class ReorderList {
```
Python:
-
+```python3
+# 方法二 双向队列
+class Solution:
+ def reorderList(self, head: ListNode) -> None:
+ """
+ Do not return anything, modify head in-place instead.
+ """
+ d = collections.deque()
+ tmp = head
+ while tmp.next: # 链表除了首元素全部加入双向队列
+ d.append(tmp.next)
+ tmp = tmp.next
+ tmp = head
+ while len(d): # 一后一前加入链表
+ tmp.next = d.pop()
+ tmp = tmp.next
+ if len(d):
+ tmp.next = d.popleft()
+ tmp = tmp.next
+ tmp.next = None # 尾部置空
+
+# 方法三 反转链表
+class Solution:
+ def reorderList(self, head: ListNode) -> None:
+ if head == None or head.next == None:
+ return True
+ slow, fast = head, head
+ while fast and fast.next:
+ slow = slow.next
+ fast = fast.next.next
+ right = slow.next # 分割右半边
+ slow.next = None # 切断
+ right = self.reverseList(right) #反转右半边
+ left = head
+ # 左半边一定比右半边长, 因此判断右半边即可
+ while right:
+ curLeft = left.next
+ left.next = right
+ left = curLeft
+
+ curRight = right.next
+ right.next = left
+ right = curRight
+
+
+ def reverseList(self, head: ListNode) -> ListNode:
+ cur = head
+ pre = None
+ while(cur!=None):
+ temp = cur.next # 保存一下cur的下一个节点
+ cur.next = pre # 反转
+ pre = cur
+ cur = temp
+ return pre
+```
Go:
JavaScript:
From e35c7cc63f56f66ea37c02244481cfb45ce640b8 Mon Sep 17 00:00:00 2001
From: Steve0x2a
Date: Sun, 15 Aug 2021 14:52:09 +0800
Subject: [PATCH 0009/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A00724=E5=AF=BB?=
=?UTF-8?q?=E6=89=BE=E6=95=B0=E7=BB=84=E7=9A=84=E4=B8=AD=E5=BF=83=E7=B4=A2?=
=?UTF-8?q?=E5=BC=95=20Python=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git "a/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md" "b/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md"
index 052d4c02d7..b411589384 100644
--- "a/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md"
+++ "b/problems/0724.\345\257\273\346\211\276\346\225\260\347\273\204\347\232\204\344\270\255\345\277\203\347\264\242\345\274\225.md"
@@ -89,7 +89,7 @@ class Solution {
## Python
-```python
+```python3
class Solution:
def pivotIndex(self, nums: List[int]) -> int:
numSum = sum(nums) #数组总和
From 5850f6d636af38f3edbac46ef4e8e81a8271b8f9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E4=BD=99=E6=9D=9C=E6=9E=97?=
Date: Sun, 15 Aug 2021 15:34:34 +0800
Subject: [PATCH 0010/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A00059.=E8=9E=BA?=
=?UTF-8?q?=E6=97=8B=E7=9F=A9=E9=98=B5II=20Swift=20=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...\346\227\213\347\237\251\351\230\265II.md" | 55 +++++++++++++++++++
1 file changed, 55 insertions(+)
diff --git "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md"
index e46dae6d9c..6df8c83d7f 100644
--- "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md"
+++ "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md"
@@ -302,6 +302,61 @@ func generateMatrix(n int) [][]int {
}
```
+Swift:
+
+```swift
+func generateMatrix(_ n: Int) -> [[Int]] {
+ var result = [[Int]](repeating: [Int](repeating: 0, count: n), count: n)
+
+ var startRow = 0
+ var startColumn = 0
+ var loopCount = n / 2
+ let mid = n / 2
+ var count = 1
+ var offset = 1
+ var row: Int
+ var column: Int
+
+ while loopCount > 0 {
+ row = startRow
+ column = startColumn
+
+ for c in column ..< startColumn + n - offset {
+ result[startRow][c] = count
+ count += 1
+ column += 1
+ }
+
+ for r in row ..< startRow + n - offset {
+ result[r][column] = count
+ count += 1
+ row += 1
+ }
+
+ for _ in startColumn ..< column {
+ result[row][column] = count
+ count += 1
+ column -= 1
+ }
+
+ for _ in startRow ..< row {
+ result[row][column] = count
+ count += 1
+ row -= 1
+ }
+
+ startRow += 1
+ startColumn += 1
+ offset += 2
+ loopCount -= 1
+ }
+
+ if (n % 2) != 0 {
+ result[mid][mid] = count
+ }
+ return result
+}
+```
From 71ee2d5d0bc9dba8f2d83156c05ea17a5353036a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E4=BD=99=E6=9D=9C=E6=9E=97?=
Date: Sun, 15 Aug 2021 21:35:27 +0800
Subject: [PATCH 0011/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A00203.=E7=A7=BB?=
=?UTF-8?q?=E9=99=A4=E9=93=BE=E8=A1=A8=E5=85=83=E7=B4=A0=20Swift=E7=89=88?=
=?UTF-8?q?=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...76\350\241\250\345\205\203\347\264\240.md" | 28 +++++++++++++++++++
1 file changed, 28 insertions(+)
diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md"
index a2c6e90d5b..9235d47e90 100644
--- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md"
+++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md"
@@ -304,6 +304,34 @@ var removeElements = function(head, val) {
};
```
+Swift:
+
+```swift
+/**
+ * Definition for singly-linked list.
+ * public class ListNode {
+ * public var val: Int
+ * public var next: ListNode?
+ * public init() { self.val = 0; self.next = nil; }
+ * public init(_ val: Int) { self.val = val; self.next = nil; }
+ * public init(_ val: Int, _ next: ListNode?) { self.val = val; self.next = next; }
+ * }
+ */
+func removeElements(_ head: ListNode?, _ val: Int) -> ListNode? {
+ let dummyNode = ListNode()
+ dummyNode.next = head
+ var currentNode = dummyNode
+ while let curNext = currentNode.next {
+ if curNext.val == val {
+ currentNode.next = curNext.next
+ } else {
+ currentNode = curNext
+ }
+ }
+ return dummyNode.next
+}
+```
+
From 6aa102ed744836d2053da3e5bb13c0f1c5b56482 Mon Sep 17 00:00:00 2001
From: ironartisan
Date: Sun, 15 Aug 2021 22:26:57 +0800
Subject: [PATCH 0012/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A00042.=E6=8E=A5?=
=?UTF-8?q?=E9=9B=A8=E6=B0=B4java=E5=8F=8C=E6=8C=87=E9=92=88=E8=A7=A3?=
=?UTF-8?q?=E6=B3=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...2.\346\216\245\351\233\250\346\260\264.md" | 24 +++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" "b/problems/0042.\346\216\245\351\233\250\346\260\264.md"
index 235776a0e2..b3ee84fd43 100644
--- "a/problems/0042.\346\216\245\351\233\250\346\260\264.md"
+++ "b/problems/0042.\346\216\245\351\233\250\346\260\264.md"
@@ -365,7 +365,31 @@ public:
## 其他语言版本
Java:
+双指针法
+```java
+class Solution {
+ public int trap(int[] height) {
+ int sum = 0;
+ for (int i = 0; i < height.length; i++) {
+ // 第一个柱子和最后一个柱子不接雨水
+ if (i==0 || i== height.length - 1) continue;
+
+ int rHeight = height[i]; // 记录右边柱子的最高高度
+ int lHeight = height[i]; // 记录左边柱子的最高高度
+ for (int r = i+1; r < height.length; r++) {
+ if (height[r] > rHeight) rHeight = height[r];
+ }
+ for (int l = i-1; l >= 0; l--) {
+ if(height[l] > lHeight) lHeight = height[l];
+ }
+ int h = Math.min(lHeight, rHeight) - height[i];
+ if (h > 0) sum += h;
+ }
+ return sum;
+ }
+}
+```
Python:
双指针法
From d350a4dd8206f8cae4773d96e0a985e954276fe6 Mon Sep 17 00:00:00 2001
From: Eyjan_Huang <81480748+Eyjan-Huang@users.noreply.github.com>
Date: Mon, 16 Aug 2021 15:42:28 +0800
Subject: [PATCH 0013/3468] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200349.=E4=B8=A4?=
=?UTF-8?q?=E4=B8=AA=E6=95=B0=E7=BB=84=E7=9A=84=E4=BA=A4=E9=9B=86.md=20pyt?=
=?UTF-8?q?hon=E4=BB=A3=E7=A0=81=E7=AE=80=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
一行代码解决
---
...60\347\273\204\347\232\204\344\272\244\351\233\206.md" | 8 +-------
1 file changed, 1 insertion(+), 7 deletions(-)
diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md"
index 29c1c14490..2dd52a85e6 100644
--- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md"
+++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md"
@@ -121,13 +121,7 @@ Python:
```python
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
- result_set = set()
-
- set1 = set(nums1)
- for num in nums2:
- if num in set1:
- result_set.add(num) # set1里出现的nums2元素 存放到结果
- return list(result_set)
+ return list(set(nums1) & set(nums2)) # 两个数组线变成集合,求交集后还原为数组
```
From 46c1084f69621055c9fc862cd61042194a6db4c0 Mon Sep 17 00:00:00 2001
From: Eyjan_Huang <81480748+Eyjan-Huang@users.noreply.github.com>
Date: Mon, 16 Aug 2021 15:43:09 +0800
Subject: [PATCH 0014/3468] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200349.=E4=B8=A4?=
=?UTF-8?q?=E4=B8=AA=E6=95=B0=E7=BB=84=E7=9A=84=E4=BA=A4=E9=9B=86.md=20?=
=?UTF-8?q?=E9=94=99=E5=88=AB=E5=AD=97=E4=BF=AE=E6=AD=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md"
index 2dd52a85e6..7489352d43 100644
--- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md"
+++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md"
@@ -121,7 +121,7 @@ Python:
```python
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
- return list(set(nums1) & set(nums2)) # 两个数组线变成集合,求交集后还原为数组
+ return list(set(nums1) & set(nums2)) # 两个数组先变成集合,求交集后还原为数组
```
From fbeb80f14ad127e1d47c549c1c2063715896a6bf Mon Sep 17 00:00:00 2001
From: Eyjan_Huang <81480748+Eyjan-Huang@users.noreply.github.com>
Date: Mon, 16 Aug 2021 18:24:43 +0800
Subject: [PATCH 0015/3468] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200202.=E5=BF=AB?=
=?UTF-8?q?=E4=B9=90=E6=95=B0.md=20python=E4=BB=A3=E7=A0=81=E7=AE=80?=
=?UTF-8?q?=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
利用闭包的特性,修改了原本python代码中不符合PEP3的写法,以及赘余的代码。思路保持一致
---
...2.\345\277\253\344\271\220\346\225\260.md" | 36 ++++++++++---------
1 file changed, 20 insertions(+), 16 deletions(-)
diff --git "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" "b/problems/0202.\345\277\253\344\271\220\346\225\260.md"
index 1c630b6a8e..2e784e6ac8 100644
--- "a/problems/0202.\345\277\253\344\271\220\346\225\260.md"
+++ "b/problems/0202.\345\277\253\344\271\220\346\225\260.md"
@@ -111,25 +111,29 @@ Python:
```python
class Solution:
def isHappy(self, n: int) -> bool:
- set_ = set()
- while 1:
- sum_ = self.getSum(n)
- if sum_ == 1:
+ def calculate_happy(num):
+ sum_ = 0
+
+ # 从个位开始依次取,平方求和
+ while num:
+ sum_ += (num % 10) ** 2
+ num = num // 10
+ return sum_
+
+ # 记录中间结果
+ record = set()
+
+ while True:
+ n = calculate_happy(n)
+ if n == 1:
return True
- #如果这个sum曾经出现过,说明已经陷入了无限循环了,立刻return false
- if sum_ in set_:
+
+ # 如果中间结果重复出现,说明陷入死循环了,该数不是快乐数
+ if n in record:
return False
else:
- set_.add(sum_)
- n = sum_
-
- #取数值各个位上的单数之和
- def getSum(self, n):
- sum_ = 0
- while n > 0:
- sum_ += (n%10) * (n%10)
- n //= 10
- return sum_
+ record.add(n)
+
```
Go:
From 175f1c5e1a459e72511ae56ce33828a8fc367690 Mon Sep 17 00:00:00 2001
From: Eyjan_Huang <81480748+Eyjan-Huang@users.noreply.github.com>
Date: Mon, 16 Aug 2021 19:11:16 +0800
Subject: [PATCH 0016/3468] =?UTF-8?q?=E7=AE=80=E5=8C=96=200001.=E4=B8=A4?=
=?UTF-8?q?=E6=95=B0=E4=B9=8B=E5=92=8C.md=20python=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
原代码过于赘余,需要遍历两次且可读性较差。更新后的代码在维持题主题意的基础上的一次优化
---
...70\244\346\225\260\344\271\213\345\222\214.md" | 15 ++++++++-------
1 file changed, 8 insertions(+), 7 deletions(-)
diff --git "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md"
index f8c9da5ffa..9b961d0b01 100644
--- "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md"
+++ "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md"
@@ -110,13 +110,14 @@ Python:
```python
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
- hashmap={}
- for ind,num in enumerate(nums):
- hashmap[num] = ind
- for i,num in enumerate(nums):
- j = hashmap.get(target - num)
- if j is not None and i!=j:
- return [i,j]
+ records = dict()
+
+ # 用枚举更方便,就不需要通过索引再去取当前位置的值
+ for idx, val in enumerate(nums):
+ if target - val not in records:
+ records[val] = idx
+ else:
+ return [records[target - val], idx] # 如果存在就返回字典记录索引和当前索引
```
From 2405f03d94320d195c97e9719853297d5373aeaf Mon Sep 17 00:00:00 2001
From: ironartisan
Date: Tue, 17 Aug 2021 11:21:23 +0800
Subject: [PATCH 0017/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A00042.=E6=8E=A5?=
=?UTF-8?q?=E9=9B=A8=E6=B0=B4java=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
---
...2.\346\216\245\351\233\250\346\260\264.md" | 28 +++++++++++++++++++
1 file changed, 28 insertions(+)
diff --git "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" "b/problems/0042.\346\216\245\351\233\250\346\260\264.md"
index c241b44141..22c8c0efc9 100644
--- "a/problems/0042.\346\216\245\351\233\250\346\260\264.md"
+++ "b/problems/0042.\346\216\245\351\233\250\346\260\264.md"
@@ -365,6 +365,7 @@ public:
## 其他语言版本
Java:
+
双指针法
```java
class Solution {
@@ -390,6 +391,33 @@ class Solution {
}
}
```
+动态规划法
+```java
+class Solution {
+ public int trap(int[] height) {
+ int length = height.length;
+ if (length <= 2) return 0;
+ int[] maxLeft = new int[length];
+ int[] maxRight = new int[length];
+
+ // 记录每个柱子左边柱子最大高度
+ maxLeft[0] = height[0];
+ for (int i = 1; i< length; i++) maxLeft[i] = Math.max(height[i], maxLeft[i-1]);
+
+ // 记录每个柱子右边柱子最大高度
+ maxRight[length - 1] = height[length - 1];
+ for(int i = length - 2; i >= 0; i--) maxRight[i] = Math.max(height[i], maxRight[i+1]);
+
+ // 求和
+ int sum = 0;
+ for (int i = 0; i < length; i++) {
+ int count = Math.min(maxLeft[i], maxRight[i]) - height[i];
+ if (count > 0) sum += count;
+ }
+ return sum;
+ }
+}
+```
Python:
双指针法
From 20182c753d5451616aea5d7f131ba9cb4fd4f79e Mon Sep 17 00:00:00 2001
From: Nixiak-nan <70318059+Nixiak-nan@users.noreply.github.com>
Date: Tue, 17 Aug 2021 12:24:54 +0800
Subject: [PATCH 0018/3468] =?UTF-8?q?Update=20=E8=83=8C=E5=8C=85=E7=90=86?=
=?UTF-8?q?=E8=AE=BA=E5=9F=BA=E7=A1=8001=E8=83=8C=E5=8C=85-1.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
修改错别字
---
...\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md"
index c13efc3a28..851c265719 100644
--- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md"
+++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md"
@@ -103,7 +103,7 @@ dp[0][j],即:i为0,存放编号0的物品的时候,各个容量的背包
那么很明显当 j < weight[0]的时候,dp[0][j] 应该是 0,因为背包容量比编号0的物品重量还小。
-当j >= weight[0]是,dp[0][j] 应该是value[0],因为背包容量放足够放编号0物品。
+当j >= weight[0]时,dp[0][j] 应该是value[0],因为背包容量放足够放编号0物品。
代码初始化如下:
```
From a648b12e31822b023501bb60e12403b6ba54095d Mon Sep 17 00:00:00 2001
From: Steve0x2a
Date: Tue, 17 Aug 2021 13:59:39 +0800
Subject: [PATCH 0019/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A00129=E6=B1=82?=
=?UTF-8?q?=E6=A0=B9=E5=88=B0=E5=8F=B6=E5=AD=90=E8=8A=82=E7=82=B9=E6=95=B0?=
=?UTF-8?q?=E5=AD=97=E4=B9=8B=E5=92=8C=20Python3=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...60\345\255\227\344\271\213\345\222\214.md" | 27 ++++++++++++++++++-
1 file changed, 26 insertions(+), 1 deletion(-)
diff --git "a/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" "b/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md"
index b37270e21f..1764279316 100644
--- "a/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md"
+++ "b/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md"
@@ -165,7 +165,32 @@ public:
Java:
Python:
-
+```python3
+class Solution:
+ def sumNumbers(self, root: TreeNode) -> int:
+ res = 0
+ path = []
+ def backtrace(root):
+ nonlocal res
+ if not root: return # 节点空则返回
+ path.append(root.val)
+ if not root.left and not root.right: # 遇到了叶子节点
+ res += get_sum(path)
+ if root.left: # 左子树不空
+ backtrace(root.left)
+ if root.right: # 右子树不空
+ backtrace(root.right)
+ path.pop()
+
+ def get_sum(arr):
+ s = 0
+ for i in range(len(arr)):
+ s = s * 10 + arr[i]
+ return s
+
+ backtrace(root)
+ return res
+```
Go:
JavaScript:
From 07e95e7a97f1bdf55386cbc6c05f6b9cfba88a04 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9E=81=E5=AE=A2=E5=AD=A6=E4=BC=9F?=
Date: Mon, 16 Aug 2021 13:00:02 +0800
Subject: [PATCH 0020/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20203.=E7=A7=BB?=
=?UTF-8?q?=E9=99=A4=E9=93=BE=E8=A1=A8=E5=85=83=E7=B4=A0=20Swift=E7=89=88?=
=?UTF-8?q?=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md"
index 9235d47e90..f3724fc289 100644
--- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md"
+++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md"
@@ -304,8 +304,7 @@ var removeElements = function(head, val) {
};
```
-Swift:
-
+Swift:
```swift
/**
* Definition for singly-linked list.
From c7c52f7db6d92800a273057c3a5abc4cffcc8aef Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9E=81=E5=AE=A2=E5=AD=A6=E4=BC=9F?=
Date: Mon, 16 Aug 2021 20:28:38 +0800
Subject: [PATCH 0021/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20707.=E8=AE=BE?=
=?UTF-8?q?=E8=AE=A1=E9=93=BE=E8=A1=A8=20Swift=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...76\350\256\241\351\223\276\350\241\250.md" | 64 +++++++++++++++++++
1 file changed, 64 insertions(+)
diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md"
index 0aa038e8e6..33b02e561b 100644
--- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md"
+++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md"
@@ -948,6 +948,70 @@ class MyLinkedList {
}
```
+Swift
+```Swift
+class MyLinkedList {
+ var size = 0
+ let head: ListNode
+
+ /** Initialize your data structure here. */
+ init() {
+ head = ListNode(-1)
+ }
+
+ /** Get the value of the index-th node in the linked list. If the index is invalid, return -1. */
+ func get(_ index: Int) -> Int {
+ if size > 0 && index < size {
+ var tempHead = head
+ for _ in 0.. size {
+ return
+ }
+ let idx = (index >= 0 ? index : 0)
+ var tempHead = head
+ for _ in 0 ..< idx {
+ tempHead = tempHead.next!
+ }
+ let currentNode = tempHead.next
+ let newNode = ListNode(val, currentNode)
+ tempHead.next = newNode
+ size += 1
+ }
+
+ /** Delete the index-th node in the linked list, if the index is valid. */
+ func deleteAtIndex(_ index: Int) {
+ if size > 0 && index < size {
+ var tempHead = head
+ for _ in 0 ..< index {
+ tempHead = tempHead.next!
+ }
+ tempHead.next = tempHead.next!.next
+ size -= 1
+ }
+ }
+}
+```
-----------------------
From 91ef55c83dd07556e08f6c7ab5c644ccf73c3e27 Mon Sep 17 00:00:00 2001
From: XuDaHaoRen <1547794387@qq.com>
Date: Tue, 17 Aug 2021 16:40:56 +0800
Subject: [PATCH 0022/3468] =?UTF-8?q?problems/0001.=E4=B8=A4=E6=95=B0?=
=?UTF-8?q?=E4=B9=8B=E5=92=8C=E8=B6=85=E9=93=BE=E6=8E=A5=E6=9B=BF=E6=8D=A2?=
=?UTF-8?q?=E6=88=90=E4=B8=AA=E4=BA=BA=E7=BD=91=E7=AB=99?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...344\270\244\346\225\260\344\271\213\345\222\214.md" | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md"
index f8c9da5ffa..a4f63afd3b 100644
--- "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md"
+++ "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md"
@@ -9,7 +9,7 @@
## 1. 两数之和
-https://leetcode-cn.com/problems/two-sum/
+[力扣题目链接](https://leetcode-cn.com/problems/two-sum/)
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
@@ -29,10 +29,10 @@ https://leetcode-cn.com/problems/two-sum/
很明显暴力的解法是两层for循环查找,时间复杂度是O(n^2)。
建议大家做这道题目之前,先做一下这两道
-* [242. 有效的字母异位词](https://mp.weixin.qq.com/s/ffS8jaVFNUWyfn_8T31IdA)
-* [349. 两个数组的交集](https://mp.weixin.qq.com/s/aMSA5zrp3jJcLjuSB0Es2Q)
+* [242. 有效的字母异位词](https://www.programmercarl.com/0242.有效的字母异位词.html)
+* [349. 两个数组的交集](https://www.programmercarl.com/0349.两个数组的交集.html)
-[242. 有效的字母异位词](https://mp.weixin.qq.com/s/ffS8jaVFNUWyfn_8T31IdA) 这道题目是用数组作为哈希表来解决哈希问题,[349. 两个数组的交集](https://mp.weixin.qq.com/s/aMSA5zrp3jJcLjuSB0Es2Q)这道题目是通过set作为哈希表来解决哈希问题。
+[242. 有效的字母异位词](https://www.programmercarl.com/0242.有效的字母异位词.html) 这道题目是用数组作为哈希表来解决哈希问题,[349. 两个数组的交集](https://www.programmercarl.com/0349.两个数组的交集.html)这道题目是通过set作为哈希表来解决哈希问题。
本题呢,则要使用map,那么来看一下使用数组和set来做哈希法的局限。
@@ -51,7 +51,7 @@ C++中map,有三种类型:
std::unordered_map 底层实现为哈希表,std::map 和std::multimap 的底层实现是红黑树。
-同理,std::map 和std::multimap 的key也是有序的(这个问题也经常作为面试题,考察对语言容器底层的理解)。 更多哈希表的理论知识请看[关于哈希表,你该了解这些!](https://mp.weixin.qq.com/s/RSUANESA_tkhKhYe3ZR8Jg)。
+同理,std::map 和std::multimap 的key也是有序的(这个问题也经常作为面试题,考察对语言容器底层的理解)。 更多哈希表的理论知识请看[关于哈希表,你该了解这些!](https://www.programmercarl.com/哈希表理论基础.html)。
**这道题目中并不需要key有序,选择std::unordered_map 效率更高!**
From 3f45f392f6c0235393171494790b43eea6350e30 Mon Sep 17 00:00:00 2001
From: X-shuffle <53906918+X-shuffle@users.noreply.github.com>
Date: Tue, 17 Aug 2021 20:00:20 +0800
Subject: [PATCH 0023/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200343.=E6=95=B4?=
=?UTF-8?q?=E6=95=B0=E6=8B=86=E5=88=86=20go=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...64\346\225\260\346\213\206\345\210\206.md" | 29 ++++++++++++++++++-
1 file changed, 28 insertions(+), 1 deletion(-)
diff --git "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md"
index a9c55a8576..03b6f0fc46 100644
--- "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md"
+++ "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md"
@@ -227,7 +227,34 @@ class Solution:
return dp[n]
```
Go:
-
+```golang
+func integerBreak(n int) int {
+ /**
+ 动态五部曲
+ 1.确定dp下标及其含义
+ 2.确定递推公式
+ 3.确定dp初始化
+ 4.确定遍历顺序
+ 5.打印dp
+ **/
+ dp:=make([]int,n+1)
+ dp[1]=1
+ dp[2]=1
+ for i:=3;ib{
+ return a
+ }
+ return b
+}
+```
Javascript:
```Javascript
From cb9175f41a672e321cdd13ec5ba4a0fa7e3066da Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E4=BD=99=E6=9D=9C=E6=9E=97?=
Date: Tue, 17 Aug 2021 22:53:03 +0800
Subject: [PATCH 0024/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A00707.=E8=AE=BE?=
=?UTF-8?q?=E8=AE=A1=E9=93=BE=E8=A1=A8=20Swift=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...76\350\256\241\351\223\276\350\241\250.md" | 81 +++++++++++++++++++
1 file changed, 81 insertions(+)
diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md"
index 0aa038e8e6..0b8cd2e495 100644
--- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md"
+++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md"
@@ -948,6 +948,87 @@ class MyLinkedList {
}
```
+Swift:
+
+```swift
+class MyLinkedList {
+ var dummyHead: ListNode?
+ var size: Int
+
+ init() {
+ dummyHead = ListNode(0)
+ size = 0
+ }
+
+ func get(_ index: Int) -> Int {
+ if index >= size || index < 0 {
+ return -1
+ }
+
+ var curNode = dummyHead?.next
+ var curIndex = index
+
+ while curIndex > 0 {
+ curNode = curNode?.next
+ curIndex -= 1
+ }
+
+ return curNode?.value ?? -1
+ }
+
+ func addAtHead(_ val: Int) {
+ let newHead = ListNode(val)
+ newHead.next = dummyHead?.next
+ dummyHead?.next = newHead
+ size += 1
+ }
+
+ func addAtTail(_ val: Int) {
+ let newNode = ListNode(val)
+ var curNode = dummyHead
+ while curNode?.next != nil {
+ curNode = curNode?.next
+ }
+
+ curNode?.next = newNode
+ size += 1
+ }
+
+ func addAtIndex(_ index: Int, _ val: Int) {
+ if index > size {
+ return
+ }
+
+ let newNode = ListNode(val)
+ var curNode = dummyHead
+ var curIndex = index
+
+ while curIndex > 0 {
+ curNode = curNode?.next
+ curIndex -= 1
+ }
+
+ newNode.next = curNode?.next
+ curNode?.next = newNode
+ size += 1
+ }
+
+ func deleteAtIndex(_ index: Int) {
+ if index >= size || index < 0 {
+ return
+ }
+
+ var curNode = dummyHead
+ for _ in 0..
Date: Wed, 18 Aug 2021 01:26:55 +0800
Subject: [PATCH 0025/3468] =?UTF-8?q?Update=200102.=E4=BA=8C=E5=8F=89?=
=?UTF-8?q?=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
index 0f9b2df659..9b1435a294 100644
--- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
+++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
@@ -1129,7 +1129,7 @@ var largestValues = function(root) {
queue.push(root);
while(root!==null&&queue.length){
//设置max初始值就是队列的第一个元素
- let max=queue[0];
+ let max=queue[0].val;
let length=queue.length;
while(length--){
let node = queue.shift();
From eaa0504acbdc195c0804ecaebd033528786e7939 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9E=81=E5=AE=A2=E5=AD=A6=E4=BC=9F?=
Date: Wed, 18 Aug 2021 19:47:30 +0800
Subject: [PATCH 0026/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20206.=E5=8F=8D?=
=?UTF-8?q?=E8=BD=AC=E9=93=BE=E8=A1=A8=20Swift=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...73\350\275\254\351\223\276\350\241\250.md" | 37 +++++++++++++++++++
1 file changed, 37 insertions(+)
diff --git "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md"
index 8bb359bd52..0c850d52cc 100644
--- "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md"
+++ "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md"
@@ -334,6 +334,43 @@ fun reverseList(head: ListNode?): ListNode? {
}
```
+Swift:
+```swift
+/// 双指针法 (迭代)
+/// - Parameter head: 头结点
+/// - Returns: 翻转后的链表头结点
+func reverseList(_ head: ListNode?) -> ListNode? {
+ if head == nil || head?.next == nil {
+ return head
+ }
+ var pre: ListNode? = nil
+ var cur: ListNode? = head
+ var temp: ListNode? = nil
+ while cur != nil {
+ temp = cur?.next
+ cur?.next = pre
+ pre = cur
+ cur = temp
+ }
+ return pre
+}
+
+/// 递归
+/// - Parameter head: 头结点
+/// - Returns: 翻转后的链表头结点
+func reverseList2(_ head: ListNode?) -> ListNode? {
+ return reverse(pre: nil, cur: head)
+}
+func reverse(pre: ListNode?, cur: ListNode?) -> ListNode? {
+ if cur == nil {
+ return pre
+ }
+ let temp: ListNode? = cur?.next
+ cur?.next = pre
+ return reverse(pre: cur, cur: temp)
+}
+```
+
-----------------------
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
* B站视频:[代码随想录](https://space.bilibili.com/525438321)
From 704c3bb7960fc40b3000d36e7ec6266747a9cc87 Mon Sep 17 00:00:00 2001
From: ironartisan
Date: Wed, 18 Aug 2021 22:33:42 +0800
Subject: [PATCH 0027/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A00084.=E6=9F=B1?=
=?UTF-8?q?=E7=8A=B6=E5=9B=BE=E4=B8=AD=E6=9C=80=E5=A4=A7=E7=9A=84=E7=9F=A9?=
=?UTF-8?q?=E5=BD=A2java=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92=E8=A7=A3?=
=?UTF-8?q?=E6=B3=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...47\347\232\204\347\237\251\345\275\242.md" | 34 +++++++++++++++++++
1 file changed, 34 insertions(+)
diff --git "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md"
index 941888dba3..bec3bc9910 100644
--- "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md"
+++ "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md"
@@ -195,6 +195,40 @@ public:
Java:
+动态规划
+```java
+class Solution {
+ public int largestRectangleArea(int[] heights) {
+ int length = heights.length;
+ int[] minLeftIndex = new int [length];
+ int[] maxRigthIndex = new int [length];
+
+ // 记录左边第一个小于该柱子的下标
+ minLeftIndex[0] = -1 ;
+ for (int i = 1; i < length; i++) {
+ int t = i - 1;
+ // 这里不是用if,而是不断向右寻找的过程
+ while (t >= 0 && heights[t] >= heights[i]) t = minLeftIndex[t];
+ minLeftIndex[i] = t;
+ }
+ // 记录每个柱子 右边第一个小于该柱子的下标
+ maxRigthIndex[length - 1] = length;
+ for (int i = length - 2; i >= 0; i--) {
+ int t = i + 1;
+ while(t < length && heights[t] >= heights[i]) t = maxRigthIndex[t];
+ maxRigthIndex[i] = t;
+ }
+ // 求和
+ int result = 0;
+ for (int i = 0; i < length; i++) {
+ int sum = heights[i] * (maxRigthIndex[i] - minLeftIndex[i] - 1);
+ result = Math.max(sum, result);
+ }
+ return result;
+ }
+}
+```
+
Python:
动态规划
From 4b71311621baad2dc356dbe100e608435cc47bd8 Mon Sep 17 00:00:00 2001
From: shuwen
Date: Thu, 19 Aug 2021 12:41:16 +0800
Subject: [PATCH 0028/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E5=B1=82?=
=?UTF-8?q?=E5=BA=8F=E9=81=8D=E5=8E=86=E4=B8=AD=E7=9A=84=20104.=20?=
=?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E6=9C=80=E5=A4=A7=E6=B7=B1?=
=?UTF-8?q?=E5=BA=A6=20Python=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...02\345\272\217\351\201\215\345\216\206.md" | 23 +++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
index 0f9b2df659..dc386684e3 100644
--- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
+++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
@@ -1532,6 +1532,29 @@ Java:
Python:
+```python 3
+class Solution:
+ def maxDepth(self, root: TreeNode) -> int:
+ if root == None:
+ return 0
+
+ queue_ = [root]
+ result = []
+ while queue_:
+ length = len(queue_)
+ sub = []
+ for i in range(length):
+ cur = queue_.pop(0)
+ sub.append(cur.val)
+ #子节点入队列
+ if cur.left: queue_.append(cur.left)
+ if cur.right: queue_.append(cur.right)
+ result.append(sub)
+
+
+ return len(result)
+```
+
Go:
From bd3d65c41530e2f8268986ce9f4b13d889d5925d Mon Sep 17 00:00:00 2001
From: DoubleYellowIce <65336599+DoubleYellowIce@users.noreply.github.com>
Date: Thu, 19 Aug 2021 14:34:15 +0800
Subject: [PATCH 0029/3468] =?UTF-8?q?Update=200188.=E4=B9=B0=E5=8D=96?=
=?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?IV.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...\344\275\263\346\227\266\346\234\272IV.md" | 21 ++++++++++++++++++-
1 file changed, 20 insertions(+), 1 deletion(-)
diff --git "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md"
index 9fe7a919e1..66676a7a74 100644
--- "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md"
+++ "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md"
@@ -196,7 +196,7 @@ class Solution {
}
}
-// 版本二: 空间优化
+// 版本二: 二维 dp数组
class Solution {
public int maxProfit(int k, int[] prices) {
if (prices.length == 0) return 0;
@@ -220,6 +220,25 @@ class Solution {
return dp[len - 1][k*2];
}
}
+
+//版本三:一维 dp数组
+class Solution {
+ public int maxProfit(int k, int[] prices) {
+ //在版本二的基础上,由于我们只关心前一天的股票买入情况,所以只存储前一天的股票买入情况
+ if(prices.length==0)return 0;
+ int[] dp=new int[2*k+1];
+ for (int i = 1; i <2*k ; i+=2) {
+ dp[i]=-prices[0];
+ }
+ for (int i = 0; i
Date: Thu, 19 Aug 2021 14:46:15 +0800
Subject: [PATCH 0030/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A00279.=E5=AE=8C?=
=?UTF-8?q?=E5=85=A8=E5=B9=B3=E6=96=B9=E6=95=B0python3=E7=89=88=E6=9C=AC?=
=?UTF-8?q?=E4=B8=80=E8=A7=A3=E6=B3=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...5\250\345\271\263\346\226\271\346\225\260.md" | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md"
index e51f0a9958..863bd60cb7 100644
--- "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md"
+++ "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md"
@@ -217,6 +217,22 @@ class Solution:
Python3:
```python
class Solution:
+ '''版本一,先遍历背包, 再遍历物品'''
+ def numSquares(self, n: int) -> int:
+ dp = [n] * (n + 1)
+ dp[0] = 0
+ # 遍历背包
+ for j in range(1, n+1):
+ for i in range(1, n):
+ num = i ** 2
+ if num > j: break
+ # 遍历物品
+ if j - num >= 0:
+ dp[j] = min(dp[j], dp[j - num] + 1)
+ return dp[n]
+
+class Solution:
+ '''版本二, 先遍历物品, 再遍历背包'''
def numSquares(self, n: int) -> int:
# 初始化
# 组成和的完全平方数的最多个数,就是只用1构成
From 7c6930971d6175fe6656a4b31c4ac1c6d765d795 Mon Sep 17 00:00:00 2001
From: Eyjan_Huang <81480748+Eyjan-Huang@users.noreply.github.com>
Date: Thu, 19 Aug 2021 15:00:28 +0800
Subject: [PATCH 0031/3468] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200203.=E7=A7=BB?=
=?UTF-8?q?=E9=99=A4=E9=93=BE=E8=A1=A8=E5=85=83=E7=B4=A0.md=20python?=
=?UTF-8?q?=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
使用更符合PEP8要求的代码规范来约束
---
...351\223\276\350\241\250\345\205\203\347\264\240.md" | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md"
index f3724fc289..d67a7d2a40 100644
--- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md"
+++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md"
@@ -245,13 +245,15 @@ Python:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
+
class Solution:
def removeElements(self, head: ListNode, val: int) -> ListNode:
- dummy_head = ListNode(next=head) #添加一个虚拟节点
+ dummy_head = ListNode(next=head)
cur = dummy_head
- while(cur.next!=None):
- if(cur.next.val == val):
- cur.next = cur.next.next #删除cur.next节点
+
+ while cur.next:
+ if cur.next.val == val:
+ cur.next = cur.next.next # 删除下一个节点
else:
cur = cur.next
return dummy_head.next
From aa4ce0f096013a20847b4b7c325a22fbe26e6deb Mon Sep 17 00:00:00 2001
From: ironartisan
Date: Thu, 19 Aug 2021 15:03:44 +0800
Subject: [PATCH 0032/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A00279.=E5=AE=8C?=
=?UTF-8?q?=E5=85=A8=E5=B9=B3=E6=96=B9=E6=95=B0java=E7=89=88=E6=9C=AC?=
=?UTF-8?q?=E4=BA=8C=E8=A7=A3=E6=B3=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...50\345\271\263\346\226\271\346\225\260.md" | 27 ++++++++++++++++++-
1 file changed, 26 insertions(+), 1 deletion(-)
diff --git "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md"
index 863bd60cb7..f23453dad0 100644
--- "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md"
+++ "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md"
@@ -161,6 +161,7 @@ public:
Java:
```Java
class Solution {
+ // 版本一,先遍历物品, 再遍历背包
public int numSquares(int n) {
int max = Integer.MAX_VALUE;
int[] dp = new int[n + 1];
@@ -170,7 +171,9 @@ class Solution {
}
//当和为0时,组合的个数为0
dp[0] = 0;
+ // 遍历物品
for (int i = 1; i * i <= n; i++) {
+ // 遍历背包
for (int j = i * i; j <= n; j++) {
if (dp[j - i * i] != max) {
dp[j] = Math.min(dp[j], dp[j - i * i] + 1);
@@ -180,6 +183,28 @@ class Solution {
return dp[n];
}
}
+
+class Solution {
+ // 版本二, 先遍历背包, 再遍历物品
+ public int numSquares(int n) {
+ int max = Integer.MAX_VALUE;
+ int[] dp = new int[n + 1];
+ // 初始化
+ for (int j = 0; j <= n; j++) {
+ dp[j] = max;
+ }
+ // 当和为0时,组合的个数为0
+ dp[0] = 0;
+ // 遍历背包
+ for (int j = 1; j <= n; j++) {
+ // 遍历物品
+ for (int i = 1; i * i <= j; i++) {
+ dp[j] = Math.min(dp[j], dp[j - i * i] + 1);
+ }
+ }
+ return dp[n];
+ }
+}
```
Python:
@@ -187,7 +212,7 @@ Python:
```python3
class Solution:
def numSquares(self, n: int) -> int:
- '''版本一'''
+ '''版本一,先遍历背包, 再遍历物品'''
# 初始化
nums = [i**2 for i in range(1, n + 1) if i**2 <= n]
dp = [10**4]*(n + 1)
From 4df16b4258c41d3b6cfb0d9f7e4b9a51f9cba0a0 Mon Sep 17 00:00:00 2001
From: ironartisan
Date: Thu, 19 Aug 2021 15:05:17 +0800
Subject: [PATCH 0033/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A00279.=E5=AE=8C?=
=?UTF-8?q?=E5=85=A8=E5=B9=B3=E6=96=B9=E6=95=B0java=E7=89=88=E6=9C=AC?=
=?UTF-8?q?=E4=BA=8C=E8=A7=A3=E6=B3=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md"
index f23453dad0..3c0f0414e0 100644
--- "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md"
+++ "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md"
@@ -226,7 +226,7 @@ class Solution:
return dp[n]
def numSquares1(self, n: int) -> int:
- '''版本二'''
+ '''版本二, 先遍历物品, 再遍历背包'''
# 初始化
nums = [i**2 for i in range(1, n + 1) if i**2 <= n]
dp = [10**4]*(n + 1)
From f6eee532e49acba882be2b202825ee7082d9a69c Mon Sep 17 00:00:00 2001
From: Eyjan_Huang <81480748+Eyjan-Huang@users.noreply.github.com>
Date: Thu, 19 Aug 2021 16:26:42 +0800
Subject: [PATCH 0034/3468] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200344.=E5=8F=8D?=
=?UTF-8?q?=E8=BD=AC=E5=AD=97=E7=AC=A6=E4=B8=B2.md=20python=E4=BB=A3?=
=?UTF-8?q?=E7=A0=81=E4=BC=98=E5=8C=96=EF=BC=8C=E5=88=A0=E9=99=A4=E5=8F=A6?=
=?UTF-8?q?=E4=B8=80=E7=A7=8D=E8=A7=A3=E6=B3=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
另一种解法进行了不必要的操作,且代码可读性较差。
推荐使用第一种解法
---
...\254\345\255\227\347\254\246\344\270\262.md" | 17 +++++------------
1 file changed, 5 insertions(+), 12 deletions(-)
diff --git "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md"
index 4f96f8395e..763097bee8 100644
--- "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md"
+++ "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md"
@@ -162,21 +162,14 @@ class Solution:
Do not return anything, modify s in-place instead.
"""
left, right = 0, len(s) - 1
- while(left < right):
+
+ # 该方法已经不需要判断奇偶数,经测试后时间空间复杂度比用 for i in range(right//2)更低
+ # 推荐该写法,更加通俗易懂
+ while left < right:
s[left], s[right] = s[right], s[left]
left += 1
right -= 1
-
-# 下面的写法更加简洁,但是都是同样的算法
-# class Solution:
-# def reverseString(self, s: List[str]) -> None:
-# """
-# Do not return anything, modify s in-place instead.
-# """
- # 不需要判别是偶数个还是奇数个序列,因为奇数个的时候,中间那个不需要交换就可
-# for i in range(len(s)//2):
-# s[i], s[len(s)-1-i] = s[len(s)-1-i], s[i]
-# return s
+
```
Go:
From 0990dfe810af83c4ed41c605fd165dad1f76645b Mon Sep 17 00:00:00 2001
From: shuwen
Date: Thu, 19 Aug 2021 17:00:42 +0800
Subject: [PATCH 0035/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200102.=E4=BA=8C?=
=?UTF-8?q?=E5=8F=89=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86?=
=?UTF-8?q?.md=20=20=E5=85=B3=E4=BA=8E111.=E4=BA=8C=E5=8F=89=E6=A0=91?=
=?UTF-8?q?=E7=9A=84=E6=9C=80=E5=B0=8F=E6=B7=B1=E5=BA=A6=E7=9A=84Python?=
=?UTF-8?q?=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...02\345\272\217\351\201\215\345\216\206.md" | 32 ++++++++++++++++++-
1 file changed, 31 insertions(+), 1 deletion(-)
diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
index dc386684e3..109ed70fd4 100644
--- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
+++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
@@ -1562,6 +1562,8 @@ JavaScript:
# 111.二叉树的最小深度
+题目地址:https://leetcode-cn.com/problems/minimum-depth-of-binary-tree/
+
相对于 104.二叉树的最大深度 ,本题还也可以使用层序遍历的方式来解决,思路是一样的。
**需要注意的是,只有当左右孩子都为空的时候,才说明遍历的最低点了。如果其中一个孩子为空则不是最低点**
@@ -1597,7 +1599,35 @@ public:
Java:
-Python:
+Python 3:
+
+```python 3
+# Definition for a binary tree node.
+# class TreeNode:
+# def __init__(self, val=0, left=None, right=None):
+# self.val = val
+# self.left = left
+# self.right = right
+class Solution:
+ def minDepth(self, root: TreeNode) -> int:
+ if root == None:
+ return 0
+
+ #根节点的深度为1
+ queue_ = [(root,1)]
+ while queue_:
+ cur, depth = queue_.pop(0)
+
+ if cur.left == None and cur.right == None:
+ return depth
+ #先左子节点,由于左子节点没有孩子,则就是这一层了
+ if cur.left:
+ queue_.append((cur.left,depth + 1))
+ if cur.right:
+ queue_.append((cur.right,depth + 1))
+
+ return 0
+```
Go:
From e6571ecaac55a91a557b32248560ef5fac612cf1 Mon Sep 17 00:00:00 2001
From: Eyjan_Huang <81480748+Eyjan-Huang@users.noreply.github.com>
Date: Thu, 19 Aug 2021 17:30:36 +0800
Subject: [PATCH 0036/3468] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200541.=E5=8F=8D?=
=?UTF-8?q?=E8=BD=AC=E5=AD=97=E7=AC=A6=E4=B8=B2II.md=20python=E9=83=A8?=
=?UTF-8?q?=E5=88=86=EF=BC=8C=E5=8E=BB=E9=99=A4=E8=87=AA=E9=80=A0=E8=BD=AE?=
=?UTF-8?q?=E5=AD=90=E9=83=A8=E5=88=86=EF=BC=8C=E4=BC=98=E5=8C=96=E4=BB=A3?=
=?UTF-8?q?=E7=A0=81=E5=8F=AF=E8=AF=BB=E6=80=A7?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
维持原方法的思路,简化了包和匿名函数的用法
原代码使用了reduce包 + 匿名函数来实现 ''.join的操作,去除该部分提升运行效率
---
...\345\255\227\347\254\246\344\270\262II.md" | 35 ++++++++-----------
1 file changed, 14 insertions(+), 21 deletions(-)
diff --git "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md"
index ab1ef16afa..02713c65a4 100644
--- "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md"
+++ "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md"
@@ -155,34 +155,27 @@ class Solution {
Python:
```python
-
-class Solution(object):
- def reverseStr(self, s, k):
+class Solution:
+ def reverseStr(self, s: str, k: int) -> str:
"""
- :type s: str
- :type k: int
- :rtype: str
+ 1. 使用range(start, end, step)来确定需要调换的初始位置
+ 2. 对于字符串s = 'abc',如果使用s[0:999] ===> 'abc'。字符串末尾如果超过最大长度,则会返回至字符串最后一个值,这个特性可以避免一些边界条件的处理。
+ 3. 用切片整体替换,而不是一个个替换.
"""
- from functools import reduce
- # turn s into a list
- s = list(s)
-
- # another way to simply use a[::-1], but i feel this is easier to understand
- def reverse(s):
- left, right = 0, len(s) - 1
+ def reverse_substring(text):
+ left, right = 0, len(text) - 1
while left < right:
- s[left], s[right] = s[right], s[left]
+ text[left], text[right] = text[right], text[left]
left += 1
right -= 1
- return s
+ return text
- # make sure we reverse each 2k elements
- for i in range(0, len(s), 2*k):
- s[i:(i+k)] = reverse(s[i:(i+k)])
-
- # combine list into str.
- return reduce(lambda a, b: a+b, s)
+ res = list(s)
+
+ for cur in range(0, len(s), 2 * k):
+ res[cur: cur + k] = reverse_substring(res[cur: cur + k])
+ return ''.join(res)
```
From 51e719a4351fb97ed41ad6995bc6470d5204ad35 Mon Sep 17 00:00:00 2001
From: Eyjan_Huang <81480748+Eyjan-Huang@users.noreply.github.com>
Date: Thu, 19 Aug 2021 17:57:39 +0800
Subject: [PATCH 0037/3468] =?UTF-8?q?=E7=AE=80=E5=8C=96=20=E5=89=91?=
=?UTF-8?q?=E6=8C=87Offer05.=E6=9B=BF=E6=8D=A2=E7=A9=BA=E6=A0=BC.md=20pyth?=
=?UTF-8?q?on=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
减少不必要的变量使用,优化空间复杂度,使用切片替换而不是单个替换
---
...77\346\215\242\347\251\272\346\240\274.md" | 54 +++++++------------
1 file changed, 18 insertions(+), 36 deletions(-)
diff --git "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md"
index 4ae5f9f22a..3f373d0d1b 100644
--- "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md"
+++ "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md"
@@ -202,45 +202,27 @@ func replaceSpace(s string) string {
python:
```python
-class Solution(object):
- def replaceSpace(self, s):
- """
- :type s: str
- :rtype: str
- """
- list_s = list(s)
-
- # 记录原本字符串的长度
- original_end = len(s)
-
- # 将空格改成%20 使得字符串总长增长 2n,n为原本空格数量。
- # 所以记录空格数量就可以得到目标字符串的长度
- n_space = 0
- for ss in s:
- if ss == ' ':
- n_space += 1
-
- list_s += ['0'] * 2 * n_space
-
- # 设置左右指针位置
- left, right = original_end - 1, len(list_s) - 1
-
- # 循环直至左指针越界
+class Solution:
+ def replaceSpace(self, s: str) -> str:
+ counter = s.count(' ')
+
+ res = list(s)
+ # 每碰到一个空格就多拓展两个格子,1 + 2 = 3个位置存’%20‘
+ res.extend([' '] * counter * 2)
+
+ # 原始字符串的末尾,拓展后的末尾
+ left, right = len(s) - 1, len(res) - 1
+
while left >= 0:
- if list_s[left] == ' ':
- list_s[right] = '0'
- list_s[right - 1] = '2'
- list_s[right - 2] = '%'
- right -= 3
- else:
- list_s[right] = list_s[left]
+ if res[left] != ' ':
+ res[right] = res[left]
right -= 1
-
+ else:
+ # [right - 2, right), 左闭右开
+ res[right - 2: right + 1] = '%20'
+ right -= 3
left -= 1
-
- # 将list变回str,输出
- s = ''.join(list_s)
- return s
+ return ''.join(res)
```
From 6255eae04cefc676d243bc53ea4070bc900b3c99 Mon Sep 17 00:00:00 2001
From: Eyjan_Huang <81480748+Eyjan-Huang@users.noreply.github.com>
Date: Thu, 19 Aug 2021 21:01:20 +0800
Subject: [PATCH 0038/3468] =?UTF-8?q?=E8=A1=A5=E5=85=85=20=E5=89=91?=
=?UTF-8?q?=E6=8C=87Offer58-II.=E5=B7=A6=E6=97=8B=E8=BD=AC=E5=AD=97?=
=?UTF-8?q?=E7=AC=A6=E4=B8=B2.md=20python=E6=96=B9=E6=B3=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
如果不让使用自带函数reversed() 可以使用该方法
---
...\254\345\255\227\347\254\246\344\270\262.md" | 17 ++++++++++++++++-
1 file changed, 16 insertions(+), 1 deletion(-)
diff --git "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md"
index 1073dafa77..6070f85b35 100644
--- "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md"
+++ "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md"
@@ -136,13 +136,28 @@ class Solution:
# return "".join(s)
+# 方法三:如果连reversed也不让使用,那么自己手写一个
+class Solution:
+ def reverseLeftWords(self, s: str, n: int) -> str:
+ def reverse_sub(lst, left, right):
+ while left < right:
+ lst[left], lst[right] = lst[right], lst[left]
+ left += 1
+ right -= 1
+
+ res = list(s)
+ end = len(res) - 1
+ reverse_sub(res, 0, n - 1)
+ reverse_sub(res, n, end)
+ reverse_sub(res, 0, end)
+ return ''.join(res)
# 时间复杂度:O(n)
# 空间复杂度:O(n),python的string为不可变,需要开辟同样大小的list空间来修改
```
```python 3
-#方法三:考虑不能用切片的情况下,利用模+下标实现
+#方法四:考虑不能用切片的情况下,利用模+下标实现
class Solution:
def reverseLeftWords(self, s: str, n: int) -> str:
new_s = ''
From 1a82f98a175ab03569c67a436b093203ab343d20 Mon Sep 17 00:00:00 2001
From: Eyjan_Huang <81480748+Eyjan-Huang@users.noreply.github.com>
Date: Thu, 19 Aug 2021 21:04:57 +0800
Subject: [PATCH 0039/3468] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20=E5=89=91?=
=?UTF-8?q?=E6=8C=87Offer58-II.=E5=B7=A6=E6=97=8B=E8=BD=AC=E5=AD=97?=
=?UTF-8?q?=E7=AC=A6=E4=B8=B2.md=20=E6=A0=BC=E5=BC=8F=E4=BF=AE=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
更新排版
---
...54\345\255\227\347\254\246\344\270\262.md" | 22 ++++++++++++-------
1 file changed, 14 insertions(+), 8 deletions(-)
diff --git "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md"
index 6070f85b35..15607a50a9 100644
--- "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md"
+++ "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md"
@@ -125,17 +125,21 @@ python:
class Solution:
def reverseLeftWords(self, s: str, n: int) -> str:
return s[n:] + s[0:n]
-
+```
+```python
# 方法二:也可以使用上文描述的方法,有些面试中不允许使用切片,那就使用上文作者提到的方法
-# class Solution:
-# def reverseLeftWords(self, s: str, n: int) -> str:
-# s = list(s)
-# s[0:n] = list(reversed(s[0:n]))
-# s[n:] = list(reversed(s[n:]))
-# s.reverse()
+class Solution:
+ def reverseLeftWords(self, s: str, n: int) -> str:
+ s = list(s)
+ s[0:n] = list(reversed(s[0:n]))
+ s[n:] = list(reversed(s[n:]))
+ s.reverse()
+
+ return "".join(s)
-# return "".join(s)
+```
+```python
# 方法三:如果连reversed也不让使用,那么自己手写一个
class Solution:
def reverseLeftWords(self, s: str, n: int) -> str:
@@ -152,8 +156,10 @@ class Solution:
reverse_sub(res, 0, end)
return ''.join(res)
+# 同方法二
# 时间复杂度:O(n)
# 空间复杂度:O(n),python的string为不可变,需要开辟同样大小的list空间来修改
+
```
```python 3
From bf92f955a3442d29c8c9f3e409d814ab644a63d1 Mon Sep 17 00:00:00 2001
From: X-shuffle <53906918+X-shuffle@users.noreply.github.com>
Date: Thu, 19 Aug 2021 21:45:44 +0800
Subject: [PATCH 0040/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=201002.=E6=9F=A5?=
=?UTF-8?q?=E6=89=BE=E5=B8=B8=E7=94=A8=E5=AD=97=E7=AC=A6=20GO=E7=89=88?=
=?UTF-8?q?=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
添加 1002.查找常用字符 GO版本
---
...70\347\224\250\345\255\227\347\254\246.md" | 36 ++++++++++++++++++-
1 file changed, 35 insertions(+), 1 deletion(-)
diff --git "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md"
index 723e565642..a789373b7c 100644
--- "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md"
+++ "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md"
@@ -233,7 +233,41 @@ var commonChars = function (words) {
return res
};
```
-
+GO
+```golang
+func commonChars(words []string) []string {
+ length:=len(words)
+ fre:=make([][]int,0)//统计每个字符串的词频
+ res:=make([]string,0)
+ //统计词频
+ for i:=0;ib{
+ return b
+ }
+ return a
+}
+```
-----------------------
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
* B站视频:[代码随想录](https://space.bilibili.com/525438321)
From d51d819060914d89b4eb89bd9a9495e48a10ab22 Mon Sep 17 00:00:00 2001
From: X-shuffle <53906918+X-shuffle@users.noreply.github.com>
Date: Thu, 19 Aug 2021 22:02:21 +0800
Subject: [PATCH 0041/3468] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200349.=E4=B8=A4?=
=?UTF-8?q?=E4=B8=AA=E6=95=B0=E7=BB=84=E7=9A=84=E4=BA=A4=E9=9B=86=20go?=
=?UTF-8?q?=E7=89=88=E6=9C=AC=EF=BC=88=E5=88=A9=E7=94=A8set=EF=BC=8C?=
=?UTF-8?q?=E4=B8=8D=E7=94=A8=E7=BB=9F=E8=AE=A1=E6=AC=A1=E6=95=B0=EF=BC=8C?=
=?UTF-8?q?=E5=87=8F=E5=B0=91=E7=A9=BA=E9=97=B4=E5=A4=8D=E6=9D=82=E5=BA=A6?=
=?UTF-8?q?=EF=BC=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
更新 0349.两个数组的交集 go版本(利用set,不用统计次数,减少空间复杂度)
---
...04\347\232\204\344\272\244\351\233\206.md" | 20 +++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md"
index 7489352d43..62abf6399f 100644
--- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md"
+++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md"
@@ -143,6 +143,26 @@ func intersection(nums1 []int, nums2 []int) []int {
return res
}
```
+```golang
+//优化版,利用set,减少count统计
+func intersection(nums1 []int, nums2 []int) []int {
+ set:=make(map[int]struct{},0)
+ res:=make([]int,0)
+ for _,v:=range nums1{
+ if _,ok:=set[v];!ok{
+ set[v]=struct{}{}
+ }
+ }
+ for _,v:=range nums2{
+ //如果存在于上一个数组中,则加入结果集,并清空该set值
+ if _,ok:=set[v];ok{
+ res=append(res,v)
+ delete(set, v)
+ }
+ }
+ return res
+}
+```
javaScript:
From a69006f901230b1ba73e73ce8b86918b404480e4 Mon Sep 17 00:00:00 2001
From: Eyjan_Huang <81480748+Eyjan-Huang@users.noreply.github.com>
Date: Fri, 20 Aug 2021 00:06:33 +0800
Subject: [PATCH 0042/3468] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200232.=E7=94=A8?=
=?UTF-8?q?=E6=A0=88=E5=AE=9E=E7=8E=B0=E9=98=9F=E5=88=97.md=20python?=
=?UTF-8?q?=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
python代码简化,符合PEP8标准,可读性加强,效率提升
---
...36\347\216\260\351\230\237\345\210\227.md" | 50 +++++++++++--------
1 file changed, 28 insertions(+), 22 deletions(-)
diff --git "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md"
index 0df82d35b5..46d884d356 100644
--- "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md"
+++ "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md"
@@ -281,48 +281,54 @@ class MyQueue {
Python:
```python
-# 使用两个栈实现先进先出的队列
class MyQueue:
+
def __init__(self):
"""
- Initialize your data structure here.
+ in主要负责push,out主要负责pop
"""
- self.stack1 = list()
- self.stack2 = list()
+ self.stack_in = []
+ self.stack_out = []
+
def push(self, x: int) -> None:
"""
- Push element x to the back of queue.
+ 有新元素进来,就往in里面push
"""
- # self.stack1用于接受元素
- self.stack1.append(x)
+ self.stack_in.append(x)
+
def pop(self) -> int:
"""
- Removes the element from in front of queue and returns that element.
+ 1. 检查如果out里面元素,则直接pop
+ 2. 如果out没有元素,就把in里面的元素(除了第一个)依次pop后装进out里面
+ 3. 直接把in剩下的元素pop出来,就是queue头部的
"""
- # self.stack2用于弹出元素,如果self.stack2为[],则将self.stack1中元素全部弹出给self.stack2
- if self.stack2 == []:
- while self.stack1:
- tmp = self.stack1.pop()
- self.stack2.append(tmp)
- return self.stack2.pop()
+ if self.stack_out:
+ return self.stack_out.pop()
+ else:
+ for i in range(1, len(self.stack_in)):
+ self.stack_out.append(self.stack_in.pop())
+ return self.stack_in.pop()
+
def peek(self) -> int:
"""
- Get the front element.
+ 1. 查out有没有元素,有就把最上面的返回
+ 2. 如果out没有元素,就把in最下面的返回
"""
- if self.stack2 == []:
- while self.stack1:
- tmp = self.stack1.pop()
- self.stack2.append(tmp)
- return self.stack2[-1]
+ if self.stack_out:
+ return self.stack_out[-1]
+ else:
+ return self.stack_in[0]
+
def empty(self) -> bool:
"""
- Returns whether the queue is empty.
+ 只要in或者out有元素,说明队列不为空
"""
- return self.stack1 == [] and self.stack2 == []
+ return not (self.stack_in or self.stack_out)
+
```
From 77e789a248dc21b8b939ee37e0d5d58512e90d8d Mon Sep 17 00:00:00 2001
From: Eyjan_Huang <81480748+Eyjan-Huang@users.noreply.github.com>
Date: Fri, 20 Aug 2021 01:49:06 +0800
Subject: [PATCH 0043/3468] =?UTF-8?q?=E7=AE=80=E5=8C=96=200225.=E7=94=A8?=
=?UTF-8?q?=E9=98=9F=E5=88=97=E5=AE=9E=E7=8E=B0=E6=A0=88.md=20python?=
=?UTF-8?q?=E9=83=A8=E5=88=86=EF=BC=8C=E5=86=97=E4=BD=99=E9=83=A8=E5=88=86?=
=?UTF-8?q?=E5=A4=AA=E5=A4=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
原方法用了很多不必要的变量和操作,改进后的代码更直观,效率和空间都得到了优化
---
...27\345\256\236\347\216\260\346\240\210.md" | 65 +++++++++++--------
1 file changed, 39 insertions(+), 26 deletions(-)
diff --git "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md"
index b327c17b8b..d82220db78 100644
--- "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md"
+++ "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md"
@@ -294,53 +294,66 @@ Python:
```python
from collections import deque
+
class MyStack:
+
def __init__(self):
"""
- Initialize your data structure here.
+ Python普通的Queue或SimpleQueue没有类似于peek的功能
+ 也无法用索引访问,在实现top的时候较为困难。
+
+ 用list可以,但是在使用pop(0)的时候时间复杂度为O(1)
+ 因此这里使用双向队列,我们保证只执行popleft()和append(),因为deque可以用索引访问,可以实现和peek相似的功能
+
+ in - 存所有数据
+ out - 仅在pop的时候会用到
"""
- #使用两个队列来实现
- self.que1 = deque()
- self.que2 = deque()
+ self.queue_in = deque()
+ self.queue_out = deque()
def push(self, x: int) -> None:
"""
- Push element x onto stack.
+ 直接append即可
"""
- self.que1.append(x)
+ self.queue_in.append(x)
+
def pop(self) -> int:
"""
- Removes the element on top of the stack and returns that element.
+ 1. 首先确认不空
+ 2. 因为队列的特殊性,FIFO,所以我们只有在pop()的时候才会使用queue_out
+ 3. 先把queue_in中的所有元素(除了最后一个),依次出列放进queue_out
+ 4. 交换in和out,此时out里只有一个元素
+ 5. 把out中的pop出来,即是原队列的最后一个
+
+ tip:这不能像栈实现队列一样,因为另一个queue也是FIFO,如果执行pop()它不能像
+ stack一样从另一个pop(),所以干脆in只用来存数据,pop()的时候两个进行交换
"""
- size = len(self.que1)
- size -= 1#这里先减一是为了保证最后面的元素
- while size > 0:
- size -= 1
- self.que2.append(self.que1.popleft())
-
+ if self.empty():
+ return None
- result = self.que1.popleft()
- self.que1, self.que2= self.que2, self.que1#将que2和que1交换 que1经过之前的操作应该是空了
- #一定注意不能直接使用que1 = que2 这样que2的改变会影响que1 可以用浅拷贝
- return result
+ for i in range(len(self.queue_in) - 1):
+ self.queue_out.append(self.queue_in.popleft())
+
+ self.queue_in, self.queue_out = self.queue_out, self.queue_in # 交换in和out,这也是为啥in只用来存
+ return self.queue_out.popleft()
def top(self) -> int:
"""
- Get the top element.
+ 1. 首先确认不空
+ 2. 我们仅有in会存放数据,所以返回第一个即可
"""
- return self.que1[-1]
+ if self.empty():
+ return None
+
+ return self.queue_in[-1]
+
def empty(self) -> bool:
"""
- Returns whether the stack is empty.
+ 因为只有in存了数据,只要判断in是不是有数即可
"""
- #print(self.que1)
- if len(self.que1) == 0:
- return True
- else:
- return False
-
+ return len(self.queue_in) == 0
```
From 55eb649434a95116e0fdcde2a89db5be1f85d801 Mon Sep 17 00:00:00 2001
From: Eyjan_Huang <81480748+Eyjan-Huang@users.noreply.github.com>
Date: Fri, 20 Aug 2021 01:50:53 +0800
Subject: [PATCH 0044/3468] =?UTF-8?q?=E6=9B=B4=E6=AD=A3=200225.=E7=94=A8?=
=?UTF-8?q?=E9=98=9F=E5=88=97=E5=AE=9E=E7=8E=B0=E6=A0=88.md=EF=BC=8Cdoc?=
=?UTF-8?q?=E6=96=87=E6=A1=A3=E9=94=99=E8=AF=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
时间复杂度错误,修正
---
...\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md"
index d82220db78..ccf93f1fbd 100644
--- "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md"
+++ "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md"
@@ -302,7 +302,7 @@ class MyStack:
Python普通的Queue或SimpleQueue没有类似于peek的功能
也无法用索引访问,在实现top的时候较为困难。
- 用list可以,但是在使用pop(0)的时候时间复杂度为O(1)
+ 用list可以,但是在使用pop(0)的时候时间复杂度为O(n)
因此这里使用双向队列,我们保证只执行popleft()和append(),因为deque可以用索引访问,可以实现和peek相似的功能
in - 存所有数据
From 571defa00789aa9764abb6aa7efe54944ed42a49 Mon Sep 17 00:00:00 2001
From: Eyjan_Huang <81480748+Eyjan-Huang@users.noreply.github.com>
Date: Fri, 20 Aug 2021 02:15:03 +0800
Subject: [PATCH 0045/3468] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200020.=E6=9C=89?=
=?UTF-8?q?=E6=95=88=E7=9A=84=E6=8B=AC=E5=8F=B7.md=20python=E9=83=A8?=
=?UTF-8?q?=E5=88=86=E9=A2=9D=E5=A4=96=E6=96=B9=E6=B3=95=E6=8F=90=E4=BE=9B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
补充了题主的方法,改写了原先冗余的做法,可读性提升,PEP8标准
---
...10\347\232\204\346\213\254\345\217\267.md" | 42 +++++++++++++++----
1 file changed, 34 insertions(+), 8 deletions(-)
diff --git "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md"
index a26aa3082f..57729c386f 100644
--- "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md"
+++ "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md"
@@ -162,18 +162,44 @@ class Solution {
Python:
```python3
+# 方法一,仅使用栈,更省空间
class Solution:
def isValid(self, s: str) -> bool:
- stack = [] # 保存还未匹配的左括号
- mapping = {")": "(", "]": "[", "}": "{"}
- for i in s:
- if i in "([{": # 当前是左括号,则入栈
- stack.append(i)
- elif stack and stack[-1] == mapping[i]: # 当前是配对的右括号则出栈
+ stack = []
+
+ for item in s:
+ if item == '(':
+ stack.append(')')
+ elif item == '[':
+ stack.append(']')
+ elif item == '{':
+ stack.append('}')
+ elif not stack or stack[-1] != item:
+ return False
+ else:
stack.pop()
- else: # 不是匹配的右括号或者没有左括号与之匹配,则返回false
+
+ return True if not stack else False
+```
+
+```python3
+# 方法二,使用字典
+class Solution:
+ def isValid(self, s: str) -> bool:
+ stack = []
+ mapping = {
+ '(': ')',
+ '[': ']',
+ '{': '}'
+ }
+ for item in s:
+ if item in mapping.keys():
+ stack.append(mapping[item])
+ elif not stack or stack[-1] != item:
return False
- return stack == [] # 最后必须正好把左括号匹配完
+ else:
+ stack.pop()
+ return True if not stack else False
```
Go:
From ce2c6fb562ae22b2b18230d8f00202f67c89c696 Mon Sep 17 00:00:00 2001
From: Eyjan_Huang <81480748+Eyjan-Huang@users.noreply.github.com>
Date: Fri, 20 Aug 2021 02:55:31 +0800
Subject: [PATCH 0046/3468] =?UTF-8?q?=E6=9B=B4=E6=96=B0+=E8=A1=A5=E5=85=85?=
=?UTF-8?q?=201047.=E5=88=A0=E9=99=A4=E5=AD=97=E7=AC=A6=E4=B8=B2=E4=B8=AD?=
=?UTF-8?q?=E7=9A=84=E6=89=80=E6=9C=89=E7=9B=B8=E9=82=BB=E9=87=8D=E5=A4=8D?=
=?UTF-8?q?=E9=A1=B9.md=20python=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
补充使用双指针的方法,但是更推荐栈的做法
---
...73\351\207\215\345\244\215\351\241\271.md" | 35 +++++++++++++++----
1 file changed, 29 insertions(+), 6 deletions(-)
diff --git "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md"
index c4ae85c956..7b059d4034 100644
--- "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md"
+++ "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md"
@@ -197,15 +197,38 @@ class Solution {
Python:
```python3
+# 方法一,使用栈,推荐!
class Solution:
def removeDuplicates(self, s: str) -> str:
- t = list()
- for i in s:
- if t and t[-1] == i:
- t.pop(-1)
+ res = list()
+ for item in s:
+ if res and res[-1] == item:
+ t.pop()
else:
- t.append(i)
- return "".join(t) # 字符串拼接
+ t.append(item)
+ return "".join(res) # 字符串拼接
+```
+
+```python3
+# 双指针
+class Solution:
+ def removeDuplicates(self, s: str) -> str:
+ res = list(s)
+ slow = fast = 0
+ length = len(res)
+
+ while fast < length:
+ # 如果一样直接换,不一样会把后面的填在slow的位置
+ res[slow] = res[fast]
+
+ # 如果发现和前一个一样,就退一格指针
+ if slow > 0 and res[slow] == res[slow - 1]:
+ slow -= 1
+ else:
+ slow += 1
+ fast += 1
+
+ return ''.join(res[0: slow])
```
Go:
From 13293e8c2f0e30743848e632244cc1a112e0422c Mon Sep 17 00:00:00 2001
From: Eyjan_Huang <81480748+Eyjan-Huang@users.noreply.github.com>
Date: Fri, 20 Aug 2021 02:58:09 +0800
Subject: [PATCH 0047/3468] =?UTF-8?q?=E6=9B=B4=E6=96=B0=201047.=E5=88=A0?=
=?UTF-8?q?=E9=99=A4=E5=AD=97=E7=AC=A6=E4=B8=B2=E4=B8=AD=E7=9A=84=E6=89=80?=
=?UTF-8?q?=E6=9C=89=E7=9B=B8=E9=82=BB=E9=87=8D=E5=A4=8D=E9=A1=B9.md=20pyt?=
=?UTF-8?q?hon=E6=B3=A8=E9=87=8A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md"
index 7b059d4034..1d63e7f886 100644
--- "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md"
+++ "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md"
@@ -210,7 +210,7 @@ class Solution:
```
```python3
-# 双指针
+# 方法二,使用双指针模拟栈,如果不让用栈可以作为备选方法。
class Solution:
def removeDuplicates(self, s: str) -> str:
res = list(s)
From 5e3d23fa38c78b9e66f12bd0e768968d7f31ed6c Mon Sep 17 00:00:00 2001
From: Eyjan_Huang <81480748+Eyjan-Huang@users.noreply.github.com>
Date: Fri, 20 Aug 2021 02:59:10 +0800
Subject: [PATCH 0048/3468] =?UTF-8?q?=E6=9B=B4=E6=AD=A3=201047.=E5=88=A0?=
=?UTF-8?q?=E9=99=A4=E5=AD=97=E7=AC=A6=E4=B8=B2=E4=B8=AD=E7=9A=84=E6=89=80?=
=?UTF-8?q?=E6=9C=89=E7=9B=B8=E9=82=BB=E9=87=8D=E5=A4=8D=E9=A1=B9.md=20pyt?=
=?UTF-8?q?hon=E6=96=B9=E6=B3=95=E4=B8=80=E4=BB=A3=E7=A0=81=E7=9A=84?=
=?UTF-8?q?=E9=94=99=E8=AF=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...33\270\351\202\273\351\207\215\345\244\215\351\241\271.md" | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md"
index 1d63e7f886..b60a8d1d9f 100644
--- "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md"
+++ "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md"
@@ -203,9 +203,9 @@ class Solution:
res = list()
for item in s:
if res and res[-1] == item:
- t.pop()
+ res.pop()
else:
- t.append(item)
+ res.append(item)
return "".join(res) # 字符串拼接
```
From 8b94306cc6030eb79f2a8376b01f6398d888f7ed Mon Sep 17 00:00:00 2001
From: Eyjan_Huang <81480748+Eyjan-Huang@users.noreply.github.com>
Date: Fri, 20 Aug 2021 03:23:30 +0800
Subject: [PATCH 0049/3468] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200024.=E4=B8=A4?=
=?UTF-8?q?=E4=B8=A4=E4=BA=A4=E6=8D=A2=E9=93=BE=E8=A1=A8=E4=B8=AD=E7=9A=84?=
=?UTF-8?q?=E8=8A=82=E7=82=B9.md=20python=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
使用变量名使交换的过程更加清晰,而不是使用之前的next.next这样可读性较差
从后往前换
pre = dummy,cur = 2, post=3
dummpy -> 1 -> 2 -> None
先把cur.next = post.next,此时链表为 1 -> None
再 post.next = cur 此时链表为 2 -> 1 -> None, dummpy -> 1 -> None
最后 pre.next = post, 此时为 dummpy -> 2 -> 1 -> None
---
...55\347\232\204\350\212\202\347\202\271.md" | 32 ++++++++++++-------
1 file changed, 20 insertions(+), 12 deletions(-)
diff --git "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md"
index 91e566ddd6..672b9a8f74 100644
--- "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md"
+++ "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md"
@@ -160,21 +160,29 @@ class Solution {
Python:
```python
+# Definition for singly-linked list.
+# class ListNode:
+# def __init__(self, val=0, next=None):
+# self.val = val
+# self.next = next
+
class Solution:
def swapPairs(self, head: ListNode) -> ListNode:
- dummy = ListNode(0) #设置一个虚拟头结点
- dummy.next = head
- cur = dummy
- while cur.next and cur.next.next:
- tmp = cur.next #记录临时节点
- tmp1 = cur.next.next.next #记录临时节点
-
- cur.next = cur.next.next #步骤一
- cur.next.next = tmp #步骤二
- cur.next.next.next = tmp1 #步骤三
+ res = ListNode(next=head)
+ pre = res
+
+ # 必须有pre的下一个和下下个才能交换,否则说明已经交换结束了
+ while pre.next and pre.next.next:
+ cur = pre.next
+ post = pre.next.next
- cur = cur.next.next #cur移动两位,准备下一轮交换
- return dummy.next
+ # pre,cur,post对应最左,中间的,最右边的节点
+ cur.next = post.next
+ post.next = cur
+ pre.next = post
+
+ pre = pre.next.next
+ return res.next
```
Go:
From ca576c5bd0a62769c4b080028e7092d7fb945890 Mon Sep 17 00:00:00 2001
From: Eyjan_Huang <81480748+Eyjan-Huang@users.noreply.github.com>
Date: Fri, 20 Aug 2021 03:29:26 +0800
Subject: [PATCH 0050/3468] =?UTF-8?q?=E6=9B=B4=E6=AD=A3=200232.=E7=94=A8?=
=?UTF-8?q?=E6=A0=88=E5=AE=9E=E7=8E=B0=E9=98=9F=E5=88=97.md=20python?=
=?UTF-8?q?=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
添加限制条件,仅在栈不为空的情况下才允许后续pop()和peek()的操作
---
...\210\345\256\236\347\216\260\351\230\237\345\210\227.md" | 6 ++++++
1 file changed, 6 insertions(+)
diff --git "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md"
index 46d884d356..27a3de4e5e 100644
--- "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md"
+++ "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md"
@@ -304,6 +304,9 @@ class MyQueue:
2. 如果out没有元素,就把in里面的元素(除了第一个)依次pop后装进out里面
3. 直接把in剩下的元素pop出来,就是queue头部的
"""
+ if self.empty:
+ return None
+
if self.stack_out:
return self.stack_out.pop()
else:
@@ -317,6 +320,9 @@ class MyQueue:
1. 查out有没有元素,有就把最上面的返回
2. 如果out没有元素,就把in最下面的返回
"""
+ if self.empty:
+ return None
+
if self.stack_out:
return self.stack_out[-1]
else:
From b3ac4e3b2a20e9063c8294a40720a062d8c1f1b7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9E=81=E5=AE=A2=E5=AD=A6=E4=BC=9F?=
Date: Thu, 19 Aug 2021 16:33:56 +0800
Subject: [PATCH 0051/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=2024.=20=E4=B8=A4?=
=?UTF-8?q?=E4=B8=A4=E4=BA=A4=E6=8D=A2=E9=93=BE=E8=A1=A8=E4=B8=AD=E7=9A=84?=
=?UTF-8?q?=E8=8A=82=E7=82=B9=20Swift=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...55\347\232\204\350\212\202\347\202\271.md" | 21 +++++++++++++++++++
1 file changed, 21 insertions(+)
diff --git "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md"
index 91e566ddd6..55a6bb5077 100644
--- "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md"
+++ "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md"
@@ -248,6 +248,27 @@ fun swapPairs(head: ListNode?): ListNode? {
}
```
+Swift:
+```swift
+func swapPairs(_ head: ListNode?) -> ListNode? {
+ if head == nil || head?.next == nil {
+ return head
+ }
+ let dummyHead: ListNode = ListNode(-1, head)
+ var current: ListNode? = dummyHead
+ while current?.next != nil && current?.next?.next != nil {
+ let temp1 = current?.next
+ let temp2 = current?.next?.next?.next
+
+ current?.next = current?.next?.next
+ current?.next?.next = temp1
+ current?.next?.next?.next = temp2
+
+ current = current?.next?.next
+ }
+ return dummyHead.next
+}
+```
-----------------------
From 3e754148100b7bf5894e9ab543121613fb0c8cb2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9E=81=E5=AE=A2=E5=AD=A6=E4=BC=9F?=
Date: Fri, 20 Aug 2021 13:37:18 +0800
Subject: [PATCH 0052/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=2019.=E5=88=A0?=
=?UTF-8?q?=E9=99=A4=E9=93=BE=E8=A1=A8=E7=9A=84=E5=80=92=E6=95=B0=E7=AC=AC?=
=?UTF-8?q?N=E4=B8=AA=E8=8A=82=E7=82=B9=20Swift=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...4N\344\270\252\350\212\202\347\202\271.md" | 25 +++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md"
index 3e1a682c45..4d3e57db35 100644
--- "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md"
+++ "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md"
@@ -204,6 +204,31 @@ fun removeNthFromEnd(head: ListNode?, n: Int): ListNode? {
}
```
+Swift:
+```swift
+func removeNthFromEnd(_ head: ListNode?, _ n: Int) -> ListNode? {
+ if head == nil {
+ return nil
+ }
+ if n == 0 {
+ return head
+ }
+ let dummyHead = ListNode(-1, head)
+ var fast: ListNode? = dummyHead
+ var slow: ListNode? = dummyHead
+ // fast 前移 n
+ for _ in 0 ..< n {
+ fast = fast?.next
+ }
+ while fast?.next != nil {
+ fast = fast?.next
+ slow = slow?.next
+ }
+ slow?.next = slow?.next?.next
+ return dummyHead.next
+}
+```
+
-----------------------
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
* B站视频:[代码随想录](https://space.bilibili.com/525438321)
From 0498cf3935ead6fdf06495e00004ed8e6f2146e3 Mon Sep 17 00:00:00 2001
From: binglu18 <57309010+binglu18@users.noreply.github.com>
Date: Fri, 20 Aug 2021 15:33:59 +0800
Subject: [PATCH 0053/3468] =?UTF-8?q?=E8=A1=A5=E5=85=850102.=E4=BA=8C?=
=?UTF-8?q?=E5=8F=89=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86?=
=?UTF-8?q?.md=20515=E9=A2=98java=E8=A7=A3=E6=B3=95=E4=BA=8C?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...02\345\272\217\351\201\215\345\216\206.md" | 23 +++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
index 0f9b2df659..4a26d853fe 100644
--- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
+++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
@@ -1070,6 +1070,29 @@ class Solution {
return retVal;
}
}
+
+方法二:用一个max变量来保存最大值
+class Solution {
+ public List largestValues(TreeNode root) {
+ Queue queue = new LinkedList();
+ List result = new ArrayList<>();
+ if (root!=null) queue.add(root);
+ while(!queue.isEmpty()){
+ int size = queue.size();
+ int max = Integer.MIN_VALUE; // 初始化为最小值
+ for(int i=0;i
Date: Fri, 20 Aug 2021 15:37:35 +0800
Subject: [PATCH 0054/3468] =?UTF-8?q?update=20=E6=96=B9=E6=B3=95=E4=BA=8C?=
=?UTF-8?q?=200102.=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F?=
=?UTF-8?q?=E9=81=8D=E5=8E=86.md=20515=E9=A2=98java=20format?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...32\204\345\261\202\345\272\217\351\201\215\345\216\206.md" | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
index 4a26d853fe..15d00af2ea 100644
--- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
+++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
@@ -1070,8 +1070,10 @@ class Solution {
return retVal;
}
}
+```
-方法二:用一个max变量来保存最大值
+```java
+//方法二:用一个max变量来保存最大值
class Solution {
public List largestValues(TreeNode root) {
Queue queue = new LinkedList();
From 07d27158b238812f603f250794b9a681f71e7f8e Mon Sep 17 00:00:00 2001
From: binglu18 <57309010+binglu18@users.noreply.github.com>
Date: Fri, 20 Aug 2021 16:10:24 +0800
Subject: [PATCH 0055/3468] =?UTF-8?q?update=200102.=E4=BA=8C=E5=8F=89?=
=?UTF-8?q?=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86.md=20515?=
=?UTF-8?q?java=E8=A7=A3=E6=B3=95=E4=BA=8Cformat?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...45\261\202\345\272\217\351\201\215\345\216\206.md" | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
index 15d00af2ea..d0f584fe04 100644
--- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
+++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
@@ -1078,16 +1078,17 @@ class Solution {
public List largestValues(TreeNode root) {
Queue queue = new LinkedList();
List result = new ArrayList<>();
- if (root!=null) queue.add(root);
+ if (root != null) queue.add(root);
+
while(!queue.isEmpty()){
int size = queue.size();
int max = Integer.MIN_VALUE; // 初始化为最小值
- for(int i=0;i
Date: Fri, 20 Aug 2021 17:14:16 +0800
Subject: [PATCH 0056/3468] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200150.=E9=80=86?=
=?UTF-8?q?=E6=B3=A2=E5=85=B0=E8=A1=A8=E8=BE=BE=E5=BC=8F=E6=B1=82=E5=80=BC?=
=?UTF-8?q?.md=20python=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
用format string提升效率,增加可读性,避免使用索引访问,直接使用切片。
---
...76\345\274\217\346\261\202\345\200\274.md" | 24 ++++++++++---------
1 file changed, 13 insertions(+), 11 deletions(-)
diff --git "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md"
index 2b2943377e..bcde7d5ba4 100644
--- "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md"
+++ "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md"
@@ -223,17 +223,19 @@ var evalRPN = function(tokens) {
python3
```python
-def evalRPN(tokens) -> int:
- stack = list()
- for i in range(len(tokens)):
- if tokens[i] not in ["+", "-", "*", "/"]:
- stack.append(tokens[i])
- else:
- tmp1 = stack.pop()
- tmp2 = stack.pop()
- res = eval(tmp2+tokens[i]+tmp1)
- stack.append(str(int(res)))
- return stack[-1]
+class Solution:
+ def evalRPN(self, tokens: List[str]) -> int:
+ stack = []
+ for item in tokens:
+ if item not in {"+", "-", "*", "/"}:
+ stack.append(item)
+ else:
+ first_num, second_num = stack.pop(), stack.pop()
+ stack.append(
+ int(eval(f'{second_num} {item} {first_num}')) # 第一个出来的在运算符后面
+ )
+ return int(stack.pop()) # 如果一开始只有一个数,那么会是字符串形式的
+
```
From f07fb2fd195b54809474dd8e4997e2654f453f04 Mon Sep 17 00:00:00 2001
From: ColorQian <82574279+ColorQian@users.noreply.github.com>
Date: Sat, 21 Aug 2021 17:21:06 +0800
Subject: [PATCH 0057/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=200102.?=
=?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D?=
=?UTF-8?q?=E5=8E=86.md=20=E4=B8=AD=E7=9A=84=20=20111.=E4=BA=8C=E5=8F=89?=
=?UTF-8?q?=E6=A0=91=E7=9A=84=E6=9C=80=E5=B0=8F=E6=B7=B1=E5=BA=A6=20?=
=?UTF-8?q?=E7=9A=84java=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...02\345\272\217\351\201\215\345\216\206.md" | 37 +++++++++++++++++++
1 file changed, 37 insertions(+)
diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
index dde5af47b6..b9bc05e06c 100644
--- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
+++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
@@ -1597,6 +1597,43 @@ public:
```
Java:
+```java
+class Solution {
+
+ public int minDepth(TreeNode root){
+ if (root == null) {
+ return 0;
+ }
+
+ Queue queue = new LinkedList<>();
+ queue.offer(root);
+ int depth = 0;
+
+ while (!queue.isEmpty()){
+
+ int size = queue.size();
+ depth++;
+
+ TreeNode cur = null;
+ for (int i = 0; i < size; i++) {
+ cur = queue.poll();
+
+ //如果当前节点的左右孩子都为空,直接返回最小深度
+ if (cur.left == null && cur.right == null){
+ return depth;
+ }
+
+ if (cur.left != null) queue.offer(cur.left);
+ if (cur.right != null) queue.offer(cur.right);
+ }
+
+
+ }
+
+ return depth;
+ }
+}
+```
Python 3:
From 34444b3a4d7c5fb5eb9d9bc61bc300c47e08a39d Mon Sep 17 00:00:00 2001
From: yqq
Date: Sat, 21 Aug 2021 18:00:54 +0800
Subject: [PATCH 0058/3468] fix 0494
---
...4.\347\233\256\346\240\207\345\222\214.md" | 19 ++++++++++---------
1 file changed, 10 insertions(+), 9 deletions(-)
diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md"
index 77b3c76d5c..5d89f7dce5 100644
--- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md"
+++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md"
@@ -19,15 +19,15 @@
示例:
-输入:nums: [1, 1, 1, 1, 1], S: 3
-输出:5
+输入:nums: [1, 1, 1, 1, 1], S: 3
+输出:5
-解释:
--1+1+1+1+1 = 3
-+1-1+1+1+1 = 3
-+1+1-1+1+1 = 3
-+1+1+1-1+1 = 3
-+1+1+1+1-1 = 3
+解释:
+-1+1+1+1+1 = 3
++1-1+1+1+1 = 3
++1+1-1+1+1 = 3
++1+1+1-1+1 = 3
++1+1+1+1-1 = 3
一共有5种方法让最终目标和为3。
@@ -202,6 +202,7 @@ public:
for (int i = 0; i < nums.size(); i++) sum += nums[i];
if (S > sum) return 0; // 此时没有方案
if ((S + sum) % 2 == 1) return 0; // 此时没有方案
+ if (S + sum < 0) return 0; // 以确保bagSize为正数
int bagSize = (S + sum) / 2;
vector dp(bagSize + 1, 0);
dp[0] = 1;
@@ -311,7 +312,7 @@ Javascript:
const findTargetSumWays = (nums, target) => {
const sum = nums.reduce((a, b) => a+b);
-
+
if(target > sum) {
return 0;
}
From 4e19ab8d0072e9007e782fad643723000e0c7727 Mon Sep 17 00:00:00 2001
From: XuDaHaoRen <1547794387@qq.com>
Date: Sat, 21 Aug 2021 21:21:03 +0800
Subject: [PATCH 0059/3468] =?UTF-8?q?C:/Program=20Files/Git/problems/1-40?=
=?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=93=BE=E6=8E=A5=E2=80=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...36\346\226\207\345\255\220\344\270\262.md" | 6 ++---
...11\346\225\260\344\271\213\345\222\214.md" | 10 +++----
...27\346\257\215\347\273\204\345\220\210.md" | 18 ++++++-------
...33\346\225\260\344\271\213\345\222\214.md" | 26 +++++++++----------
...4N\344\270\252\350\212\202\347\202\271.md" | 4 +--
...10\347\232\204\346\213\254\345\217\267.md" | 2 +-
...55\347\232\204\350\212\202\347\202\271.md" | 4 +--
...73\351\231\244\345\205\203\347\264\240.md" | 6 ++---
.../0028.\345\256\236\347\216\260strStr.md" | 2 +-
...00\344\270\252\346\216\222\345\210\227.md" | 2 +-
...00\344\270\252\344\275\215\347\275\256.md" | 8 +++---
...22\345\205\245\344\275\215\347\275\256.md" | 2 +-
...7.\350\247\243\346\225\260\347\213\254.md" | 8 +++---
...04\345\220\210\346\200\273\345\222\214.md" | 18 ++++++-------
...\345\220\210\346\200\273\345\222\214II.md" | 16 ++++++------
...2.\346\216\245\351\233\250\346\260\264.md" | 6 ++---
...\350\267\203\346\270\270\346\210\217II.md" | 6 ++---
...6.\345\205\250\346\216\222\345\210\227.md" | 8 +++---
...\345\205\250\346\216\222\345\210\227II.md" | 8 +++---
19 files changed, 80 insertions(+), 80 deletions(-)
diff --git "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md"
index de20feebc5..c78b827c80 100644
--- "a/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md"
+++ "b/problems/0005.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262.md"
@@ -10,7 +10,7 @@
# 5.最长回文子串
-题目链接:https://leetcode-cn.com/problems/longest-palindromic-substring/
+[力扣题目链接](https://leetcode-cn.com/problems/longest-palindromic-substring/)
给你一个字符串 s,找到 s 中最长的回文子串。
@@ -30,11 +30,11 @@
示例 4:
* 输入:s = "ac"
* 输出:"a"
-
+
# 思路
-本题和[647.回文子串](https://mp.weixin.qq.com/s/2WetyP6IYQ6VotegepVpEw) 差不多是一样的,但647.回文子串更基本一点,建议可以先做647.回文子串
+本题和[647.回文子串](https://programmercarl.com/0647.回文子串.html) 差不多是一样的,但647.回文子串更基本一点,建议可以先做647.回文子串
## 暴力解法
diff --git "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md"
index 9a3a8d5bbe..ac5561f2a6 100644
--- "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md"
+++ "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md"
@@ -8,11 +8,11 @@
-> 用哈希表解决了[两数之和](https://mp.weixin.qq.com/s/uVAtjOHSeqymV8FeQbliJQ),那么三数之和呢?
+> 用哈希表解决了[两数之和](https://programmercarl.com/0001.两数之和.html),那么三数之和呢?
# 第15题. 三数之和
-https://leetcode-cn.com/problems/3sum/
+[力扣题目链接](https://leetcode-cn.com/problems/3sum/)
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
@@ -163,13 +163,13 @@ public:
# 思考题
-既然三数之和可以使用双指针法,我们之前讲过的[1.两数之和](https://mp.weixin.qq.com/s/vaMsLnH-f7_9nEK4Cuu3KQ),可不可以使用双指针法呢?
+既然三数之和可以使用双指针法,我们之前讲过的[1.两数之和](https://programmercarl.com/0001.两数之和.html),可不可以使用双指针法呢?
如果不能,题意如何更改就可以使用双指针法呢? **大家留言说出自己的想法吧!**
-两数之和 就不能使用双指针法,因为[1.两数之和](https://mp.weixin.qq.com/s/vaMsLnH-f7_9nEK4Cuu3KQ)要求返回的是索引下表, 而双指针法一定要排序,一旦排序之后原数组的索引就被改变了。
+两数之和 就不能使用双指针法,因为[1.两数之和](https://programmercarl.com/0001.两数之和.html)要求返回的是索引下表, 而双指针法一定要排序,一旦排序之后原数组的索引就被改变了。
-如果[1.两数之和](https://mp.weixin.qq.com/s/vaMsLnH-f7_9nEK4Cuu3KQ)要求返回的是数值的话,就可以使用双指针法了。
+如果[1.两数之和](https://programmercarl.com/0001.两数之和.html)要求返回的是数值的话,就可以使用双指针法了。
diff --git "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md"
index 7aa72e1b98..1ebf6f49d6 100644
--- "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md"
+++ "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md"
@@ -9,7 +9,7 @@
# 17.电话号码的字母组合
-题目链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/
+[力扣题目链接](https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/)
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
@@ -29,7 +29,7 @@
如果输入"233"呢,那么就三层for循环,如果"2333"呢,就四层for循环.......
-大家应该感觉出和[回溯算法:求组合问题!](https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ)遇到的一样的问题,就是这for循环的层数如何写出来,此时又是回溯法登场的时候了。
+大家应该感觉出和[回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)遇到的一样的问题,就是这for循环的层数如何写出来,此时又是回溯法登场的时候了。
理解本题后,要解决如下三个问题:
@@ -58,7 +58,7 @@ const string letterMap[10] = {
## 回溯法来解决n个for循环的问题
-对于回溯法还不了解的同学看这篇:[关于回溯算法,你该了解这些!](https://mp.weixin.qq.com/s/gjSgJbNbd1eAA5WkA-HeWw)
+对于回溯法还不了解的同学看这篇:[关于回溯算法,你该了解这些!](https://programmercarl.com/回溯算法理论基础.html)
例如:输入:"23",抽象为树形结构,如图所示:
@@ -75,7 +75,7 @@ const string letterMap[10] = {
再来看参数,参数指定是有题目中给的string digits,然后还要有一个参数就是int型的index。
-注意这个index可不是 [回溯算法:求组合问题!](https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ)和[回溯算法:求组合总和!](https://mp.weixin.qq.com/s/HX7WW6ixbFZJASkRnCTC3w)中的startIndex了。
+注意这个index可不是 [回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)和[回溯算法:求组合总和!](https://programmercarl.com/0216.组合总和III.html)中的startIndex了。
这个index是记录遍历第几个数字了,就是用来遍历digits的(题目中给出数字字符串),同时index也表示树的深度。
@@ -120,9 +120,9 @@ for (int i = 0; i < letters.size(); i++) {
}
```
-**注意这里for循环,可不像是在[回溯算法:求组合问题!](https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ)和[回溯算法:求组合总和!](https://mp.weixin.qq.com/s/HX7WW6ixbFZJASkRnCTC3w)中从startIndex开始遍历的**。
+**注意这里for循环,可不像是在[回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)和[回溯算法:求组合总和!](https://programmercarl.com/0216.组合总和III.html)中从startIndex开始遍历的**。
-**因为本题每一个数字代表的是不同集合,也就是求不同集合之间的组合,而[77. 组合](https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ)和[216.组合总和III](https://mp.weixin.qq.com/s/HX7WW6ixbFZJASkRnCTC3w)都是是求同一个集合中的组合!**
+**因为本题每一个数字代表的是不同集合,也就是求不同集合之间的组合,而[77. 组合](https://programmercarl.com/0077.组合.html)和[216.组合总和III](https://programmercarl.com/0216.组合总和III.html)都是是求同一个集合中的组合!**
注意:输入1 * #按键等等异常情况
@@ -134,7 +134,7 @@ for (int i = 0; i < letters.size(); i++) {
## C++代码
-关键地方都讲完了,按照[关于回溯算法,你该了解这些!](https://mp.weixin.qq.com/s/gjSgJbNbd1eAA5WkA-HeWw)中的回溯法模板,不难写出如下C++代码:
+关键地方都讲完了,按照[关于回溯算法,你该了解这些!](https://programmercarl.com/回溯算法理论基础.html)中的回溯法模板,不难写出如下C++代码:
```c++
@@ -224,13 +224,13 @@ public:
};
```
-我不建议把回溯藏在递归的参数里这种写法,很不直观,我在[二叉树:以为使用了递归,其实还隐藏着回溯](https://mp.weixin.qq.com/s/ivLkHzWdhjQQD1rQWe6zWA)这篇文章中也深度分析了,回溯隐藏在了哪里。
+我不建议把回溯藏在递归的参数里这种写法,很不直观,我在[二叉树:以为使用了递归,其实还隐藏着回溯](https://programmercarl.com/二叉树中递归带着回溯.html)这篇文章中也深度分析了,回溯隐藏在了哪里。
所以大家可以按照版本一来写就可以了。
# 总结
-本篇将题目的三个要点一一列出,并重点强调了和前面讲解过的[77. 组合](https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ)和[216.组合总和III](https://mp.weixin.qq.com/s/HX7WW6ixbFZJASkRnCTC3w)的区别,本题是多个集合求组合,所以在回溯的搜索过程中,都有一些细节需要注意的。
+本篇将题目的三个要点一一列出,并重点强调了和前面讲解过的[77. 组合](https://programmercarl.com/0077.组合.html)和[216.组合总和III](https://programmercarl.com/0216.组合总和III.html)的区别,本题是多个集合求组合,所以在回溯的搜索过程中,都有一些细节需要注意的。
其实本题不算难,但也处处是细节,大家还要自己亲自动手写一写。
diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md"
index 75cd9e8e0a..66f06f6463 100644
--- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md"
+++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md"
@@ -12,7 +12,7 @@
# 第18题. 四数之和
-https://leetcode-cn.com/problems/4sum/
+[力扣题目链接](https://leetcode-cn.com/problems/4sum/)
题意:给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。
@@ -31,37 +31,37 @@ https://leetcode-cn.com/problems/4sum/
# 思路
-四数之和,和[15.三数之和](https://mp.weixin.qq.com/s/QfTNEByq1YlNSXRKEumwHg)是一个思路,都是使用双指针法, 基本解法就是在[15.三数之和](https://mp.weixin.qq.com/s/QfTNEByq1YlNSXRKEumwHg) 的基础上再套一层for循环。
+四数之和,和[15.三数之和](https://programmercarl.com/0015.三数之和.html)是一个思路,都是使用双指针法, 基本解法就是在[15.三数之和](https://programmercarl.com/0015.三数之和.html) 的基础上再套一层for循环。
但是有一些细节需要注意,例如: 不要判断`nums[k] > target` 就返回了,三数之和 可以通过 `nums[i] > 0` 就返回了,因为 0 已经是确定的数了,四数之和这道题目 target是任意值。(大家亲自写代码就能感受出来)
-[15.三数之和](https://mp.weixin.qq.com/s/QfTNEByq1YlNSXRKEumwHg)的双指针解法是一层for循环num[i]为确定值,然后循环内有left和right下表作为双指针,找到nums[i] + nums[left] + nums[right] == 0。
+[15.三数之和](https://programmercarl.com/0015.三数之和.html)的双指针解法是一层for循环num[i]为确定值,然后循环内有left和right下表作为双指针,找到nums[i] + nums[left] + nums[right] == 0。
四数之和的双指针解法是两层for循环nums[k] + nums[i]为确定值,依然是循环内有left和right下表作为双指针,找出nums[k] + nums[i] + nums[left] + nums[right] == target的情况,三数之和的时间复杂度是O(n^2),四数之和的时间复杂度是O(n^3) 。
那么一样的道理,五数之和、六数之和等等都采用这种解法。
-对于[15.三数之和](https://mp.weixin.qq.com/s/QfTNEByq1YlNSXRKEumwHg)双指针法就是将原本暴力O(n^3)的解法,降为O(n^2)的解法,四数之和的双指针解法就是将原本暴力O(n^4)的解法,降为O(n^3)的解法。
+对于[15.三数之和](https://programmercarl.com/0015.三数之和.html)双指针法就是将原本暴力O(n^3)的解法,降为O(n^2)的解法,四数之和的双指针解法就是将原本暴力O(n^4)的解法,降为O(n^3)的解法。
-之前我们讲过哈希表的经典题目:[454.四数相加II](https://mp.weixin.qq.com/s/12g_w6RzHuEpFts1pT6BWw),相对于本题简单很多,因为本题是要求在一个集合中找出四个数相加等于target,同时四元组不能重复。
+之前我们讲过哈希表的经典题目:[454.四数相加II](https://programmercarl.com/0454.四数相加II.html),相对于本题简单很多,因为本题是要求在一个集合中找出四个数相加等于target,同时四元组不能重复。
-而[454.四数相加II](https://mp.weixin.qq.com/s/12g_w6RzHuEpFts1pT6BWw)是四个独立的数组,只要找到A[i] + B[j] + C[k] + D[l] = 0就可以,不用考虑有重复的四个元素相加等于0的情况,所以相对于本题还是简单了不少!
+而[454.四数相加II](https://programmercarl.com/0454.四数相加II.html)是四个独立的数组,只要找到A[i] + B[j] + C[k] + D[l] = 0就可以,不用考虑有重复的四个元素相加等于0的情况,所以相对于本题还是简单了不少!
我们来回顾一下,几道题目使用了双指针法。
双指针法将时间复杂度O(n^2)的解法优化为 O(n)的解法。也就是降一个数量级,题目如下:
-* [27.移除元素](https://mp.weixin.qq.com/s/RMkulE4NIb6XsSX83ra-Ww)
-* [15.三数之和](https://mp.weixin.qq.com/s/QfTNEByq1YlNSXRKEumwHg)
-* [18.四数之和](https://mp.weixin.qq.com/s/nQrcco8AZJV1pAOVjeIU_g)
+* [27.移除元素](https://programmercarl.com/0027.移除元素.html)
+* [15.三数之和](https://programmercarl.com/0015.三数之和.html)
+* [18.四数之和](https://programmercarl.com/0018.四数之和.html)
操作链表:
-* [206.反转链表](https://mp.weixin.qq.com/s/ckEvIVGcNLfrz6OLOMoT0A)
-* [19.删除链表的倒数第N个节点](https://mp.weixin.qq.com/s/gxu65X1343xW_sBrkTz0Eg)
-* [面试题 02.07. 链表相交](https://mp.weixin.qq.com/s/BhfFfaGvt9Zs7UmH4YehZw)
-* [142题.环形链表II](https://mp.weixin.qq.com/s/gt_VH3hQTqNxyWcl1ECSbQ)
+* [206.反转链表](https://programmercarl.com/0206.翻转链表.html)
+* [19.删除链表的倒数第N个节点](https://programmercarl.com/0019.删除链表的倒数第N个节点.html)
+* [面试题 02.07. 链表相交](https://programmercarl.com/面试题02.07.链表相交.html)
+* [142题.环形链表II](https://programmercarl.com/0142.环形链表II.html)
双指针法在字符串题目中还有很多应用,后面还会介绍到。
diff --git "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md" "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md"
index 3e1a682c45..2a08cbc054 100644
--- "a/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md"
+++ "b/problems/0019.\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.md"
@@ -11,7 +11,7 @@
## 19.删除链表的倒数第N个节点
-题目链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/
+[力扣题目链接](https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/)
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
@@ -41,7 +41,7 @@
分为如下几步:
-* 首先这里我推荐大家使用虚拟头结点,这样方面处理删除实际头结点的逻辑,如果虚拟头结点不清楚,可以看这篇: [链表:听说用虚拟头节点会方便很多?](https://mp.weixin.qq.com/s/L5aanfALdLEwVWGvyXPDqA)
+* 首先这里我推荐大家使用虚拟头结点,这样方面处理删除实际头结点的逻辑,如果虚拟头结点不清楚,可以看这篇: [链表:听说用虚拟头节点会方便很多?](https://programmercarl.com/0203.移除链表元素.html)
* 定义fast指针和slow指针,初始值为虚拟头结点,如图:
diff --git "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md"
index a26aa3082f..3fbdfba65b 100644
--- "a/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md"
+++ "b/problems/0020.\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md"
@@ -12,7 +12,7 @@
# 20. 有效的括号
-https://leetcode-cn.com/problems/valid-parentheses/
+[力扣题目链接](https://leetcode-cn.com/problems/valid-parentheses/)
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
diff --git "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md"
index 91e566ddd6..1926a8ca87 100644
--- "a/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md"
+++ "b/problems/0024.\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271.md"
@@ -9,7 +9,7 @@
## 24. 两两交换链表中的节点
-https://leetcode-cn.com/problems/swap-nodes-in-pairs/
+[力扣题目链接](https://leetcode-cn.com/problems/swap-nodes-in-pairs/)
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
@@ -24,7 +24,7 @@ https://leetcode-cn.com/problems/swap-nodes-in-pairs/
建议使用虚拟头结点,这样会方便很多,要不然每次针对头结点(没有前一个指针指向头结点),还要单独处理。
-对虚拟头结点的操作,还不熟悉的话,可以看这篇[链表:听说用虚拟头节点会方便很多?](https://mp.weixin.qq.com/s/L5aanfALdLEwVWGvyXPDqA)。
+对虚拟头结点的操作,还不熟悉的话,可以看这篇[链表:听说用虚拟头节点会方便很多?](https://programmercarl.com/0203.移除链表元素.html)。
接下来就是交换相邻两个元素了,**此时一定要画图,不画图,操作多个指针很容易乱,而且要操作的先后顺序**
diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md"
index 3819d6a56e..fadd4d7e11 100644
--- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md"
+++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md"
@@ -9,7 +9,7 @@
## 27. 移除元素
-题目地址:https://leetcode-cn.com/problems/remove-element/
+[力扣题目链接](https://leetcode-cn.com/problems/remove-element/)
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
@@ -34,7 +34,7 @@
**要知道数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。**
-数组的基础知识可以看这里[程序员算法面试中,必须掌握的数组理论知识](https://mp.weixin.qq.com/s/c2KABb-Qgg66HrGf8z-8Og)。
+数组的基础知识可以看这里[程序员算法面试中,必须掌握的数组理论知识](https://programmercarl.com/数组理论基础.html)。
### 暴力解法
@@ -106,7 +106,7 @@ public:
* 时间复杂度:$O(n)$
* 空间复杂度:$O(1)$
-旧文链接:[数组:就移除个元素很难么?](https://mp.weixin.qq.com/s/wj0T-Xs88_FHJFwayElQlA)
+旧文链接:[数组:就移除个元素很难么?](https://programmercarl.com/0027.移除元素.html)
## 相关题目推荐
diff --git "a/problems/0028.\345\256\236\347\216\260strStr.md" "b/problems/0028.\345\256\236\347\216\260strStr.md"
index 4fb418f03a..481be2eded 100644
--- "a/problems/0028.\345\256\236\347\216\260strStr.md"
+++ "b/problems/0028.\345\256\236\347\216\260strStr.md"
@@ -11,7 +11,7 @@
# 28. 实现 strStr()
-https://leetcode-cn.com/problems/implement-strstr/
+[力扣题目链接](https://leetcode-cn.com/problems/implement-strstr/)
实现 strStr() 函数。
diff --git "a/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md" "b/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md"
index 10ac9df4d1..05321a9a44 100644
--- "a/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md"
+++ "b/problems/0031.\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227.md"
@@ -11,7 +11,7 @@
# 31.下一个排列
-链接:https://leetcode-cn.com/problems/next-permutation/
+[力扣题目链接](https://leetcode-cn.com/problems/next-permutation/)
实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
diff --git "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md" "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md"
index f83de1a865..68dd797df4 100644
--- "a/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md"
+++ "b/problems/0034.\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.md"
@@ -35,8 +35,8 @@
对二分还不了解的同学先做这两题:
-* [704.二分查找](https://mp.weixin.qq.com/s/4X-8VRgnYRGd5LYGZ33m4w)
-* [35.搜索插入位置](https://mp.weixin.qq.com/s/fCf5QbPDtE6SSlZ1yh_q8Q)
+* [704.二分查找](https://programmercarl.com/0704.二分查找.html)
+* [35.搜索插入位置](https://programmercarl.com/0035.搜索插入位置.html)
下面我来把所有情况都讨论一下。
@@ -56,9 +56,9 @@
## 寻找右边界
-先来寻找右边界,至于二分查找,如果看过[704.二分查找](https://mp.weixin.qq.com/s/4X-8VRgnYRGd5LYGZ33m4w)就会知道,二分查找中什么时候用while (left <= right),有什么时候用while (left < right),其实只要清楚**循环不变量**,很容易区分两种写法。
+先来寻找右边界,至于二分查找,如果看过[704.二分查找](https://programmercarl.com/0704.二分查找.html)就会知道,二分查找中什么时候用while (left <= right),有什么时候用while (left < right),其实只要清楚**循环不变量**,很容易区分两种写法。
-那么这里我采用while (left <= right)的写法,区间定义为[left, right],即左闭又闭的区间(如果这里有点看不懂了,强烈建议把[704.二分查找](https://mp.weixin.qq.com/s/4X-8VRgnYRGd5LYGZ33m4w)这篇文章先看了,704题目做了之后再做这道题目就好很多了)
+那么这里我采用while (left <= right)的写法,区间定义为[left, right],即左闭又闭的区间(如果这里有点看不懂了,强烈建议把[704.二分查找](https://programmercarl.com/0704.二分查找.html)这篇文章先看了,704题目做了之后再做这道题目就好很多了)
确定好:计算出来的右边界是不包好target的右边界,左边界同理。
diff --git "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md" "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md"
index 4ad8a80c20..1fc0714331 100644
--- "a/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md"
+++ "b/problems/0035.\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.md"
@@ -11,7 +11,7 @@
# 35.搜索插入位置
-题目地址:https://leetcode-cn.com/problems/search-insert-position/
+[力扣题目链接](https://leetcode-cn.com/problems/search-insert-position/)
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
diff --git "a/problems/0037.\350\247\243\346\225\260\347\213\254.md" "b/problems/0037.\350\247\243\346\225\260\347\213\254.md"
index 64be7013f4..b6fa0d6e62 100644
--- "a/problems/0037.\350\247\243\346\225\260\347\213\254.md"
+++ "b/problems/0037.\350\247\243\346\225\260\347\213\254.md"
@@ -11,7 +11,7 @@
## 37. 解数独
-题目地址:https://leetcode-cn.com/problems/sudoku-solver/
+[力扣题目链接](https://leetcode-cn.com/problems/sudoku-solver/)
编写一个程序,通过填充空格来解决数独问题。
@@ -40,11 +40,11 @@
怎么做二维递归呢?
-大家已经跟着「代码随想录」刷过了如下回溯法题目,例如:[77.组合(组合问题)](https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ),[131.分割回文串(分割问题)](https://mp.weixin.qq.com/s/Pb1epUTbU8fHIht-g_MS5Q),[78.子集(子集问题)](https://mp.weixin.qq.com/s/NNRzX-vJ_pjK4qxohd_LtA),[46.全排列(排列问题)](https://mp.weixin.qq.com/s/SCOjeMX1t41wcvJq49GhMw),以及[51.N皇后(N皇后问题)](https://mp.weixin.qq.com/s/lU_QwCMj6g60nh8m98GAWg),其实这些题目都是一维递归。
+大家已经跟着「代码随想录」刷过了如下回溯法题目,例如:[77.组合(组合问题)](https://programmercarl.com/0077.组合.html),[131.分割回文串(分割问题)](https://programmercarl.com/0131.分割回文串.html),[78.子集(子集问题)](https://programmercarl.com/0078.子集.html),[46.全排列(排列问题)](https://programmercarl.com/0046.全排列.html),以及[51.N皇后(N皇后问题)](https://programmercarl.com/0051.N皇后.html),其实这些题目都是一维递归。
**如果以上这几道题目没有做过的话,不建议上来就做这道题哈!**
-[N皇后问题](https://mp.weixin.qq.com/s/lU_QwCMj6g60nh8m98GAWg)是因为每一行每一列只放一个皇后,只需要一层for循环遍历一行,递归来来遍历列,然后一行一列确定皇后的唯一位置。
+[N皇后问题](https://programmercarl.com/0051.N皇后.html)是因为每一行每一列只放一个皇后,只需要一层for循环遍历一行,递归来来遍历列,然后一行一列确定皇后的唯一位置。
本题就不一样了,**本题中棋盘的每一个位置都要放一个数字,并检查数字是否合法,解数独的树形结构要比N皇后更宽更深**。
@@ -59,7 +59,7 @@
**递归函数的返回值需要是bool类型,为什么呢?**
-因为解数独找到一个符合的条件(就在树的叶子节点上)立刻就返回,相当于找从根节点到叶子节点一条唯一路径,所以需要使用bool返回值,这一点在[回溯算法:N皇后问题](https://mp.weixin.qq.com/s/lU_QwCMj6g60nh8m98GAWg)中已经介绍过了,一样的道理。
+因为解数独找到一个符合的条件(就在树的叶子节点上)立刻就返回,相当于找从根节点到叶子节点一条唯一路径,所以需要使用bool返回值,这一点在[回溯算法:N皇后问题](https://programmercarl.com/0051.N皇后.html)中已经介绍过了,一样的道理。
代码如下:
diff --git "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md" "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md"
index 0c452e225c..8cea3b9e89 100644
--- "a/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md"
+++ "b/problems/0039.\347\273\204\345\220\210\346\200\273\345\222\214.md"
@@ -9,7 +9,7 @@
## 39. 组合总和
-题目链接:https://leetcode-cn.com/problems/combination-sum/
+[力扣题目链接](https://leetcode-cn.com/problems/combination-sum/)
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
@@ -44,14 +44,14 @@ candidates 中的数字可以无限制重复被选取。
题目中的**无限制重复被选取,吓得我赶紧想想 出现0 可咋办**,然后看到下面提示:1 <= candidates[i] <= 200,我就放心了。
-本题和[回溯算法:求组合问题!](https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ),[回溯算法:求组合总和!](https://mp.weixin.qq.com/s/HX7WW6ixbFZJASkRnCTC3w)和区别是:本题没有数量要求,可以无限重复,但是有总和的限制,所以间接的也是有个数的限制。
+本题和[回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html),[回溯算法:求组合总和!](https://programmercarl.com/0216.组合总和III.html)和区别是:本题没有数量要求,可以无限重复,但是有总和的限制,所以间接的也是有个数的限制。
本题搜索的过程抽象成树形结构如下:

注意图中叶子节点的返回条件,因为本题没有组合数量要求,仅仅是总和的限制,所以递归没有层数的限制,只要选取的元素总和超过target,就返回!
-而在[回溯算法:求组合问题!](https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ)和[回溯算法:求组合总和!](https://mp.weixin.qq.com/s/HX7WW6ixbFZJASkRnCTC3w) 中都可以知道要递归K层,因为要取k个元素的组合。
+而在[回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)和[回溯算法:求组合总和!](https://programmercarl.com/0216.组合总和III.html) 中都可以知道要递归K层,因为要取k个元素的组合。
## 回溯三部曲
@@ -65,9 +65,9 @@ candidates 中的数字可以无限制重复被选取。
**本题还需要startIndex来控制for循环的起始位置,对于组合问题,什么时候需要startIndex呢?**
-我举过例子,如果是一个集合来求组合的话,就需要startIndex,例如:[回溯算法:求组合问题!](https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ),[回溯算法:求组合总和!](https://mp.weixin.qq.com/s/HX7WW6ixbFZJASkRnCTC3w)。
+我举过例子,如果是一个集合来求组合的话,就需要startIndex,例如:[回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html),[回溯算法:求组合总和!](https://programmercarl.com/0216.组合总和III.html)。
-如果是多个集合取组合,各个集合之间相互不影响,那么就不用startIndex,例如:[回溯算法:电话号码的字母组合](https://mp.weixin.qq.com/s/e2ua2cmkE_vpYjM3j6HY0A)
+如果是多个集合取组合,各个集合之间相互不影响,那么就不用startIndex,例如:[回溯算法:电话号码的字母组合](https://programmercarl.com/0017.电话号码的字母组合.html)
**注意以上我只是说求组合的情况,如果是排列问题,又是另一套分析的套路,后面我再讲解排列的时候就重点介绍**。
@@ -103,7 +103,7 @@ if (sum == target) {
单层for循环依然是从startIndex开始,搜索candidates集合。
-**注意本题和[回溯算法:求组合问题!](https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ)、[回溯算法:求组合总和!](https://mp.weixin.qq.com/s/HX7WW6ixbFZJASkRnCTC3w)的一个区别是:本题元素为可重复选取的**。
+**注意本题和[回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)、[回溯算法:求组合总和!](https://programmercarl.com/0216.组合总和III.html)的一个区别是:本题元素为可重复选取的**。
如何重复选取呢,看代码,注释部分:
@@ -117,7 +117,7 @@ for (int i = startIndex; i < candidates.size(); i++) {
}
```
-按照[关于回溯算法,你该了解这些!](https://mp.weixin.qq.com/s/gjSgJbNbd1eAA5WkA-HeWw)中给出的模板,不难写出如下C++完整代码:
+按照[关于回溯算法,你该了解这些!](https://programmercarl.com/回溯算法理论基础.html)中给出的模板,不难写出如下C++完整代码:
```CPP
// 版本一
@@ -213,14 +213,14 @@ public:
## 总结
-本题和我们之前讲过的[回溯算法:求组合问题!](https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ)、[回溯算法:求组合总和!](https://mp.weixin.qq.com/s/HX7WW6ixbFZJASkRnCTC3w)有两点不同:
+本题和我们之前讲过的[回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)、[回溯算法:求组合总和!](https://programmercarl.com/0216.组合总和III.html)有两点不同:
* 组合没有数量要求
* 元素可无限重复选取
针对这两个问题,我都做了详细的分析。
-并且给出了对于组合问题,什么时候用startIndex,什么时候不用,并用[回溯算法:电话号码的字母组合](https://mp.weixin.qq.com/s/e2ua2cmkE_vpYjM3j6HY0A)做了对比。
+并且给出了对于组合问题,什么时候用startIndex,什么时候不用,并用[回溯算法:电话号码的字母组合](https://programmercarl.com/0017.电话号码的字母组合.html)做了对比。
最后还给出了本题的剪枝优化,这个优化如果是初学者的话并不容易想到。
diff --git "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md"
index 5ea11ca7e7..fdccf140d4 100644
--- "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md"
+++ "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md"
@@ -11,7 +11,7 @@
## 40.组合总和II
-题目链接:https://leetcode-cn.com/problems/combination-sum-ii/
+[力扣题目链接](https://leetcode-cn.com/problems/combination-sum-ii/)
给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
@@ -44,12 +44,12 @@ candidates 中的每个数字在每个组合中只能使用一次。
**如果对回溯算法基础还不了解的话,我还特意录制了一期视频:[带你学透回溯算法(理论篇)](https://www.bilibili.com/video/BV1cy4y167mM/)** 可以结合题解和视频一起看,希望对大家理解回溯算法有所帮助。
-这道题目和[39.组合总和](https://mp.weixin.qq.com/s/FLg8G6EjVcxBjwCbzpACPw)如下区别:
+这道题目和[39.组合总和](https://programmercarl.com/0039.组合总和.html)如下区别:
1. 本题candidates 中的每个数字在每个组合中只能使用一次。
-2. 本题数组candidates的元素是有重复的,而[39.组合总和](https://mp.weixin.qq.com/s/FLg8G6EjVcxBjwCbzpACPw)是无重复元素的数组candidates
+2. 本题数组candidates的元素是有重复的,而[39.组合总和](https://programmercarl.com/0039.组合总和.html)是无重复元素的数组candidates
-最后本题和[39.组合总和](https://mp.weixin.qq.com/s/FLg8G6EjVcxBjwCbzpACPw)要求一样,解集不能包含重复的组合。
+最后本题和[39.组合总和](https://programmercarl.com/0039.组合总和.html)要求一样,解集不能包含重复的组合。
**本题的难点在于区别2中:集合(数组candidates)有重复元素,但还不能有重复的组合**。
@@ -84,7 +84,7 @@ candidates 中的每个数字在每个组合中只能使用一次。
* **递归函数参数**
-与[39.组合总和](https://mp.weixin.qq.com/s/FLg8G6EjVcxBjwCbzpACPw)套路相同,此题还需要加一个bool型数组used,用来记录同一树枝上的元素是否使用过。
+与[39.组合总和](https://programmercarl.com/0039.组合总和.html)套路相同,此题还需要加一个bool型数组used,用来记录同一树枝上的元素是否使用过。
这个集合去重的重任就是used来完成的。
@@ -98,7 +98,7 @@ void backtracking(vector& candidates, int target, int sum, int startIndex,
* **递归终止条件**
-与[39.组合总和](https://mp.weixin.qq.com/s/FLg8G6EjVcxBjwCbzpACPw)相同,终止条件为 `sum > target` 和 `sum == target`。
+与[39.组合总和](https://programmercarl.com/0039.组合总和.html)相同,终止条件为 `sum > target` 和 `sum == target`。
代码如下:
@@ -116,7 +116,7 @@ if (sum == target) {
* **单层搜索的逻辑**
-这里与[39.组合总和](https://mp.weixin.qq.com/s/FLg8G6EjVcxBjwCbzpACPw)最大的不同就是要去重了。
+这里与[39.组合总和](https://programmercarl.com/0039.组合总和.html)最大的不同就是要去重了。
前面我们提到:要去重的是“同一树层上的使用过”,如果判断同一树层上元素(相同的元素)是否使用过了呢。
@@ -244,7 +244,7 @@ public:
## 总结
-本题同样是求组合总和,但就是因为其数组candidates有重复元素,而要求不能有重复的组合,所以相对于[39.组合总和](https://mp.weixin.qq.com/s/FLg8G6EjVcxBjwCbzpACPw)难度提升了不少。
+本题同样是求组合总和,但就是因为其数组candidates有重复元素,而要求不能有重复的组合,所以相对于[39.组合总和](https://programmercarl.com/0039.组合总和.html)难度提升了不少。
**关键是去重的逻辑,代码很简单,网上一搜一大把,但几乎没有能把这块代码含义讲明白的,基本都是给出代码,然后说这就是去重了,究竟怎么个去重法也是模棱两可**。
diff --git "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" "b/problems/0042.\346\216\245\351\233\250\346\260\264.md"
index 22c8c0efc9..522b10f9b7 100644
--- "a/problems/0042.\346\216\245\351\233\250\346\260\264.md"
+++ "b/problems/0042.\346\216\245\351\233\250\346\260\264.md"
@@ -11,7 +11,7 @@
# 42. 接雨水
-题目链接:https://leetcode-cn.com/problems/trapping-rain-water/
+[力扣题目链接](https://leetcode-cn.com/problems/trapping-rain-water/)
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
@@ -27,7 +27,7 @@
* 输入:height = [4,2,0,3,2,5]
* 输出:9
-
+
# 思路
@@ -186,7 +186,7 @@ public:
这个解法可以说是最不好理解的了,所以下面我花了大量的篇幅来介绍这种方法。
-单调栈就是保持栈内元素有序。和[栈与队列:单调队列](https://mp.weixin.qq.com/s/Xgcqx5eBa3xZabt_LurnNQ)一样,需要我们自己维持顺序,没有现成的容器可以用。
+单调栈就是保持栈内元素有序。和[栈与队列:单调队列](https://programmercarl.com/0239.滑动窗口最大值.html)一样,需要我们自己维持顺序,没有现成的容器可以用。
### 准备工作
diff --git "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md" "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md"
index d946315b8e..8dd5983801 100644
--- "a/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md"
+++ "b/problems/0045.\350\267\263\350\267\203\346\270\270\346\210\217II.md"
@@ -11,7 +11,7 @@
## 45.跳跃游戏II
-题目地址:https://leetcode-cn.com/problems/jump-game-ii/
+[力扣题目链接](https://leetcode-cn.com/problems/jump-game-ii/)
给定一个非负整数数组,你最初位于数组的第一个位置。
@@ -30,7 +30,7 @@
## 思路
-本题相对于[55.跳跃游戏](https://mp.weixin.qq.com/s/606_N9j8ACKCODoCbV1lSA)还是难了不少。
+本题相对于[55.跳跃游戏](https://programmercarl.com/0055.跳跃游戏.html)还是难了不少。
但思路是相似的,还是要看最大覆盖范围。
@@ -132,7 +132,7 @@ public:
## 总结
-相信大家可以发现,这道题目相当于[55.跳跃游戏](https://mp.weixin.qq.com/s/606_N9j8ACKCODoCbV1lSA)难了不止一点。
+相信大家可以发现,这道题目相当于[55.跳跃游戏](https://programmercarl.com/0055.跳跃游戏.html)难了不止一点。
但代码又十分简单,贪心就是这么巧妙。
diff --git "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" "b/problems/0046.\345\205\250\346\216\222\345\210\227.md"
index c0626fb759..df9394eb6f 100644
--- "a/problems/0046.\345\205\250\346\216\222\345\210\227.md"
+++ "b/problems/0046.\345\205\250\346\216\222\345\210\227.md"
@@ -9,7 +9,7 @@
## 46.全排列
-题目链接:https://leetcode-cn.com/problems/permutations/
+[力扣题目链接](https://leetcode-cn.com/problems/permutations/)
给定一个 没有重复 数字的序列,返回其所有可能的全排列。
@@ -30,11 +30,11 @@
**如果对回溯算法基础还不了解的话,我还特意录制了一期视频:[带你学透回溯算法(理论篇)](https://www.bilibili.com/video/BV1cy4y167mM/)** 可以结合题解和视频一起看,希望对大家理解回溯算法有所帮助。
-此时我们已经学习了[77.组合问题](https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ)、 [131.分割回文串](https://mp.weixin.qq.com/s/Pb1epUTbU8fHIht-g_MS5Q)和[78.子集问题](https://mp.weixin.qq.com/s/NNRzX-vJ_pjK4qxohd_LtA),接下来看一看排列问题。
+此时我们已经学习了[77.组合问题](https://programmercarl.com/0077.组合.html)、 [131.分割回文串](https://programmercarl.com/0131.分割回文串.html)和[78.子集问题](https://programmercarl.com/0078.子集.html),接下来看一看排列问题。
相信这个排列问题就算是让你用for循环暴力把结果搜索出来,这个暴力也不是很好写。
-所以正如我们在[关于回溯算法,你该了解这些!](https://mp.weixin.qq.com/s/gjSgJbNbd1eAA5WkA-HeWw)所讲的为什么回溯法是暴力搜索,效率这么低,还要用它?
+所以正如我们在[关于回溯算法,你该了解这些!](https://programmercarl.com/回溯算法理论基础.html)所讲的为什么回溯法是暴力搜索,效率这么低,还要用它?
**因为一些问题能暴力搜出来就已经很不错了!**
@@ -84,7 +84,7 @@ if (path.size() == nums.size()) {
* 单层搜索的逻辑
-这里和[77.组合问题](https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ)、[131.切割问题](https://mp.weixin.qq.com/s/Pb1epUTbU8fHIht-g_MS5Q)和[78.子集问题](https://mp.weixin.qq.com/s/NNRzX-vJ_pjK4qxohd_LtA)最大的不同就是for循环里不用startIndex了。
+这里和[77.组合问题](https://programmercarl.com/0077.组合.html)、[131.切割问题](https://programmercarl.com/0131.分割回文串.html)和[78.子集问题](https://programmercarl.com/0078.子集.html)最大的不同就是for循环里不用startIndex了。
因为排列问题,每次都要从头开始搜索,例如元素1在[1,2]中已经使用过了,但是在[2,1]中还要再使用一次1。
diff --git "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md" "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md"
index 614282993b..01706eb3d3 100644
--- "a/problems/0047.\345\205\250\346\216\222\345\210\227II.md"
+++ "b/problems/0047.\345\205\250\346\216\222\345\210\227II.md"
@@ -10,7 +10,7 @@
## 47.全排列 II
-题目链接:https://leetcode-cn.com/problems/permutations-ii/
+[力扣题目链接](https://leetcode-cn.com/problems/permutations-ii/)
给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
@@ -33,11 +33,11 @@
**如果对回溯算法基础还不了解的话,我还特意录制了一期视频:[带你学透回溯算法(理论篇)](https://www.bilibili.com/video/BV1cy4y167mM/)** 可以结合题解和视频一起看,希望对大家理解回溯算法有所帮助。
-这道题目和[回溯算法:排列问题!](https://mp.weixin.qq.com/s/SCOjeMX1t41wcvJq49GhMw)的区别在与**给定一个可包含重复数字的序列**,要返回**所有不重复的全排列**。
+这道题目和[回溯算法:排列问题!](https://programmercarl.com/0046.全排列.html)的区别在与**给定一个可包含重复数字的序列**,要返回**所有不重复的全排列**。
这里又涉及到去重了。
-在[回溯算法:求组合总和(三)](https://mp.weixin.qq.com/s/_1zPYk70NvHsdY8UWVGXmQ) 、[回溯算法:求子集问题(二)](https://mp.weixin.qq.com/s/WJ4JNDRJgsW3eUN72Hh3uQ)我们分别详细讲解了组合问题和子集问题如何去重。
+在[回溯算法:求组合总和(三)](https://programmercarl.com/0040.组合总和II.html) 、[回溯算法:求子集问题(二)](https://programmercarl.com/0090.子集II.html)我们分别详细讲解了组合问题和子集问题如何去重。
那么排列问题其实也是一样的套路。
@@ -51,7 +51,7 @@
**一般来说:组合问题和排列问题是在树形结构的叶子节点上收集结果,而子集问题就是取树上所有节点的结果**。
-在[回溯算法:排列问题!](https://mp.weixin.qq.com/s/SCOjeMX1t41wcvJq49GhMw)中已经详解讲解了排列问题的写法,在[回溯算法:求组合总和(三)](https://mp.weixin.qq.com/s/_1zPYk70NvHsdY8UWVGXmQ) 、[回溯算法:求子集问题(二)](https://mp.weixin.qq.com/s/WJ4JNDRJgsW3eUN72Hh3uQ)中详细讲解的去重的写法,所以这次我就不用回溯三部曲分析了,直接给出代码,如下:
+在[回溯算法:排列问题!](https://programmercarl.com/0046.全排列.html)中已经详解讲解了排列问题的写法,在[回溯算法:求组合总和(三)](https://programmercarl.com/0040.组合总和II.html) 、[回溯算法:求子集问题(二)](https://programmercarl.com/0090.子集II.html)中详细讲解的去重的写法,所以这次我就不用回溯三部曲分析了,直接给出代码,如下:
## C++代码
From 92db66643f54eb4326dd7ec3878de9d792f7b2bf Mon Sep 17 00:00:00 2001
From: ironartisan
Date: Sun, 22 Aug 2021 11:10:11 +0800
Subject: [PATCH 0060/3468] =?UTF-8?q?=E6=9B=B4=E6=AD=A30015.=E4=B8=89?=
=?UTF-8?q?=E6=95=B0=E4=B9=8B=E5=92=8C=E9=94=99=E5=88=AB=E5=AD=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md"
index ac5561f2a6..19c7d0fe39 100644
--- "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md"
+++ "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md"
@@ -37,7 +37,7 @@
两层for循环就可以确定 a 和b 的数值了,可以使用哈希法来确定 0-(a+b) 是否在 数组里出现过,其实这个思路是正确的,但是我们有一个非常棘手的问题,就是题目中说的不可以包含重复的三元组。
-把符合条件的三元组放进vector中,然后在去去重,这样是非常费时的,很容易超时,也是这道题目通过率如此之低的根源所在。
+把符合条件的三元组放进vector中,然后再去重,这样是非常费时的,很容易超时,也是这道题目通过率如此之低的根源所在。
去重的过程不好处理,有很多小细节,如果在面试中很难想到位。
@@ -95,7 +95,7 @@ public:

-拿这个nums数组来举例,首先将数组排序,然后有一层for循环,i从下表0的地方开始,同时定一个下表left 定义在i+1的位置上,定义下表right 在数组结尾的位置上。
+拿这个nums数组来举例,首先将数组排序,然后有一层for循环,i从下标0的地方开始,同时定一个下标left 定义在i+1的位置上,定义下表right 在数组结尾的位置上。
依然还是在数组中找到 abc 使得a + b +c =0,我们这里相当于 a = nums[i] b = nums[left] c = nums[right]。
From 8df67e8513567d0e686ccc93bdbf867cc9dd80ef Mon Sep 17 00:00:00 2001
From: ironartisan
Date: Sun, 22 Aug 2021 11:12:15 +0800
Subject: [PATCH 0061/3468] =?UTF-8?q?=E6=9B=B4=E6=AD=A30015.=E4=B8=89?=
=?UTF-8?q?=E6=95=B0=E4=B9=8B=E5=92=8C=E9=94=99=E5=88=AB=E5=AD=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...015.\344\270\211\346\225\260\344\271\213\345\222\214.md" | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md"
index 19c7d0fe39..1adb2d24c6 100644
--- "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md"
+++ "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md"
@@ -95,11 +95,11 @@ public:

-拿这个nums数组来举例,首先将数组排序,然后有一层for循环,i从下标0的地方开始,同时定一个下标left 定义在i+1的位置上,定义下表right 在数组结尾的位置上。
+拿这个nums数组来举例,首先将数组排序,然后有一层for循环,i从下标0的地方开始,同时定一个下标left 定义在i+1的位置上,定义下标right 在数组结尾的位置上。
依然还是在数组中找到 abc 使得a + b +c =0,我们这里相当于 a = nums[i] b = nums[left] c = nums[right]。
-接下来如何移动left 和right呢, 如果nums[i] + nums[left] + nums[right] > 0 就说明 此时三数之和大了,因为数组是排序后了,所以right下表就应该向左移动,这样才能让三数之和小一些。
+接下来如何移动left 和right呢, 如果nums[i] + nums[left] + nums[right] > 0 就说明 此时三数之和大了,因为数组是排序后了,所以right下标就应该向左移动,这样才能让三数之和小一些。
如果 nums[i] + nums[left] + nums[right] < 0 说明 此时 三数之和小了,left 就向右移动,才能让三数之和大一些,直到left与right相遇为止。
@@ -167,7 +167,7 @@ public:
如果不能,题意如何更改就可以使用双指针法呢? **大家留言说出自己的想法吧!**
-两数之和 就不能使用双指针法,因为[1.两数之和](https://programmercarl.com/0001.两数之和.html)要求返回的是索引下表, 而双指针法一定要排序,一旦排序之后原数组的索引就被改变了。
+两数之和 就不能使用双指针法,因为[1.两数之和](https://programmercarl.com/0001.两数之和.html)要求返回的是索引下标, 而双指针法一定要排序,一旦排序之后原数组的索引就被改变了。
如果[1.两数之和](https://programmercarl.com/0001.两数之和.html)要求返回的是数值的话,就可以使用双指针法了。
From b1ca98e30bb1dd33b9f11ea3160672b418d28af9 Mon Sep 17 00:00:00 2001
From: xbhog <2251195014@qq.com>
Date: Sun, 22 Aug 2021 20:11:43 +0800
Subject: [PATCH 0062/3468] =?UTF-8?q?01=E8=83=8C=E5=8C=85=E4=B8=AD=20?=
=?UTF-8?q?=E9=A2=98=E5=8F=B70494=20=E7=9B=AE=E6=A0=87=E5=92=8C=EF=BC=8C?=
=?UTF-8?q?=E4=BF=AE=E6=94=B9Java=E7=89=88=E4=BB=A3=E7=A0=81=E9=97=AE?=
=?UTF-8?q?=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
"problems/0494.\347\233\256\346\240\207\345\222\214.md" | 1 +
1 file changed, 1 insertion(+)
diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md"
index 77b3c76d5c..f1f4f3d411 100644
--- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md"
+++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md"
@@ -248,6 +248,7 @@ class Solution {
for (int i = 0; i < nums.length; i++) sum += nums[i];
if ((target + sum) % 2 != 0) return 0;
int size = (target + sum) / 2;
+ if(size < 0) size = -size;
int[] dp = new int[size + 1];
dp[0] = 1;
for (int i = 0; i < nums.length; i++) {
From 2de05852ea1d92eb667268f253c81d4cc7f1789e Mon Sep 17 00:00:00 2001
From: ironartisan
Date: Sun, 22 Aug 2021 21:48:40 +0800
Subject: [PATCH 0063/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A00018.=E5=9B=9B?=
=?UTF-8?q?=E6=95=B0=E4=B9=8B=E5=92=8C=E5=8F=8C=E6=8C=87=E9=92=88=E6=B3=95?=
=?UTF-8?q?python3=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...33\346\225\260\344\271\213\345\222\214.md" | 28 ++++++++++++++++++-
1 file changed, 27 insertions(+), 1 deletion(-)
diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md"
index 66f06f6463..6af033b901 100644
--- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md"
+++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md"
@@ -167,7 +167,33 @@ class Solution {
Python:
```python
-
+# 双指针法
+class Solution:
+ def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
+
+ nums.sort()
+ n = len(nums)
+ res = []
+ for i in range(n):
+ if i > 0 and nums[i] == nums[i - 1]: continue
+ for k in range(i+1, n):
+ if k > i + 1 and nums[k] == nums[k-1]: continue
+ p = k + 1
+ q = n - 1
+
+ while p < q:
+ if nums[i] + nums[k] + nums[p] + nums[q] > target: q -= 1
+ elif nums[i] + nums[k] + nums[p] + nums[q] < target: p += 1
+ else:
+ res.append([nums[i], nums[k], nums[p], nums[q]])
+ while p < q and nums[p] == nums[p + 1]: p += 1
+ while p < q and nums[q] == nums[q - 1]: q -= 1
+ p += 1
+ q -= 1
+ return res
+```
+```python
+# 哈希表法
class Solution(object):
def fourSum(self, nums, target):
"""
From 7a4fade7b4046e057487f7ffb42d800dd7f058e1 Mon Sep 17 00:00:00 2001
From: xsduan98
Date: Mon, 23 Aug 2021 12:32:59 +0800
Subject: [PATCH 0064/3468] =?UTF-8?q?40.=E7=BB=84=E5=90=88=E6=80=BB?=
=?UTF-8?q?=E5=92=8CII=20python=E4=BB=A3=E7=A0=81=E5=9D=97=20=E6=B3=A8?=
=?UTF-8?q?=E9=87=8A=E4=BF=AE=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md"
index fdccf140d4..55b66b226a 100644
--- "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md"
+++ "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md"
@@ -296,7 +296,7 @@ class Solution {
}
```
Python:
-```py
+```python
class Solution:
def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
res = []
From 9359de690b3d7fb8feef7c8f901a29ed9e6d6f43 Mon Sep 17 00:00:00 2001
From: YDLIN <1924723909@qq.com>
Date: Mon, 23 Aug 2021 14:01:14 +0800
Subject: [PATCH 0065/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A00344.=E5=8F=8D?=
=?UTF-8?q?=E8=BD=AC=E5=AD=97=E7=AC=A6=E4=B8=B2=20Swift=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...75\254\345\255\227\347\254\246\344\270\262.md" | 15 ++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)
diff --git "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md"
index 763097bee8..8925d0e17a 100644
--- "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md"
+++ "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md"
@@ -203,7 +203,20 @@ var reverseString = function(s) {
};
```
-
+Swift:
+
+```swift
+func reverseString(_ s: inout [Character]) {
+ var l = 0
+ var r = s.count - 1
+ while l < r {
+ // 使用元祖
+ (s[l], s[r]) = (s[r], s[l])
+ l += 1
+ r -= 1
+ }
+}
+```
From c619a05139c93fc0b8f8bb729cd9d400d076e935 Mon Sep 17 00:00:00 2001
From: Steve0x2a
Date: Mon, 23 Aug 2021 15:31:43 +0800
Subject: [PATCH 0066/3468] =?UTF-8?q?=E4=BF=AE=E6=94=B90102=E4=BA=8C?=
=?UTF-8?q?=E5=8F=89=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86?=
=?UTF-8?q?Python=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
原Python代码的队列变量名写错,无法运行。
---
...32\204\345\261\202\345\272\217\351\201\215\345\216\206.md" | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
index 391609114b..45f7ee69ae 100644
--- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
+++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
@@ -93,10 +93,10 @@ class Solution:
if not root:
return []
- quene = [root]
+ queue = [root]
out_list = []
- while quene:
+ while queue:
length = len(queue)
in_list = []
for _ in range(length):
From 5e960b4fcd1c5e52de20dfc19af8674b63c3eb9f Mon Sep 17 00:00:00 2001
From: hailincai
Date: Mon, 23 Aug 2021 07:42:21 -0400
Subject: [PATCH 0067/3468] =?UTF-8?q?Update=200435.=E6=97=A0=E9=87=8D?=
=?UTF-8?q?=E5=8F=A0=E5=8C=BA=E9=97=B4.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
First java code not working, I test in the IntellJ with jdk 11, the Arrays.sort is not right ( doesn't make the left edge sort from small to big ), so the non overlapping area count fail. I fix it. Sort by end first, if end is same, sort by start
---
...207\215\345\217\240\345\214\272\351\227\264.md" | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md"
index 70d0ff3adc..f5da71c725 100644
--- "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md"
+++ "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md"
@@ -186,27 +186,27 @@ Java:
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
if (intervals.length < 2) return 0;
+
Arrays.sort(intervals, new Comparator() {
@Override
public int compare(int[] o1, int[] o2) {
- if (o1[0] != o2[0]) {
+ if (o1[1] != o2[1]) {
return Integer.compare(o1[1],o2[1]);
} else {
- return Integer.compare(o2[0],o1[0]);
+ return Integer.compare(o1[0],o2[0]);
}
}
});
- int count = 0;
+ int count = 1;
int edge = intervals[0][1];
for (int i = 1; i < intervals.length; i++) {
- if (intervals[i][0] < edge) {
- count++;
- } else {
+ if (edge <= intervals[i][0]){
+ count ++; //non overlap + 1
edge = intervals[i][1];
}
}
- return count;
+ return intervals.length - count;
}
}
```
From 0a8191b5c3f0f1ad66887fb0c0ceebcbfb88846e Mon Sep 17 00:00:00 2001
From: XuDaHaoRen <1547794387@qq.com>
Date: Mon, 23 Aug 2021 19:45:17 +0800
Subject: [PATCH 0068/3468] =?UTF-8?q?47~541=E8=BF=9E=E6=8E=A5=E6=9B=B4?=
=?UTF-8?q?=E6=96=B0=E2=80=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
"problems/0051.N\347\232\207\345\220\216.md" | 2 +-
...47\345\255\220\345\272\217\345\222\214.md" | 2 +-
...01\350\247\204\345\210\222\357\274\211.md" | 6 +-
...63\350\267\203\346\270\270\346\210\217.md" | 2 +-
...10\345\271\266\345\214\272\351\227\264.md" | 4 +-
...\346\227\213\347\237\251\351\230\265II.md" | 4 +-
...15\345\220\214\350\267\257\345\276\204.md" | 4 +-
...\345\220\214\350\267\257\345\276\204II.md" | 10 +-
...0.\347\210\254\346\245\274\346\242\257.md" | 6 +-
...14\345\214\205\347\211\210\346\234\254.md" | 13 ++-
...26\350\276\221\350\267\235\347\246\273.md" | 4 +-
"problems/0077.\347\273\204\345\220\210.md" | 8 +-
...04\345\220\210\344\274\230\345\214\226.md" | 4 +-
"problems/0078.\345\255\220\351\233\206.md" | 22 ++---
...47\347\232\204\347\237\251\345\275\242.md" | 50 ++--------
"problems/0090.\345\255\220\351\233\206II.md" | 10 +-
...\345\216\237IP\345\234\260\345\235\200.md" | 18 ++--
...11\346\220\234\347\264\242\346\240\221.md" | 4 +-
...11\346\220\234\347\264\242\346\240\221.md" | 8 +-
...70\345\220\214\347\232\204\346\240\221.md" | 10 +-
...60\344\272\214\345\217\211\346\240\221.md" | 2 +-
...02\345\272\217\351\201\215\345\216\206.md" | 92 +++----------------
...00\345\244\247\346\267\261\345\272\246.md" | 10 +-
...40\344\272\214\345\217\211\346\240\221.md" | 6 +-
...11\346\220\234\347\264\242\346\240\221.md" | 24 ++---
...41\344\272\214\345\217\211\346\240\221.md" | 10 +-
...00\345\260\217\346\267\261\345\272\246.md" | 8 +-
...57\345\276\204\346\200\273\345\222\214.md" | 6 +-
...04\345\255\220\345\272\217\345\210\227.md" | 4 +-
...02\347\202\271\346\214\207\351\222\210.md" | 4 +-
...00\344\275\263\346\227\266\346\234\272.md" | 2 +-
...\344\275\263\346\227\266\346\234\272II.md" | 2 +-
...01\350\247\204\345\210\222\357\274\211.md" | 19 ++--
...344\275\263\346\227\266\346\234\272III.md" | 4 +-
...60\345\255\227\344\271\213\345\222\214.md" | 12 +--
...62\345\233\236\346\226\207\344\270\262.md" | 6 +-
...\345\233\236\346\226\207\344\270\262II.md" | 8 +-
...4.\345\212\240\346\262\271\347\253\231.md" | 2 +-
...06\345\217\221\347\263\226\346\236\234.md" | 2 +-
...25\350\257\215\346\213\206\345\210\206.md" | 16 ++--
...57\345\275\242\351\223\276\350\241\250.md" | 2 +-
...\345\275\242\351\223\276\350\241\250II.md" | 6 +-
...76\345\274\217\346\261\202\345\200\274.md" | 48 +++++-----
...14\347\232\204\345\215\225\350\257\215.md" | 8 +-
...70\344\272\244\351\223\276\350\241\250.md" | 2 +-
...\344\275\263\346\227\266\346\234\272IV.md" | 8 +-
...13\350\275\254\346\225\260\347\273\204.md" | 10 +-
...23\345\256\266\345\212\253\350\210\215.md" | 2 +-
...2.\345\277\253\344\271\220\346\225\260.md" | 4 +-
...76\350\241\250\345\205\203\347\264\240.md" | 12 +--
...04\345\255\227\347\254\246\344\270\262.md" | 2 +-
...73\350\275\254\351\223\276\350\241\250.md" | 2 +-
...04\345\255\220\346\225\260\347\273\204.md" | 2 +-
...\345\256\266\345\212\253\350\210\215II.md" | 8 +-
...345\220\210\346\200\273\345\222\214III.md" | 16 ++--
...02\347\202\271\344\270\252\346\225\260.md" | 10 +-
...27\345\256\236\347\216\260\346\240\210.md" | 69 ++++++--------
...54\344\272\214\345\217\211\346\240\221.md" | 15 ++-
...36\347\216\260\351\230\237\345\210\227.md" | 58 +++++-------
...36\346\226\207\351\223\276\350\241\250.md" | 2 +-
...54\345\205\261\347\245\226\345\205\210.md" | 12 +--
...54\345\205\261\347\245\226\345\205\210.md" | 4 +-
...43\346\234\200\345\244\247\345\200\274.md" | 6 +-
...15\345\274\202\344\275\215\350\257\215.md" | 4 +-
...00\346\234\211\350\267\257\345\276\204.md" | 4 +-
...50\345\271\263\346\226\271\346\225\260.md" | 53 ++---------
...3.\347\247\273\345\212\250\351\233\266.md" | 8 +-
...07\345\255\220\345\272\217\345\210\227.md" | 12 +--
...53\345\206\267\345\206\273\346\234\237.md" | 8 +-
...66\351\222\261\345\205\221\346\215\242.md" | 8 +-
...11\346\216\222\350\241\214\347\250\213.md" | 12 +--
...345\256\266\345\212\253\350\210\215III.md" | 6 +-
...64\346\225\260\346\213\206\345\210\206.md" | 5 +-
...54\345\255\227\347\254\246\344\270\262.md" | 23 +++--
...30\351\242\221\345\205\203\347\264\240.md" | 2 +-
...04\347\232\204\344\272\244\351\233\206.md" | 24 +----
...06\345\212\250\345\272\217\345\210\227.md" | 4 +-
...10\346\200\273\345\222\214\342\205\243.md" | 10 +-
...3.\350\265\216\351\207\221\344\277\241.md" | 4 +-
...55\345\255\220\345\272\217\345\210\227.md" | 2 +-
...66\345\255\220\344\271\213\345\222\214.md" | 6 +-
...15\345\273\272\351\230\237\345\210\227.md" | 16 ++--
...11\345\222\214\345\255\220\351\233\206.md" | 10 +-
...15\345\217\240\345\214\272\351\227\264.md" | 6 +-
...55\347\232\204\350\212\202\347\202\271.md" | 4 +-
...25\347\210\206\346\260\224\347\220\203.md" | 2 +-
...\346\225\260\347\233\270\345\212\240II.md" | 7 +-
...06\345\217\221\351\245\274\345\271\262.md" | 4 +-
...20\345\255\227\347\254\246\344\270\262.md" | 10 +-
...77\347\232\204\345\221\250\351\225\277.md" | 2 +-
...4.\344\270\200\345\222\214\351\233\266.md" | 6 +-
...36\345\255\220\345\272\217\345\210\227.md" | 12 +--
...4.\347\233\256\346\240\207\345\222\214.md" | 33 ++++---
...4\345\244\247\345\205\203\347\264\240I.md" | 12 +--
...55\347\232\204\344\274\227\346\225\260.md" | 8 +-
...\345\244\247\345\205\203\347\264\240II.md" | 8 +-
...42\351\202\243\345\245\221\346\225\260.md" | 10 +-
...13\350\247\222\347\232\204\345\200\274.md" | 14 +--
...07\345\255\220\345\272\217\345\210\227.md" | 4 +-
...\351\222\261\345\205\221\346\215\242II.md" | 10 +-
...17\347\273\235\345\257\271\345\267\256.md" | 4 +-
...72\347\264\257\345\212\240\346\240\221.md" | 6 +-
...\345\255\227\347\254\246\344\270\262II.md" | 39 ++++----
103 files changed, 491 insertions(+), 669 deletions(-)
diff --git "a/problems/0051.N\347\232\207\345\220\216.md" "b/problems/0051.N\347\232\207\345\220\216.md"
index 387e75c3bf..5404b620f8 100644
--- "a/problems/0051.N\347\232\207\345\220\216.md"
+++ "b/problems/0051.N\347\232\207\345\220\216.md"
@@ -9,7 +9,7 @@
## 第51题. N皇后
-题目链接: https://leetcode-cn.com/problems/n-queens/
+[力扣题目链接](https://leetcode-cn.com/problems/n-queens/)
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md"
index cba7d6c7be..5315997896 100644
--- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md"
+++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214.md"
@@ -9,7 +9,7 @@
## 53. 最大子序和
-题目地址:https://leetcode-cn.com/problems/maximum-subarray/
+[力扣题目链接](https://leetcode-cn.com/problems/maximum-subarray/)
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
diff --git "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md"
index 0932c77ff0..1efd7e12b2 100644
--- "a/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md"
+++ "b/problems/0053.\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md"
@@ -8,7 +8,7 @@
## 53. 最大子序和
-题目地址:https://leetcode-cn.com/problems/maximum-subarray/
+[力扣题目链接](https://leetcode-cn.com/problems/maximum-subarray/)
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
@@ -19,7 +19,7 @@
## 思路
-这道题之前我们在讲解贪心专题的时候用贪心算法解决过一次,[贪心算法:最大子序和](https://mp.weixin.qq.com/s/DrjIQy6ouKbpletQr0g1Fg)。
+这道题之前我们在讲解贪心专题的时候用贪心算法解决过一次,[贪心算法:最大子序和](https://programmercarl.com/0053.最大子序和.html)。
这次我们用动态规划的思路再来分析一次。
@@ -87,7 +87,7 @@ public:
## 总结
-这道题目用贪心也很巧妙,但有一点绕,需要仔细想一想,如果想回顾一下贪心就看这里吧:[贪心算法:最大子序和](https://mp.weixin.qq.com/s/DrjIQy6ouKbpletQr0g1Fg)
+这道题目用贪心也很巧妙,但有一点绕,需要仔细想一想,如果想回顾一下贪心就看这里吧:[贪心算法:最大子序和](https://programmercarl.com/0053.最大子序和.html)
动规的解法还是很直接的。
diff --git "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md" "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md"
index 0b1c1d368a..c9ebe0fece 100644
--- "a/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md"
+++ "b/problems/0055.\350\267\263\350\267\203\346\270\270\346\210\217.md"
@@ -9,7 +9,7 @@
## 55. 跳跃游戏
-题目链接:https://leetcode-cn.com/problems/jump-game/
+[力扣题目链接](https://leetcode-cn.com/problems/jump-game/)
给定一个非负整数数组,你最初位于数组的第一个位置。
diff --git "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md"
index 441cc63c66..2322951a90 100644
--- "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md"
+++ "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md"
@@ -9,7 +9,7 @@
## 56. 合并区间
-题目链接:https://leetcode-cn.com/problems/merge-intervals/
+[力扣题目链接](https://leetcode-cn.com/problems/merge-intervals/)
给出一个区间的集合,请合并所有重叠的区间。
@@ -126,7 +126,7 @@ public:
那应该怎么办呢?
-正如我贪心系列开篇词[关于贪心算法,你该了解这些!](https://mp.weixin.qq.com/s/O935TaoHE9Eexwe_vSbRAg)中讲解的一样,贪心本来就没有套路,也没有框架,所以各种常规解法需要多接触多练习,自然而然才会想到。
+正如我贪心系列开篇词[关于贪心算法,你该了解这些!](https://programmercarl.com/贪心算法理论基础.html)中讲解的一样,贪心本来就没有套路,也没有框架,所以各种常规解法需要多接触多练习,自然而然才会想到。
「代码随想录」会把贪心常见的经典题目覆盖到,大家只要认真学习打卡就可以了。
diff --git "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md"
index 6df8c83d7f..7d02ff154c 100644
--- "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md"
+++ "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md"
@@ -10,7 +10,7 @@
## 59.螺旋矩阵II
-题目地址:https://leetcode-cn.com/problems/spiral-matrix-ii/
+[力扣题目链接](https://leetcode-cn.com/problems/spiral-matrix-ii/)
给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
@@ -33,7 +33,7 @@
结果运行的时候各种问题,然后开始各种修修补补,最后发现改了这里哪里有问题,改了那里这里又跑不起来了。
-大家还记得我们在这篇文章[数组:每次遇到二分法,都是一看就会,一写就废](https://mp.weixin.qq.com/s/4X-8VRgnYRGd5LYGZ33m4w)中讲解了二分法,提到如果要写出正确的二分法一定要坚持**循环不变量原则**。
+大家还记得我们在这篇文章[数组:每次遇到二分法,都是一看就会,一写就废](https://programmercarl.com/0704.二分查找.html)中讲解了二分法,提到如果要写出正确的二分法一定要坚持**循环不变量原则**。
而求解本题依然是要坚持循环不变量原则。
diff --git "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md" "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md"
index 84c84075ef..ce29cca11c 100644
--- "a/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md"
+++ "b/problems/0062.\344\270\215\345\220\214\350\267\257\345\276\204.md"
@@ -8,7 +8,7 @@
## 62.不同路径
-题目链接:https://leetcode-cn.com/problems/unique-paths/
+[力扣题目链接](https://leetcode-cn.com/problems/unique-paths/)
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
@@ -40,7 +40,7 @@
示例 4:
输入:m = 3, n = 3
输出:6
-
+
提示:
* 1 <= m, n <= 100
* 题目数据保证答案小于等于 2 * 10^9
diff --git "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md" "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md"
index 3df1b30154..c01846bdca 100644
--- "a/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md"
+++ "b/problems/0063.\344\270\215\345\220\214\350\267\257\345\276\204II.md"
@@ -8,7 +8,7 @@
## 63. 不同路径 II
-题目链接:https://leetcode-cn.com/problems/unique-paths-ii/
+[力扣题目链接](https://leetcode-cn.com/problems/unique-paths-ii/)
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
@@ -49,11 +49,11 @@
## 思路
-这道题相对于[62.不同路径](https://mp.weixin.qq.com/s/MGgGIt4QCpFMROE9X9he_A) 就是有了障碍。
+这道题相对于[62.不同路径](https://programmercarl.com/0062.不同路径.html) 就是有了障碍。
第一次接触这种题目的同学可能会有点懵,这有障碍了,应该怎么算呢?
-[62.不同路径](https://mp.weixin.qq.com/s/MGgGIt4QCpFMROE9X9he_A)中我们已经详细分析了没有障碍的情况,有障碍的话,其实就是标记对应的dp table(dp数组)保持初始值(0)就可以了。
+[62.不同路径](https://programmercarl.com/0062.不同路径.html)中我们已经详细分析了没有障碍的情况,有障碍的话,其实就是标记对应的dp table(dp数组)保持初始值(0)就可以了。
动规五部曲:
@@ -77,7 +77,7 @@ if (obstacleGrid[i][j] == 0) { // 当(i, j)没有障碍的时候,再推导dp[i
3. dp数组如何初始化
-在[62.不同路径](https://mp.weixin.qq.com/s/MGgGIt4QCpFMROE9X9he_A)不同路径中我们给出如下的初始化:
+在[62.不同路径](https://programmercarl.com/0062.不同路径.html)不同路径中我们给出如下的初始化:
```
vector> dp(m, vector(n, 0)); // 初始值为0
@@ -159,7 +159,7 @@ public:
## 总结
-本题是[62.不同路径](https://mp.weixin.qq.com/s/MGgGIt4QCpFMROE9X9he_A)的障碍版,整体思路大体一致。
+本题是[62.不同路径](https://programmercarl.com/0062.不同路径.html)的障碍版,整体思路大体一致。
但就算是做过62.不同路径,在做本题也会有感觉遇到障碍无从下手。
diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257.md"
index bb9a757cca..4f049e4acb 100644
--- "a/problems/0070.\347\210\254\346\245\274\346\242\257.md"
+++ "b/problems/0070.\347\210\254\346\245\274\346\242\257.md"
@@ -7,7 +7,7 @@
欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!
## 70. 爬楼梯
-题目地址:https://leetcode-cn.com/problems/climbing-stairs/
+[力扣题目链接](https://leetcode-cn.com/problems/climbing-stairs/)
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
@@ -196,9 +196,9 @@ public:
## 总结
-这道题目和[动态规划:斐波那契数](https://mp.weixin.qq.com/s/ko0zLJplF7n_4TysnPOa_w)题目基本是一样的,但是会发现本题相比[动态规划:斐波那契数](https://mp.weixin.qq.com/s/ko0zLJplF7n_4TysnPOa_w)难多了,为什么呢?
+这道题目和[动态规划:斐波那契数](https://programmercarl.com/0509.斐波那契数.html)题目基本是一样的,但是会发现本题相比[动态规划:斐波那契数](https://programmercarl.com/0509.斐波那契数.html)难多了,为什么呢?
-关键是 [动态规划:斐波那契数](https://mp.weixin.qq.com/s/ko0zLJplF7n_4TysnPOa_w) 题目描述就已经把动规五部曲里的递归公式和如何初始化都给出来了,剩下几部曲也自然而然的推出来了。
+关键是 [动态规划:斐波那契数](https://programmercarl.com/0509.斐波那契数.html) 题目描述就已经把动规五部曲里的递归公式和如何初始化都给出来了,剩下几部曲也自然而然的推出来了。
而本题,就需要逐个分析了,大家现在应该初步感受出[关于动态规划,你该了解这些!](https://leetcode-cn.com/circle/article/tNuNnM/)里给出的动规五部曲了。
diff --git "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md" "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md"
index f7a80f3b98..4410dbaf1d 100644
--- "a/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md"
+++ "b/problems/0070.\347\210\254\346\245\274\346\242\257\345\256\214\345\205\250\350\203\214\345\214\205\347\211\210\346\234\254.md"
@@ -13,7 +13,7 @@
## 70. 爬楼梯
-链接:https://leetcode-cn.com/problems/climbing-stairs/
+[力扣题目链接](https://leetcode-cn.com/problems/climbing-stairs/)
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
@@ -38,7 +38,7 @@
## 思路
-这道题目 我们在[动态规划:爬楼梯](https://mp.weixin.qq.com/s/Ohop0jApSII9xxOMiFhGIw) 中已经讲过一次了,原题其实是一道简单动规的题目。
+这道题目 我们在[动态规划:爬楼梯](https://programmercarl.com/0070.爬楼梯.html) 中已经讲过一次了,原题其实是一道简单动规的题目。
既然这么简单为什么还要讲呢,其实本题稍加改动就是一道面试好题。
@@ -52,7 +52,7 @@
**此时大家应该发现这就是一个完全背包问题了!**
-和昨天的题目[动态规划:377. 组合总和 Ⅳ](https://mp.weixin.qq.com/s/Iixw0nahJWQgbqVNk8k6gA)基本就是一道题了。
+和昨天的题目[动态规划:377. 组合总和 Ⅳ](https://programmercarl.com/0377.组合总和Ⅳ.html)基本就是一道题了。
动规五部曲分析如下:
@@ -62,7 +62,7 @@
2. 确定递推公式
-在[动态规划:494.目标和](https://mp.weixin.qq.com/s/2pWmaohX75gwxvBENS-NCw) 、 [动态规划:518.零钱兑换II](https://mp.weixin.qq.com/s/PlowDsI4WMBOzf3q80AksQ)、[动态规划:377. 组合总和 Ⅳ](https://mp.weixin.qq.com/s/Iixw0nahJWQgbqVNk8k6gA)中我们都讲过了,求装满背包有几种方法,递推公式一般都是dp[i] += dp[i - nums[j]];
+在[动态规划:494.目标和](https://programmercarl.com/0494.目标和.html) 、 [动态规划:518.零钱兑换II](https://programmercarl.com/0518.零钱兑换II.html)、[动态规划:377. 组合总和 Ⅳ](https://programmercarl.com/0377.组合总和Ⅳ.html)中我们都讲过了,求装满背包有几种方法,递推公式一般都是dp[i] += dp[i - nums[j]];
本题呢,dp[i]有几种来源,dp[i - 1],dp[i - 2],dp[i - 3] 等等,即:dp[i - j]
@@ -84,12 +84,11 @@
5. 举例来推导dp数组
-介于本题和[动态规划:377. 组合总和 Ⅳ](https://mp.weixin.qq.com/s/Iixw0nahJWQgbqVNk8k6gA)几乎是一样的,这里我就不再重复举例了。
+介于本题和[动态规划:377. 组合总和 Ⅳ](https://programmercarl.com/0377.组合总和Ⅳ.html)几乎是一样的,这里我就不再重复举例了。
以上分析完毕,C++代码如下:
-
-```cpp
+```
class Solution {
public:
int climbStairs(int n) {
diff --git "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md" "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md"
index 8ec0a65bec..2045c1fd44 100644
--- "a/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md"
+++ "b/problems/0072.\347\274\226\350\276\221\350\267\235\347\246\273.md"
@@ -8,7 +8,7 @@
## 72. 编辑距离
-https://leetcode-cn.com/problems/edit-distance/
+[力扣题目链接](https://leetcode-cn.com/problems/edit-distance/)
给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。
@@ -35,7 +35,7 @@ inention -> enention (将 'i' 替换为 'e')
enention -> exention (将 'n' 替换为 'x')
exention -> exection (将 'n' 替换为 'c')
exection -> execution (插入 'u')
-
+
提示:
diff --git "a/problems/0077.\347\273\204\345\220\210.md" "b/problems/0077.\347\273\204\345\220\210.md"
index d88a571138..01d1a5375e 100644
--- "a/problems/0077.\347\273\204\345\220\210.md"
+++ "b/problems/0077.\347\273\204\345\220\210.md"
@@ -11,7 +11,7 @@
# 第77题. 组合
-题目链接:https://leetcode-cn.com/problems/combinations/
+[力扣题目链接](https://leetcode-cn.com/problems/combinations/ )
给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。
@@ -80,7 +80,7 @@ for (int i = 1; i <= n; i++) {
如果脑洞模拟回溯搜索的过程,绝对可以让人窒息,所以需要抽象图形结构来进一步理解。
-**我们在[关于回溯算法,你该了解这些!](https://mp.weixin.qq.com/s/gjSgJbNbd1eAA5WkA-HeWw)中说道回溯法解决的问题都可以抽象为树形结构(N叉树),用树形结构来理解回溯就容易多了**。
+**我们在[关于回溯算法,你该了解这些!](https://programmercarl.com/回溯算法理论基础.html)中说道回溯法解决的问题都可以抽象为树形结构(N叉树),用树形结构来理解回溯就容易多了**。
那么我把组合问题抽象为如下树形结构:
@@ -100,7 +100,7 @@ for (int i = 1; i <= n; i++) {
相当于只需要把达到叶子节点的结果收集起来,就可以求得 n个数中k个数的组合集合。
-在[关于回溯算法,你该了解这些!](https://mp.weixin.qq.com/s/gjSgJbNbd1eAA5WkA-HeWw)中我们提到了回溯法三部曲,那么我们按照回溯法三部曲开始正式讲解代码了。
+在[关于回溯算法,你该了解这些!](https://programmercarl.com/回溯算法理论基础.html)中我们提到了回溯法三部曲,那么我们按照回溯法三部曲开始正式讲解代码了。
## 回溯法三部曲
@@ -214,7 +214,7 @@ public:
};
```
-还记得我们在[关于回溯算法,你该了解这些!](https://mp.weixin.qq.com/s/gjSgJbNbd1eAA5WkA-HeWw)中给出的回溯法模板么?
+还记得我们在[关于回溯算法,你该了解这些!](https://programmercarl.com/回溯算法理论基础.html)中给出的回溯法模板么?
如下:
```
diff --git "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md"
index d545543d74..171023dddc 100644
--- "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md"
+++ "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md"
@@ -10,7 +10,7 @@
-在[回溯算法:求组合问题!](https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ)中,我们通过回溯搜索法,解决了n个数中求k个数的组合问题。
+在[回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)中,我们通过回溯搜索法,解决了n个数中求k个数的组合问题。
> 可以直接看我的B栈视频讲解:[带你学透回溯算法-组合问题的剪枝操作](https://www.bilibili.com/video/BV1wi4y157er)
@@ -18,7 +18,7 @@
链接:https://leetcode-cn.com/problems/combinations/
-**看本篇之前,需要先看[回溯算法:求组合问题!](https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ)**。
+**看本篇之前,需要先看[回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)**。
大家先回忆一下[77. 组合]给出的回溯法的代码:
diff --git "a/problems/0078.\345\255\220\351\233\206.md" "b/problems/0078.\345\255\220\351\233\206.md"
index ca49f97b36..583fe6646f 100644
--- "a/problems/0078.\345\255\220\351\233\206.md"
+++ "b/problems/0078.\345\255\220\351\233\206.md"
@@ -9,7 +9,7 @@
## 第78题. 子集
-题目地址:https://leetcode-cn.com/problems/subsets/
+[力扣题目链接](https://leetcode-cn.com/problems/subsets/)
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
@@ -31,7 +31,7 @@
## 思路
-求子集问题和[回溯算法:求组合问题!](https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ)和[回溯算法:分割问题!](https://mp.weixin.qq.com/s/Pb1epUTbU8fHIht-g_MS5Q)又不一样了。
+求子集问题和[回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)和[回溯算法:分割问题!](https://programmercarl.com/0131.分割回文串.html)又不一样了。
如果把 子集问题、组合问题、分割问题都抽象为一棵树的话,**那么组合问题和分割问题都是收集树的叶子节点,而子集问题是找树的所有节点!**
@@ -101,7 +101,7 @@ for (int i = startIndex; i < nums.size(); i++) {
## C++代码
-根据[关于回溯算法,你该了解这些!](https://mp.weixin.qq.com/s/gjSgJbNbd1eAA5WkA-HeWw)给出的回溯算法模板:
+根据[关于回溯算法,你该了解这些!](https://programmercarl.com/回溯算法理论基础.html)给出的回溯算法模板:
```
void backtracking(参数) {
@@ -157,15 +157,15 @@ public:
相信大家经过了
* 组合问题:
- * [回溯算法:求组合问题!](https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ)
- * [回溯算法:组合问题再剪剪枝](https://mp.weixin.qq.com/s/Ri7spcJMUmph4c6XjPWXQA)
- * [回溯算法:求组合总和!](https://mp.weixin.qq.com/s/HX7WW6ixbFZJASkRnCTC3w)
- * [回溯算法:电话号码的字母组合](https://mp.weixin.qq.com/s/e2ua2cmkE_vpYjM3j6HY0A)
- * [回溯算法:求组合总和(二)](https://mp.weixin.qq.com/s/FLg8G6EjVcxBjwCbzpACPw)
- * [回溯算法:求组合总和(三)](https://mp.weixin.qq.com/s/_1zPYk70NvHsdY8UWVGXmQ)
+ * [回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)
+ * [回溯算法:组合问题再剪剪枝](https://programmercarl.com/0077.组合优化.html)
+ * [回溯算法:求组合总和!](https://programmercarl.com/0216.组合总和III.html)
+ * [回溯算法:电话号码的字母组合](https://programmercarl.com/0017.电话号码的字母组合.html)
+ * [回溯算法:求组合总和(二)](https://programmercarl.com/0039.组合总和.html)
+ * [回溯算法:求组合总和(三)](https://programmercarl.com/0040.组合总和II.html)
* 分割问题:
- * [回溯算法:分割回文串](https://mp.weixin.qq.com/s/Pb1epUTbU8fHIht-g_MS5Q)
- * [回溯算法:复原IP地址](https://mp.weixin.qq.com/s/v--VmA8tp9vs4bXCqHhBuA)
+ * [回溯算法:分割回文串](https://programmercarl.com/0131.分割回文串.html)
+ * [回溯算法:复原IP地址](https://programmercarl.com/0093.复原IP地址.html)
洗礼之后,发现子集问题还真的有点简单了,其实这就是一道标准的模板题。
diff --git "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md"
index bec3bc9910..966181fcf5 100644
--- "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md"
+++ "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md"
@@ -2,7 +2,7 @@
# 84.柱状图中最大的矩形
-链接:https://leetcode-cn.com/problems/largest-rectangle-in-histogram/
+[力扣题目链接](https://leetcode-cn.com/problems/largest-rectangle-in-histogram/)
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
@@ -15,9 +15,9 @@
# 思路
-本题和[42. 接雨水](https://mp.weixin.qq.com/s/QogENxhotboct9wn7GgYUw),是遥相呼应的两道题目,建议都要仔细做一做,原理上有很多相同的地方,但细节上又有差异,更可以加深对单调栈的理解!
+本题和[42. 接雨水](https://programmercarl.com/0042.接雨水.html),是遥相呼应的两道题目,建议都要仔细做一做,原理上有很多相同的地方,但细节上又有差异,更可以加深对单调栈的理解!
-其实这两道题目先做那一道都可以,但我先写的42.接雨水的题解,所以如果没做过接雨水的话,建议先做一做接雨水,可以参考我的题解:[42. 接雨水](https://mp.weixin.qq.com/s/QogENxhotboct9wn7GgYUw)
+其实这两道题目先做那一道都可以,但我先写的42.接雨水的题解,所以如果没做过接雨水的话,建议先做一做接雨水,可以参考我的题解:[42. 接雨水](https://programmercarl.com/0042.接雨水.html)
我们先来看一下双指针的解法:
@@ -50,11 +50,11 @@ public:
## 动态规划
-本题动态规划的写法整体思路和[42. 接雨水](https://mp.weixin.qq.com/s/QogENxhotboct9wn7GgYUw)是一致的,但要比[42. 接雨水](https://mp.weixin.qq.com/s/QogENxhotboct9wn7GgYUw)难一些。
+本题动态规划的写法整体思路和[42. 接雨水](https://programmercarl.com/0042.接雨水.html)是一致的,但要比[42. 接雨水](https://programmercarl.com/0042.接雨水.html)难一些。
难就难在本题要记录记录每个柱子 左边第一个小于该柱子的下标,而不是左边第一个小于该柱子的高度。
-所以需要循环查找,也就是下面在寻找的过程中使用了while,详细请看下面注释,整理思路在题解:[42. 接雨水](https://mp.weixin.qq.com/s/QogENxhotboct9wn7GgYUw)中已经介绍了。
+所以需要循环查找,也就是下面在寻找的过程中使用了while,详细请看下面注释,整理思路在题解:[42. 接雨水](https://programmercarl.com/0042.接雨水.html)中已经介绍了。
```CPP
class Solution {
@@ -95,11 +95,11 @@ public:
本地单调栈的解法和接雨水的题目是遥相呼应的。
-为什么这么说呢,[42. 接雨水](https://mp.weixin.qq.com/s/QogENxhotboct9wn7GgYUw)是找每个柱子左右两边第一个大于该柱子高度的柱子,而本题是找每个柱子左右两边第一个小于该柱子的柱子。
+为什么这么说呢,[42. 接雨水](https://programmercarl.com/0042.接雨水.html)是找每个柱子左右两边第一个大于该柱子高度的柱子,而本题是找每个柱子左右两边第一个小于该柱子的柱子。
**这里就涉及到了单调栈很重要的性质,就是单调栈里的顺序,是从小到大还是从大到小**。
-在题解[42. 接雨水](https://mp.weixin.qq.com/s/QogENxhotboct9wn7GgYUw)中我讲解了接雨水的单调栈从栈头(元素从栈头弹出)到栈底的顺序应该是从小到大的顺序。
+在题解[42. 接雨水](https://programmercarl.com/0042.接雨水.html)中我讲解了接雨水的单调栈从栈头(元素从栈头弹出)到栈底的顺序应该是从小到大的顺序。
那么因为本题是要找每个柱子左右两边第一个小于该柱子的柱子,所以从栈头(元素从栈头弹出)到栈底的顺序应该是从大到小的顺序!
@@ -115,7 +115,7 @@ public:
理解这一点,对单调栈就掌握的比较到位了。
-除了栈内元素顺序和接雨水不同,剩下的逻辑就都差不多了,在题解[42. 接雨水](https://mp.weixin.qq.com/s/QogENxhotboct9wn7GgYUw)我已经对单调栈的各个方面做了详细讲解,这里就不赘述了。
+除了栈内元素顺序和接雨水不同,剩下的逻辑就都差不多了,在题解[42. 接雨水](https://programmercarl.com/0042.接雨水.html)我已经对单调栈的各个方面做了详细讲解,这里就不赘述了。
剩下就是分析清楚如下三种情况:
@@ -195,40 +195,6 @@ public:
Java:
-动态规划
-```java
-class Solution {
- public int largestRectangleArea(int[] heights) {
- int length = heights.length;
- int[] minLeftIndex = new int [length];
- int[] maxRigthIndex = new int [length];
-
- // 记录左边第一个小于该柱子的下标
- minLeftIndex[0] = -1 ;
- for (int i = 1; i < length; i++) {
- int t = i - 1;
- // 这里不是用if,而是不断向右寻找的过程
- while (t >= 0 && heights[t] >= heights[i]) t = minLeftIndex[t];
- minLeftIndex[i] = t;
- }
- // 记录每个柱子 右边第一个小于该柱子的下标
- maxRigthIndex[length - 1] = length;
- for (int i = length - 2; i >= 0; i--) {
- int t = i + 1;
- while(t < length && heights[t] >= heights[i]) t = maxRigthIndex[t];
- maxRigthIndex[i] = t;
- }
- // 求和
- int result = 0;
- for (int i = 0; i < length; i++) {
- int sum = heights[i] * (maxRigthIndex[i] - minLeftIndex[i] - 1);
- result = Math.max(sum, result);
- }
- return result;
- }
-}
-```
-
Python:
动态规划
diff --git "a/problems/0090.\345\255\220\351\233\206II.md" "b/problems/0090.\345\255\220\351\233\206II.md"
index 5c19adc059..e04b944891 100644
--- "a/problems/0090.\345\255\220\351\233\206II.md"
+++ "b/problems/0090.\345\255\220\351\233\206II.md"
@@ -9,7 +9,7 @@
## 第90题.子集II
-题目链接:https://leetcode-cn.com/problems/subsets-ii/
+[力扣题目链接](https://leetcode-cn.com/problems/subsets-ii/)
给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
@@ -30,11 +30,11 @@
## 思路
-做本题之前一定要先做[78.子集](https://mp.weixin.qq.com/s/NNRzX-vJ_pjK4qxohd_LtA)。
+做本题之前一定要先做[78.子集](https://programmercarl.com/0078.子集.html)。
-这道题目和[回溯算法:求子集问题!](https://mp.weixin.qq.com/s/NNRzX-vJ_pjK4qxohd_LtA)区别就是集合里有重复元素了,而且求取的子集要去重。
+这道题目和[回溯算法:求子集问题!](https://programmercarl.com/0078.子集.html)区别就是集合里有重复元素了,而且求取的子集要去重。
-那么关于回溯算法中的去重问题,**在[40.组合总和II](https://mp.weixin.qq.com/s/_1zPYk70NvHsdY8UWVGXmQ)中已经详细讲解过了,和本题是一个套路**。
+那么关于回溯算法中的去重问题,**在[40.组合总和II](https://programmercarl.com/0040.组合总和II.html)中已经详细讲解过了,和本题是一个套路**。
**剧透一下,后期要讲解的排列问题里去重也是这个套路,所以理解“树层去重”和“树枝去重”非常重要**。
@@ -44,7 +44,7 @@
从图中可以看出,同一树层上重复取2 就要过滤掉,同一树枝上就可以重复取2,因为同一树枝上元素的集合才是唯一子集!
-本题就是其实就是[回溯算法:求子集问题!](https://mp.weixin.qq.com/s/NNRzX-vJ_pjK4qxohd_LtA)的基础上加上了去重,去重我们在[回溯算法:求组合总和(三)](https://mp.weixin.qq.com/s/_1zPYk70NvHsdY8UWVGXmQ)也讲过了,所以我就直接给出代码了:
+本题就是其实就是[回溯算法:求子集问题!](https://programmercarl.com/0078.子集.html)的基础上加上了去重,去重我们在[回溯算法:求组合总和(三)](https://programmercarl.com/0040.组合总和II.html)也讲过了,所以我就直接给出代码了:
## C++代码
diff --git "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md"
index 9a95af22ca..9407809bf3 100644
--- "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md"
+++ "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md"
@@ -10,7 +10,7 @@
## 93.复原IP地址
-题目地址:https://leetcode-cn.com/problems/restore-ip-addresses/
+[力扣题目链接](https://leetcode-cn.com/problems/restore-ip-addresses/)
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
@@ -45,11 +45,11 @@ s 仅由数字组成
## 思路
-做这道题目之前,最好先把[回溯算法:分割回文串](https://mp.weixin.qq.com/s/Pb1epUTbU8fHIht-g_MS5Q)这个做了。
+做这道题目之前,最好先把[回溯算法:分割回文串](https://programmercarl.com/0131.分割回文串.html)这个做了。
这道题目相信大家刚看的时候,应该会一脸茫然。
-其实只要意识到这是切割问题,**切割问题就可以使用回溯搜索法把所有可能性搜出来**,和刚做过的[回溯算法:分割回文串](https://mp.weixin.qq.com/s/Pb1epUTbU8fHIht-g_MS5Q)就十分类似了。
+其实只要意识到这是切割问题,**切割问题就可以使用回溯搜索法把所有可能性搜出来**,和刚做过的[回溯算法:分割回文串](https://programmercarl.com/0131.分割回文串.html)就十分类似了。
切割问题可以抽象为树型结构,如图:
@@ -60,7 +60,7 @@ s 仅由数字组成
* 递归参数
-在[回溯算法:分割回文串](https://mp.weixin.qq.com/s/Pb1epUTbU8fHIht-g_MS5Q)中我们就提到切割问题类似组合问题。
+在[回溯算法:分割回文串](https://programmercarl.com/0131.分割回文串.html)中我们就提到切割问题类似组合问题。
startIndex一定是需要的,因为不能重复分割,记录下一层递归分割的起始位置。
@@ -76,7 +76,7 @@ startIndex一定是需要的,因为不能重复分割,记录下一层递归
* 递归终止条件
-终止条件和[回溯算法:分割回文串](https://mp.weixin.qq.com/s/Pb1epUTbU8fHIht-g_MS5Q)情况就不同了,本题明确要求只会分成4段,所以不能用切割线切到最后作为终止条件,而是分割的段数作为终止条件。
+终止条件和[回溯算法:分割回文串](https://programmercarl.com/0131.分割回文串.html)情况就不同了,本题明确要求只会分成4段,所以不能用切割线切到最后作为终止条件,而是分割的段数作为终止条件。
pointNum表示逗点数量,pointNum为3说明字符串分成了4段了。
@@ -96,7 +96,7 @@ if (pointNum == 3) { // 逗点数量为3时,分隔结束
* 单层搜索的逻辑
-在[回溯算法:分割回文串](https://mp.weixin.qq.com/s/Pb1epUTbU8fHIht-g_MS5Q)中已经讲过在循环遍历中如何截取子串。
+在[回溯算法:分割回文串](https://programmercarl.com/0131.分割回文串.html)中已经讲过在循环遍历中如何截取子串。
在`for (int i = startIndex; i < s.size(); i++)`循环中 [startIndex, i]这个区间就是截取的子串,需要判断这个子串是否合法。
@@ -164,7 +164,7 @@ bool isValid(const string& s, int start, int end) {
## C++代码
-根据[关于回溯算法,你该了解这些!](https://mp.weixin.qq.com/s/gjSgJbNbd1eAA5WkA-HeWw)给出的回溯算法模板:
+根据[关于回溯算法,你该了解这些!](https://programmercarl.com/回溯算法理论基础.html)给出的回溯算法模板:
```
void backtracking(参数) {
@@ -239,11 +239,11 @@ public:
## 总结
-在[回溯算法:分割回文串](https://mp.weixin.qq.com/s/Pb1epUTbU8fHIht-g_MS5Q)中我列举的分割字符串的难点,本题都覆盖了。
+在[回溯算法:分割回文串](https://programmercarl.com/0131.分割回文串.html)中我列举的分割字符串的难点,本题都覆盖了。
而且本题还需要操作字符串添加逗号作为分隔符,并验证区间的合法性。
-可以说是[回溯算法:分割回文串](https://mp.weixin.qq.com/s/Pb1epUTbU8fHIht-g_MS5Q)的加强版。
+可以说是[回溯算法:分割回文串](https://programmercarl.com/0131.分割回文串.html)的加强版。
在本文的树形结构图中,我已经把详细的分析思路都画了出来,相信大家看了之后一定会思路清晰不少!
diff --git "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md"
index 7cbe4fec2d..68ab11c870 100644
--- "a/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md"
+++ "b/problems/0096.\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md"
@@ -8,7 +8,7 @@
## 96.不同的二叉搜索树
-题目链接:https://leetcode-cn.com/problems/unique-binary-search-trees/
+[力扣题目链接](https://leetcode-cn.com/problems/unique-binary-search-trees/)
给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?
@@ -20,7 +20,7 @@
这道题目描述很简短,但估计大部分同学看完都是懵懵的状态,这得怎么统计呢?
-关于什么是二叉搜索树,我们之前在讲解二叉树专题的时候已经详细讲解过了,也可以看看这篇[二叉树:二叉搜索树登场!](https://mp.weixin.qq.com/s/vsKrWRlETxCVsiRr8v_hHg)在回顾一波。
+关于什么是二叉搜索树,我们之前在讲解二叉树专题的时候已经详细讲解过了,也可以看看这篇[二叉树:二叉搜索树登场!](https://programmercarl.com/0700.二叉搜索树中的搜索.html)在回顾一波。
了解了二叉搜索树之后,我们应该先举几个例子,画画图,看看有没有什么规律,如图:
diff --git "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md"
index 6f7e5c1465..01a2c7d0f8 100644
--- "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md"
+++ "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md"
@@ -9,7 +9,7 @@
## 98.验证二叉搜索树
-题目地址:https://leetcode-cn.com/problems/validate-binary-search-tree/
+[力扣题目链接](https://leetcode-cn.com/problems/validate-binary-search-tree/)
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
@@ -121,7 +121,7 @@ if (root->val > root->left->val && root->val < root->right->val) {
要定义一个longlong的全局变量,用来比较遍历的节点是否有序,因为后台测试数据中有int最小值,所以定义为longlong的类型,初始化为longlong最小值。
-注意递归函数要有bool类型的返回值, 我们在[二叉树:递归函数究竟什么时候需要返回值,什么时候不要返回值?](https://mp.weixin.qq.com/s/6TWAVjxQ34kVqROWgcRFOg) 中讲了,只有寻找某一条边(或者一个节点)的时候,递归函数会有bool类型的返回值。
+注意递归函数要有bool类型的返回值, 我们在[二叉树:递归函数究竟什么时候需要返回值,什么时候不要返回值?](https://programmercarl.com/0112.路径总和.html) 中讲了,只有寻找某一条边(或者一个节点)的时候,递归函数会有bool类型的返回值。
其实本题是同样的道理,我们在寻找一个不符合条件的节点,如果没有找到这个节点就遍历了整个树,如果找到不符合的节点了,立刻返回。
@@ -210,7 +210,7 @@ public:
## 迭代法
-可以用迭代法模拟二叉树中序遍历,对前中后序迭代法生疏的同学可以看这两篇[二叉树:听说递归能做的,栈也能做!](https://mp.weixin.qq.com/s/c_zCrGHIVlBjUH_hJtghCg),[二叉树:前中后序迭代方式统一写法](https://mp.weixin.qq.com/s/WKg0Ty1_3SZkztpHubZPRg)
+可以用迭代法模拟二叉树中序遍历,对前中后序迭代法生疏的同学可以看这两篇[二叉树:听说递归能做的,栈也能做!](https://programmercarl.com/二叉树的迭代遍历.html),[二叉树:前中后序迭代方式统一写法](https://programmercarl.com/二叉树的统一迭代法.html)
迭代法中序遍历稍加改动就可以了,代码如下:
@@ -240,7 +240,7 @@ public:
};
```
-在[二叉树:二叉搜索树登场!](https://mp.weixin.qq.com/s/vsKrWRlETxCVsiRr8v_hHg)中我们分明写出了痛哭流涕的简洁迭代法,怎么在这里不行了呢,因为本题是要验证二叉搜索树啊。
+在[二叉树:二叉搜索树登场!](https://programmercarl.com/0700.二叉搜索树中的搜索.html)中我们分明写出了痛哭流涕的简洁迭代法,怎么在这里不行了呢,因为本题是要验证二叉搜索树啊。
## 总结
diff --git "a/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md" "b/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md"
index df0a5dd1fa..6ffaf3cb07 100644
--- "a/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md"
+++ "b/problems/0100.\347\233\270\345\220\214\347\232\204\346\240\221.md"
@@ -10,7 +10,7 @@
# 100. 相同的树
-题目地址:https://leetcode-cn.com/problems/same-tree/
+[力扣题目链接](https://leetcode-cn.com/problems/same-tree/)
给定两个二叉树,编写一个函数来检验它们是否相同。
@@ -23,11 +23,11 @@
# 思路
-在[101.对称二叉树](https://mp.weixin.qq.com/s/Kgf0gjvlDlNDfKIH2b1Oxg)中,我们讲到对于二叉树是否对称,要比较的是根节点的左子树与右子树是不是相互翻转的,理解这一点就知道了**其实我们要比较的是两个树(这两个树是根节点的左右子树)**,所以在递归遍历的过程中,也是要同时遍历两棵树。
+在[101.对称二叉树](https://programmercarl.com/0101.对称二叉树.html)中,我们讲到对于二叉树是否对称,要比较的是根节点的左子树与右子树是不是相互翻转的,理解这一点就知道了**其实我们要比较的是两个树(这两个树是根节点的左右子树)**,所以在递归遍历的过程中,也是要同时遍历两棵树。
理解这一本质之后,就会发现,求二叉树是否对称,和求二叉树是否相同几乎是同一道题目。
-**如果没有读过[二叉树:我对称么?](https://mp.weixin.qq.com/s/Kgf0gjvlDlNDfKIH2b1Oxg)这一篇,请认真读完再做这道题,就会有感觉了。**
+**如果没有读过[二叉树:我对称么?](https://programmercarl.com/0101.对称二叉树.html)这一篇,请认真读完再做这道题,就会有感觉了。**
递归三部曲中:
@@ -42,7 +42,7 @@
bool compare(TreeNode* tree1, TreeNode* tree2)
```
-分析过程同[101.对称二叉树](https://mp.weixin.qq.com/s/Kgf0gjvlDlNDfKIH2b1Oxg)。
+分析过程同[101.对称二叉树](https://programmercarl.com/0101.对称二叉树.html)。
2. 确定终止条件
@@ -68,7 +68,7 @@ else if (tree1 == NULL && tree2 == NULL) return true;
else if (tree1->val != tree2->val) return false; // 注意这里我没有使用else
```
-分析过程同[101.对称二叉树](https://mp.weixin.qq.com/s/Kgf0gjvlDlNDfKIH2b1Oxg)
+分析过程同[101.对称二叉树](https://programmercarl.com/0101.对称二叉树.html)
3. 确定单层递归的逻辑
diff --git "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md" "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md"
index e091844b32..03d3acaa05 100644
--- "a/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md"
+++ "b/problems/0101.\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.md"
@@ -9,7 +9,7 @@
# 101. 对称二叉树
-题目地址:https://leetcode-cn.com/problems/symmetric-tree/
+[力扣题目链接](https://leetcode-cn.com/problems/symmetric-tree/)
给定一个二叉树,检查它是否是镜像对称的。
diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
index 391609114b..4b57a82aa4 100644
--- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
+++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
@@ -20,7 +20,7 @@
* 104.二叉树的最大深度
* 111.二叉树的最小深度
-在之前写过这篇文章 [二叉树:层序遍历登场!](https://mp.weixin.qq.com/s/Gb3BjakIKGNpup2jYtTzog),可惜当时只打了5个,还不够,再给我一次机会,我打十个!
+在之前写过这篇文章 [二叉树:层序遍历登场!](https://programmercarl.com/0102.二叉树的层序遍历.html),可惜当时只打了5个,还不够,再给我一次机会,我打十个!

@@ -28,7 +28,7 @@
# 102.二叉树的层序遍历
-题目地址:https://leetcode-cn.com/problems/binary-tree-level-order-traversal/
+[力扣题目链接](https://leetcode-cn.com/problems/binary-tree-level-order-traversal/)
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
@@ -38,9 +38,9 @@
我们之前讲过了三篇关于二叉树的深度优先遍历的文章:
-* [二叉树:前中后序递归法](https://mp.weixin.qq.com/s/Ww60X5mIKWdMQV4cN3ejOA)
-* [二叉树:前中后序迭代法](https://mp.weixin.qq.com/s/OH7aCVJ5-Gi32PkNCoZk4A)
-* [二叉树:前中后序迭代方式统一写法](https://mp.weixin.qq.com/s/ATQMPCpBlaAgrqdLDMVPZA)
+* [二叉树:前中后序递归法](https://programmercarl.com/二叉树的递归遍历.html)
+* [二叉树:前中后序迭代法](https://programmercarl.com/二叉树的迭代遍历.html)
+* [二叉树:前中后序迭代方式统一写法](https://programmercarl.com/二叉树的统一迭代法.html)
接下来我们再来介绍二叉树的另一种遍历方式:层序遍历。
@@ -233,7 +233,7 @@ var levelOrder = function(root) {
# 107.二叉树的层次遍历 II
-题目链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii/
+[力扣题目链接](https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii/)
给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
@@ -410,7 +410,7 @@ var levelOrderBottom = function(root) {
# 199.二叉树的右视图
-题目链接:https://leetcode-cn.com/problems/binary-tree-right-side-view/
+[力扣题目链接](https://leetcode-cn.com/problems/binary-tree-right-side-view/)
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
@@ -587,7 +587,7 @@ var rightSideView = function(root) {
# 637.二叉树的层平均值
-题目链接:https://leetcode-cn.com/problems/average-of-levels-in-binary-tree/
+[力扣题目链接](https://leetcode-cn.com/problems/average-of-levels-in-binary-tree/)
给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。
@@ -771,7 +771,7 @@ var averageOfLevels = function(root) {
# 429.N叉树的层序遍历
-题目链接:https://leetcode-cn.com/problems/n-ary-tree-level-order-traversal/
+[力扣题目链接](https://leetcode-cn.com/problems/n-ary-tree-level-order-traversal/)
给定一个 N 叉树,返回其节点值的层序遍历。 (即从左到右,逐层遍历)。
@@ -991,7 +991,7 @@ var levelOrder = function(root) {
# 515.在每个树行中找最大值
-题目链接:https://leetcode-cn.com/problems/find-largest-value-in-each-tree-row/
+[力扣题目链接](https://leetcode-cn.com/problems/find-largest-value-in-each-tree-row/)
您需要在二叉树的每一行中找到最大的值。
@@ -1072,32 +1072,6 @@ class Solution {
}
```
-```java
-//方法二:用一个max变量来保存最大值
-class Solution {
- public List largestValues(TreeNode root) {
- Queue queue = new LinkedList();
- List result = new ArrayList<>();
- if (root != null) queue.add(root);
-
- while(!queue.isEmpty()){
- int size = queue.size();
- int max = Integer.MIN_VALUE; // 初始化为最小值
- for(int i = 0; i < size; i++){
- TreeNode node = queue.poll();
- max = Math.max(node.val, max);
- if(node.left != null)
- queue.add(node.left);
- if(node.right != null)
- queue.add(node.right);
- }
- result.add(max); // 取最大值放进数组
- }
- return result;
- }
-}
-```
-
go:
```GO
@@ -1172,7 +1146,7 @@ var largestValues = function(root) {
# 116.填充每个节点的下一个右侧节点指针
-题目链接:https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node/
+[力扣题目链接](https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node/)
给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:
@@ -1340,8 +1314,7 @@ func connect(root *Node) *Node {
# 117.填充每个节点的下一个右侧节点指针II
-
-题目地址:https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node-ii/
+[力扣题目链接](https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node-ii/)
思路:
@@ -1503,7 +1476,7 @@ func connect(root *Node) *Node {
```
# 104.二叉树的最大深度
-题目地址:https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/
+[力扣题目链接](https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/)
给定一个二叉树,找出其最大深度。
@@ -1588,7 +1561,7 @@ JavaScript:
# 111.二叉树的最小深度
-题目地址:https://leetcode-cn.com/problems/minimum-depth-of-binary-tree/
+[力扣题目链接](https://leetcode-cn.com/problems/minimum-depth-of-binary-tree/)
相对于 104.二叉树的最大深度 ,本题还也可以使用层序遍历的方式来解决,思路是一样的。
@@ -1623,43 +1596,6 @@ public:
```
Java:
-```java
-class Solution {
-
- public int minDepth(TreeNode root){
- if (root == null) {
- return 0;
- }
-
- Queue queue = new LinkedList<>();
- queue.offer(root);
- int depth = 0;
-
- while (!queue.isEmpty()){
-
- int size = queue.size();
- depth++;
-
- TreeNode cur = null;
- for (int i = 0; i < size; i++) {
- cur = queue.poll();
-
- //如果当前节点的左右孩子都为空,直接返回最小深度
- if (cur.left == null && cur.right == null){
- return depth;
- }
-
- if (cur.left != null) queue.offer(cur.left);
- if (cur.right != null) queue.offer(cur.right);
- }
-
-
- }
-
- return depth;
- }
-}
-```
Python 3:
diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md"
index f09361e10b..d086686dc7 100644
--- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md"
+++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md"
@@ -14,7 +14,7 @@
# 104.二叉树的最大深度
-题目地址:https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/
+[力扣题目链接](https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/)
给定一个二叉树,找出其最大深度。
@@ -127,7 +127,7 @@ public:
return result;
}
};
-```
+```
**可以看出使用了前序(中左右)的遍历顺序,这才是真正求深度的逻辑!**
@@ -167,7 +167,7 @@ public:
所以这道题的迭代法就是一道模板题,可以使用二叉树层序遍历的模板来解决的。
-如果对层序遍历还不清楚的话,可以看这篇:[二叉树:层序遍历登场!](https://mp.weixin.qq.com/s/4-bDKi7SdwfBGRm9FYduiA)
+如果对层序遍历还不清楚的话,可以看这篇:[二叉树:层序遍历登场!](https://programmercarl.com/0102.二叉树的层序遍历.html)
c++代码如下:
@@ -198,7 +198,7 @@ public:
# 559.n叉树的最大深度
-题目地址:https://leetcode-cn.com/problems/maximum-depth-of-n-ary-tree/
+[力扣题目链接](https://leetcode-cn.com/problems/maximum-depth-of-n-ary-tree/)
给定一个 n 叉树,找到其最大深度。
@@ -481,7 +481,7 @@ var maxdepth = function(root) {
if (!root) return root
return 1 + math.max(maxdepth(root.left), maxdepth(root.right))
};
-```
+```
二叉树最大深度递归遍历
```javascript
diff --git "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\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.md" "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\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.md"
index 4cfe28582a..c6a9c66a10 100644
--- "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\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.md"
+++ "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\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.md"
@@ -14,7 +14,7 @@
## 106.从中序与后序遍历序列构造二叉树
-题目地址:https://leetcode-cn.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/
+[力扣题目链接](https://leetcode-cn.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/)
根据一棵树的中序遍历与后序遍历构造二叉树。
@@ -95,7 +95,7 @@ TreeNode* traversal (vector& inorder, vector& postorder) {
**在切割的过程中会产生四个区间,把握不好不变量的话,一会左闭右开,一会左闭又闭,必然乱套!**
-我在[数组:每次遇到二分法,都是一看就会,一写就废](https://mp.weixin.qq.com/s/fCf5QbPDtE6SSlZ1yh_q8Q)和[数组:这个循环可以转懵很多人!](https://mp.weixin.qq.com/s/KTPhaeqxbMK9CxHUUgFDmg)中都强调过循环不变量的重要性,在二分查找以及螺旋矩阵的求解中,坚持循环不变量非常重要,本题也是。
+我在[数组:每次遇到二分法,都是一看就会,一写就废](https://programmercarl.com/0035.搜索插入位置.html)和[数组:这个循环可以转懵很多人!](https://programmercarl.com/0059.螺旋矩阵II.html)中都强调过循环不变量的重要性,在二分查找以及螺旋矩阵的求解中,坚持循环不变量非常重要,本题也是。
首先要切割中序数组,为什么先切割中序数组呢?
@@ -396,7 +396,7 @@ public:
## 105.从前序与中序遍历序列构造二叉树
-题目地址:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/
+[力扣题目链接](https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/)
根据一棵树的前序遍历与中序遍历构造二叉树。
diff --git "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md"
index 9e67a677b9..5f99f98adf 100644
--- "a/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md"
+++ "b/problems/0108.\345\260\206\346\234\211\345\272\217\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md"
@@ -11,7 +11,7 @@
## 108.将有序数组转换为二叉搜索树
-题目链接:https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/
+[力扣题目链接](https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/)
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
@@ -25,10 +25,10 @@
做这道题目之前大家可以了解一下这几道:
-* [106.从中序与后序遍历序列构造二叉树](https://mp.weixin.qq.com/s/7r66ap2s-shvVvlZxo59xg)
-* [654.最大二叉树](https://mp.weixin.qq.com/s/1iWJV6Aov23A7xCF4nV88w)中其实已经讲过了,如果根据数组构造一颗二叉树。
-* [701.二叉搜索树中的插入操作](https://mp.weixin.qq.com/s/lwKkLQcfbCNX2W-5SOeZEA)
-* [450.删除二叉搜索树中的节点](https://mp.weixin.qq.com/s/-p-Txvch1FFk3ygKLjPAKw)
+* [106.从中序与后序遍历序列构造二叉树](https://programmercarl.com/0106.从中序与后序遍历序列构造二叉树.html)
+* [654.最大二叉树](https://programmercarl.com/0654.最大二叉树.html)中其实已经讲过了,如果根据数组构造一颗二叉树。
+* [701.二叉搜索树中的插入操作](https://programmercarl.com/0701.二叉搜索树中的插入操作.html)
+* [450.删除二叉搜索树中的节点](https://programmercarl.com/0450.删除二叉搜索树中的节点.html)
进入正题:
@@ -38,11 +38,11 @@
其实这里不用强调平衡二叉搜索树,数组构造二叉树,构成平衡树是自然而然的事情,因为大家默认都是从数组中间位置取值作为节点元素,一般不会随机取,**所以想构成不平衡的二叉树是自找麻烦**。
-在[二叉树:构造二叉树登场!](https://mp.weixin.qq.com/s/7r66ap2s-shvVvlZxo59xg)和[二叉树:构造一棵最大的二叉树](https://mp.weixin.qq.com/s/1iWJV6Aov23A7xCF4nV88w)中其实已经讲过了,如果根据数组构造一颗二叉树。
+在[二叉树:构造二叉树登场!](https://programmercarl.com/0106.从中序与后序遍历序列构造二叉树.html)和[二叉树:构造一棵最大的二叉树](https://programmercarl.com/0654.最大二叉树.html)中其实已经讲过了,如果根据数组构造一颗二叉树。
**本质就是寻找分割点,分割点作为当前节点,然后递归左区间和右区间**。
-本题其实要比[二叉树:构造二叉树登场!](https://mp.weixin.qq.com/s/7r66ap2s-shvVvlZxo59xg) 和 [二叉树:构造一棵最大的二叉树](https://mp.weixin.qq.com/s/1iWJV6Aov23A7xCF4nV88w)简单一些,因为有序数组构造二叉搜索树,寻找分割点就比较容易了。
+本题其实要比[二叉树:构造二叉树登场!](https://programmercarl.com/0106.从中序与后序遍历序列构造二叉树.html) 和 [二叉树:构造一棵最大的二叉树](https://programmercarl.com/0654.最大二叉树.html)简单一些,因为有序数组构造二叉搜索树,寻找分割点就比较容易了。
分割点就是数组中间位置的节点。
@@ -68,11 +68,11 @@
删除二叉树节点,增加二叉树节点,都是用递归函数的返回值来完成,这样是比较方便的。
-相信大家如果仔细看了[二叉树:搜索树中的插入操作](https://mp.weixin.qq.com/s/lwKkLQcfbCNX2W-5SOeZEA)和[二叉树:搜索树中的删除操作](https://mp.weixin.qq.com/s/-p-Txvch1FFk3ygKLjPAKw),一定会对递归函数返回值的作用深有感触。
+相信大家如果仔细看了[二叉树:搜索树中的插入操作](https://programmercarl.com/0701.二叉搜索树中的插入操作.html)和[二叉树:搜索树中的删除操作](https://programmercarl.com/0450.删除二叉搜索树中的节点.html),一定会对递归函数返回值的作用深有感触。
那么本题要构造二叉树,依然用递归函数的返回值来构造中节点的左右孩子。
-再来看参数,首先是传入数组,然后就是左下表left和右下表right,我们在[二叉树:构造二叉树登场!](https://mp.weixin.qq.com/s/7r66ap2s-shvVvlZxo59xg)中提过,在构造二叉树的时候尽量不要重新定义左右区间数组,而是用下表来操作原数组。
+再来看参数,首先是传入数组,然后就是左下表left和右下表right,我们在[二叉树:构造二叉树登场!](https://programmercarl.com/0106.从中序与后序遍历序列构造二叉树.html)中提过,在构造二叉树的时候尽量不要重新定义左右区间数组,而是用下表来操作原数组。
所以代码如下:
@@ -83,7 +83,7 @@ TreeNode* traversal(vector& nums, int left, int right)
这里注意,**我这里定义的是左闭右闭区间,在不断分割的过程中,也会坚持左闭右闭的区间,这又涉及到我们讲过的循环不变量**。
-在[二叉树:构造二叉树登场!](https://mp.weixin.qq.com/s/7r66ap2s-shvVvlZxo59xg),[35.搜索插入位置](https://mp.weixin.qq.com/s/fCf5QbPDtE6SSlZ1yh_q8Q) 和[59.螺旋矩阵II](https://mp.weixin.qq.com/s/KTPhaeqxbMK9CxHUUgFDmg)都详细讲过循环不变量。
+在[二叉树:构造二叉树登场!](https://programmercarl.com/0106.从中序与后序遍历序列构造二叉树.html),[35.搜索插入位置](https://programmercarl.com/0035.搜索插入位置.html) 和[59.螺旋矩阵II](https://programmercarl.com/0059.螺旋矩阵II.html)都详细讲过循环不变量。
* 确定递归终止条件
@@ -98,7 +98,7 @@ if (left > right) return nullptr;
* 确定单层递归的逻辑
-首先取数组中间元素的位置,不难写出`int mid = (left + right) / 2;`,**这么写其实有一个问题,就是数值越界,例如left和right都是最大int,这么操作就越界了,在[二分法](https://mp.weixin.qq.com/s/fCf5QbPDtE6SSlZ1yh_q8Q)中尤其需要注意!**
+首先取数组中间元素的位置,不难写出`int mid = (left + right) / 2;`,**这么写其实有一个问题,就是数值越界,例如left和right都是最大int,这么操作就越界了,在[二分法](https://programmercarl.com/0035.搜索插入位置.html)中尤其需要注意!**
所以可以这么写:`int mid = left + ((right - left) / 2);`
@@ -194,7 +194,7 @@ public:
## 总结
-**在[二叉树:构造二叉树登场!](https://mp.weixin.qq.com/s/7r66ap2s-shvVvlZxo59xg) 和 [二叉树:构造一棵最大的二叉树](https://mp.weixin.qq.com/s/1iWJV6Aov23A7xCF4nV88w)之后,我们顺理成章的应该构造一下二叉搜索树了,一不小心还是一棵平衡二叉搜索树**。
+**在[二叉树:构造二叉树登场!](https://programmercarl.com/0106.从中序与后序遍历序列构造二叉树.html) 和 [二叉树:构造一棵最大的二叉树](https://programmercarl.com/0654.最大二叉树.html)之后,我们顺理成章的应该构造一下二叉搜索树了,一不小心还是一棵平衡二叉搜索树**。
其实思路也是一样的,不断中间分割,然后递归处理左区间,右区间,也可以说是分治。
diff --git "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md"
index 55d3c2e778..43a4975822 100644
--- "a/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md"
+++ "b/problems/0110.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md"
@@ -11,7 +11,7 @@
# 110.平衡二叉树
-题目地址:https://leetcode-cn.com/problems/balanced-binary-tree/
+[力扣题目链接](https://leetcode-cn.com/problems/balanced-binary-tree/)
给定一个二叉树,判断它是否是高度平衡的二叉树。
@@ -36,7 +36,7 @@
# 题外话
-咋眼一看这道题目和[104.二叉树的最大深度](https://mp.weixin.qq.com/s/jRaRcRerhEHepQbt-aKstw)很像,其实有很大区别。
+咋眼一看这道题目和[104.二叉树的最大深度](https://programmercarl.com/0104.二叉树的最大深度.html)很像,其实有很大区别。
这里强调一波概念:
@@ -51,11 +51,11 @@
因为求深度可以从上到下去查 所以需要前序遍历(中左右),而高度只能从下到上去查,所以只能后序遍历(左右中)
-有的同学一定疑惑,为什么[104.二叉树的最大深度](https://mp.weixin.qq.com/s/jRaRcRerhEHepQbt-aKstw)中求的是二叉树的最大深度,也用的是后序遍历。
+有的同学一定疑惑,为什么[104.二叉树的最大深度](https://programmercarl.com/0104.二叉树的最大深度.html)中求的是二叉树的最大深度,也用的是后序遍历。
**那是因为代码的逻辑其实是求的根节点的高度,而根节点的高度就是这颗树的最大深度,所以才可以使用后序遍历。**
-在[104.二叉树的最大深度](https://mp.weixin.qq.com/s/jRaRcRerhEHepQbt-aKstw)中,如果真正求取二叉树的最大深度,代码应该写成如下:(前序遍历)
+在[104.二叉树的最大深度](https://programmercarl.com/0104.二叉树的最大深度.html)中,如果真正求取二叉树的最大深度,代码应该写成如下:(前序遍历)
```CPP
class Solution {
@@ -228,7 +228,7 @@ public:
## 迭代
-在[104.二叉树的最大深度](https://mp.weixin.qq.com/s/jRaRcRerhEHepQbt-aKstw)中我们可以使用层序遍历来求深度,但是就不能直接用层序遍历来求高度了,这就体现出求高度和求深度的不同。
+在[104.二叉树的最大深度](https://programmercarl.com/0104.二叉树的最大深度.html)中我们可以使用层序遍历来求深度,但是就不能直接用层序遍历来求高度了,这就体现出求高度和求深度的不同。
本题的迭代方式可以先定义一个函数,专门用来求高度。
diff --git "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md" "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md"
index b4d0e32b25..12eadd60c8 100644
--- "a/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md"
+++ "b/problems/0111.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.md"
@@ -11,7 +11,7 @@
# 111.二叉树的最小深度
-题目地址:https://leetcode-cn.com/problems/minimum-depth-of-binary-tree/
+[力扣题目链接](https://leetcode-cn.com/problems/minimum-depth-of-binary-tree/)
给定一个二叉树,找出其最小深度。
@@ -29,7 +29,7 @@
# 思路
-看完了这篇[104.二叉树的最大深度](https://mp.weixin.qq.com/s/jRaRcRerhEHepQbt-aKstw),再来看看如何求最小深度。
+看完了这篇[104.二叉树的最大深度](https://programmercarl.com/0104.二叉树的最大深度.html),再来看看如何求最小深度。
直觉上好像和求最大深度差不多,其实还是差不少的。
@@ -154,9 +154,9 @@ public:
## 迭代法
-相对于[104.二叉树的最大深度](https://mp.weixin.qq.com/s/jRaRcRerhEHepQbt-aKstw),本题还可以使用层序遍历的方式来解决,思路是一样的。
+相对于[104.二叉树的最大深度](https://programmercarl.com/0104.二叉树的最大深度.html),本题还可以使用层序遍历的方式来解决,思路是一样的。
-如果对层序遍历还不清楚的话,可以看这篇:[二叉树:层序遍历登场!](https://mp.weixin.qq.com/s/4-bDKi7SdwfBGRm9FYduiA)
+如果对层序遍历还不清楚的话,可以看这篇:[二叉树:层序遍历登场!](https://programmercarl.com/0102.二叉树的层序遍历.html)
**需要注意的是,只有当左右孩子都为空的时候,才说明遍历的最低点了。如果其中一个孩子为空则不是最低点**
diff --git "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md" "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md"
index 4a814ee1bb..283a99131e 100644
--- "a/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md"
+++ "b/problems/0112.\350\267\257\345\276\204\346\200\273\345\222\214.md"
@@ -18,7 +18,7 @@
# 112. 路径总和
-题目地址:https://leetcode-cn.com/problems/path-sum/
+[力扣题目链接](https://leetcode-cn.com/problems/path-sum/)
给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。
@@ -46,7 +46,7 @@
再来看返回值,递归函数什么时候需要返回值?什么时候不需要返回值?这里总结如下三点:
* 如果需要搜索整颗二叉树且不用处理递归返回值,递归函数就不要返回值。(这种情况就是本文下半部分介绍的113.路径总和ii)
-* 如果需要搜索整颗二叉树且需要处理递归返回值,递归函数就需要返回值。 (这种情况我们在[236. 二叉树的最近公共祖先](https://mp.weixin.qq.com/s/n6Rk3nc_X3TSkhXHrVmBTQ)中介绍)
+* 如果需要搜索整颗二叉树且需要处理递归返回值,递归函数就需要返回值。 (这种情况我们在[236. 二叉树的最近公共祖先](https://programmercarl.com/0236.二叉树的最近公共祖先.html)中介绍)
* 如果要搜索其中一条符合条件的路径,那么递归一定需要返回值,因为遇到符合条件的路径了就要及时返回。(本题的情况)
而本题我们要找一条符合条件的路径,所以递归函数需要返回值,及时返回,那么返回类型是什么呢?
@@ -218,7 +218,7 @@ public:
# 113. 路径总和ii
-题目地址:https://leetcode-cn.com/problems/path-sum-ii/
+[力扣题目链接](https://leetcode-cn.com/problems/path-sum-ii/)
给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。
diff --git "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md"
index e964e95d66..a5162ae036 100644
--- "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md"
+++ "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md"
@@ -8,7 +8,7 @@
## 115.不同的子序列
-题目链接:https://leetcode-cn.com/problems/distinct-subsequences/
+[力扣题目链接](https://leetcode-cn.com/problems/distinct-subsequences/)
给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。
@@ -29,7 +29,7 @@ s 和 t 由英文字母组成
这道题目相对于72. 编辑距离,简单了不少,因为本题相当于只有删除操作,不用考虑替换增加之类的。
-但相对于刚讲过的[动态规划:392.判断子序列](https://mp.weixin.qq.com/s/2pjT4B4fjfOx5iB6N6xyng)就有难度了,这道题目双指针法可就做不了了,来看看动规五部曲分析如下:
+但相对于刚讲过的[动态规划:392.判断子序列](https://programmercarl.com/0392.判断子序列.html)就有难度了,这道题目双指针法可就做不了了,来看看动规五部曲分析如下:
1. 确定dp数组(dp table)以及下标的含义
diff --git "a/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md" "b/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md"
index 34c666f323..e43d79b01f 100644
--- "a/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md"
+++ "b/problems/0116.\345\241\253\345\205\205\346\257\217\344\270\252\350\212\202\347\202\271\347\232\204\344\270\213\344\270\200\344\270\252\345\217\263\344\276\247\350\212\202\347\202\271\346\214\207\351\222\210.md"
@@ -9,7 +9,7 @@
# 116. 填充每个节点的下一个右侧节点指针
-链接:https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node/
+[力扣题目链接](https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node/)
给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:
@@ -87,7 +87,7 @@ public:
## 迭代(层序遍历)
-本题使用层序遍历是最为直观的,如果对层序遍历不了解,看这篇:[二叉树:层序遍历登场!](https://mp.weixin.qq.com/s/4-bDKi7SdwfBGRm9FYduiA)。
+本题使用层序遍历是最为直观的,如果对层序遍历不了解,看这篇:[二叉树:层序遍历登场!](https://programmercarl.com/0102.二叉树的层序遍历.html)。
层序遍历本来就是一层一层的去遍历,记录一层的头结点(nodePre),然后让nodePre指向当前遍历的节点就可以了。
diff --git "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md" "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md"
index 6d068c22a1..daeb05a98a 100644
--- "a/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md"
+++ "b/problems/0121.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.md"
@@ -8,7 +8,7 @@
## 121. 买卖股票的最佳时机
-题目链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/
+[力扣题目链接](https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/)
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md"
index 5373753283..ff1b6d4a9d 100644
--- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md"
+++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md"
@@ -9,7 +9,7 @@
## 122.买卖股票的最佳时机II
-题目链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/
+[力扣题目链接](https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/)
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md"
index 7492ee046c..5dfe3f0e3b 100644
--- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md"
+++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md"
@@ -8,7 +8,7 @@
## 122.买卖股票的最佳时机II
-题目链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/
+[力扣题目链接](https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/)
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
@@ -38,12 +38,12 @@
## 思路
-本题我们在讲解贪心专题的时候就已经讲解过了[贪心算法:买卖股票的最佳时机II](https://mp.weixin.qq.com/s/VsTFA6U96l18Wntjcg3fcg),只不过没有深入讲解动态规划的解法,那么这次我们再好好分析一下动规的解法。
+本题我们在讲解贪心专题的时候就已经讲解过了[贪心算法:买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II.html),只不过没有深入讲解动态规划的解法,那么这次我们再好好分析一下动规的解法。
-本题和[121. 买卖股票的最佳时机](https://mp.weixin.qq.com/s/keWo5qYJY4zmHn3amfXdfQ)的唯一区别本题股票可以买卖多次了(注意只有一只股票,所以再次购买前要出售掉之前的股票)
+本题和[121. 买卖股票的最佳时机](https://programmercarl.com/0121.买卖股票的最佳时机.html)的唯一区别本题股票可以买卖多次了(注意只有一只股票,所以再次购买前要出售掉之前的股票)
-**在动规五部曲中,这个区别主要是体现在递推公式上,其他都和[121. 买卖股票的最佳时机](https://mp.weixin.qq.com/s/keWo5qYJY4zmHn3amfXdfQ)一样一样的**。
+**在动规五部曲中,这个区别主要是体现在递推公式上,其他都和[121. 买卖股票的最佳时机](https://programmercarl.com/0121.买卖股票的最佳时机.html)一样一样的**。
所以我们重点讲一讲递推公式。
@@ -57,10 +57,9 @@
* 第i-1天就持有股票,那么就保持现状,所得现金就是昨天持有股票的所得现金 即:dp[i - 1][0]
* 第i天买入股票,所得现金就是昨天不持有股票的所得现金减去 今天的股票价格 即:dp[i - 1][1] - prices[i]
+**注意这里和[121. 买卖股票的最佳时机](https://programmercarl.com/0121.买卖股票的最佳时机.html)唯一不同的地方,就是推导dp[i][0]的时候,第i天买入股票的情况**。
-**注意这里和[121. 买卖股票的最佳时机](https://mp.weixin.qq.com/s/keWo5qYJY4zmHn3amfXdfQ)唯一不同的地方,就是推导dp[i][0]的时候,第i天买入股票的情况**。
-
-在[121. 买卖股票的最佳时机](https://mp.weixin.qq.com/s/keWo5qYJY4zmHn3amfXdfQ)中,因为股票全程只能买卖一次,所以如果买入股票,那么第i天持有股票即dp[i][0]一定就是 -prices[i]。
+在[121. 买卖股票的最佳时机](https://programmercarl.com/0121.买卖股票的最佳时机.html)中,因为股票全程只能买卖一次,所以如果买入股票,那么第i天持有股票即dp[i][0]一定就是 -prices[i]。
而本题,因为一只股票可以买卖多次,所以当第i天买入股票的时候,所持有的现金可能有之前买卖过的利润。
@@ -70,7 +69,7 @@
* 第i-1天就不持有股票,那么就保持现状,所得现金就是昨天不持有股票的所得现金 即:dp[i - 1][1]
* 第i天卖出股票,所得现金就是按照今天股票佳价格卖出后所得现金即:prices[i] + dp[i - 1][0]
-**注意这里和[121. 买卖股票的最佳时机](https://mp.weixin.qq.com/s/keWo5qYJY4zmHn3amfXdfQ)就是一样的逻辑,卖出股票收获利润(可能是负值)天经地义!**
+**注意这里和[121. 买卖股票的最佳时机](https://programmercarl.com/0121.买卖股票的最佳时机.html)就是一样的逻辑,卖出股票收获利润(可能是负值)天经地义!**
代码如下:(注意代码中的注释,标记了和121.买卖股票的最佳时机唯一不同的地方)
@@ -94,7 +93,7 @@ public:
* 时间复杂度:O(n)
* 空间复杂度:O(n)
-大家可以本题和[121. 买卖股票的最佳时机](https://mp.weixin.qq.com/s/keWo5qYJY4zmHn3amfXdfQ)的代码几乎一样,唯一的区别在:
+大家可以本题和[121. 买卖股票的最佳时机](https://programmercarl.com/0121.买卖股票的最佳时机.html)的代码几乎一样,唯一的区别在:
```
dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);
@@ -122,7 +121,7 @@ public:
return dp[(len - 1) % 2][1];
}
};
-```
+```
* 时间复杂度:O(n)
* 空间复杂度:O(1)
diff --git "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md" "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md"
index 0c92a5a241..6a849c802f 100644
--- "a/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md"
+++ "b/problems/0123.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272III.md"
@@ -8,7 +8,7 @@
## 123.买卖股票的最佳时机III
-题目链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iii/
+[力扣题目链接](https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iii/)
给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。
@@ -44,7 +44,7 @@
## 思路
-这道题目相对 [121.买卖股票的最佳时机](https://mp.weixin.qq.com/s/keWo5qYJY4zmHn3amfXdfQ) 和 [122.买卖股票的最佳时机II](https://mp.weixin.qq.com/s/d4TRWFuhaY83HPa6t5ZL-w) 难了不少。
+这道题目相对 [121.买卖股票的最佳时机](https://programmercarl.com/0121.买卖股票的最佳时机.html) 和 [122.买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II.html) 难了不少。
关键在于至多买卖两次,这意味着可以买卖一次,可以买卖两次,也可以不买卖。
diff --git "a/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md" "b/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md"
index 1764279316..3439cd25db 100644
--- "a/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md"
+++ "b/problems/0129.\346\261\202\346\240\271\345\210\260\345\217\266\345\255\220\350\212\202\347\202\271\346\225\260\345\255\227\344\271\213\345\222\214.md"
@@ -1,13 +1,13 @@
## 链接
-https://leetcode-cn.com/problems/sum-root-to-leaf-numbers/
+[力扣题目链接](https://leetcode-cn.com/problems/sum-root-to-leaf-numbers/)
## 思路
-本题和[113.路径总和II](https://mp.weixin.qq.com/s/6TWAVjxQ34kVqROWgcRFOg)是类似的思路,做完这道题,可以顺便把[113.路径总和II](https://mp.weixin.qq.com/s/6TWAVjxQ34kVqROWgcRFOg) 和 [112.路径总和](https://mp.weixin.qq.com/s/6TWAVjxQ34kVqROWgcRFOg) 做了。
+本题和[113.路径总和II](https://programmercarl.com/0112.路径总和.html#_113-路径总和ii)是类似的思路,做完这道题,可以顺便把[113.路径总和II](https://programmercarl.com/0112.路径总和.html#_113-路径总和ii) 和 [112.路径总和](https://programmercarl.com/0112.路径总和.html#_112-路径总和) 做了。
-结合112.路径总和 和 113.路径总和II,我在讲了[二叉树:递归函数究竟什么时候需要返回值,什么时候不要返回值?](https://mp.weixin.qq.com/s/6TWAVjxQ34kVqROWgcRFOg),如果大家对二叉树递归函数什么时候需要返回值很迷茫,可以看一下。
+结合112.路径总和 和 113.路径总和II,我在讲了[二叉树:递归函数究竟什么时候需要返回值,什么时候不要返回值?](https://programmercarl.com/0112.路径总和.html),如果大家对二叉树递归函数什么时候需要返回值很迷茫,可以看一下。
-接下来在看本题,就简单多了,本题其实需要使用回溯,但一些同学可能都不知道自己用了回溯,在[二叉树:以为使用了递归,其实还隐藏着回溯](https://mp.weixin.qq.com/s/ivLkHzWdhjQQD1rQWe6zWA)中,我详细讲解了二叉树的递归中,如何使用了回溯。
+接下来在看本题,就简单多了,本题其实需要使用回溯,但一些同学可能都不知道自己用了回溯,在[二叉树:以为使用了递归,其实还隐藏着回溯](https://programmercarl.com/二叉树中递归带着回溯.html)中,我详细讲解了二叉树的递归中,如何使用了回溯。
接下来我们来看题:
@@ -17,11 +17,11 @@ https://leetcode-cn.com/problems/sum-root-to-leaf-numbers/
### 递归三部曲
-如果对递归三部曲不了解的话,可以看这里:[二叉树:前中后递归详解](https://mp.weixin.qq.com/s/PwVIfxDlT3kRgMASWAMGhA)
+如果对递归三部曲不了解的话,可以看这里:[二叉树:前中后递归详解](https://programmercarl.com/二叉树的递归遍历.html)
* 确定递归函数返回值及其参数
-这里我们要遍历整个二叉树,且需要要返回值做逻辑处理,所有返回值为void,在[二叉树:递归函数究竟什么时候需要返回值,什么时候不要返回值?](https://mp.weixin.qq.com/s/6TWAVjxQ34kVqROWgcRFOg)中,详细讲解了返回值问题。
+这里我们要遍历整个二叉树,且需要要返回值做逻辑处理,所有返回值为void,在[二叉树:递归函数究竟什么时候需要返回值,什么时候不要返回值?](https://programmercarl.com/0112.路径总和.html)中,详细讲解了返回值问题。
参数只需要把根节点传入,此时还需要定义两个全局遍历,一个是result,记录最终结果,一个是vector path。
diff --git "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md"
index 6fe2758be0..6125b6be01 100644
--- "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md"
+++ "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md"
@@ -11,7 +11,7 @@
## 131.分割回文串
-题目链接:https://leetcode-cn.com/problems/palindrome-partitioning/
+[力扣题目链接](https://leetcode-cn.com/problems/palindrome-partitioning/)
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
@@ -66,7 +66,7 @@
本题递归函数参数还需要startIndex,因为切割过的地方,不能重复切割,和组合问题也是保持一致的。
-在[回溯算法:求组合总和(二)](https://mp.weixin.qq.com/s/FLg8G6EjVcxBjwCbzpACPw)中我们深入探讨了组合问题什么时候需要startIndex,什么时候不需要startIndex。
+在[回溯算法:求组合总和(二)](https://programmercarl.com/0039.组合总和.html)中我们深入探讨了组合问题什么时候需要startIndex,什么时候不需要startIndex。
代码如下:
@@ -143,7 +143,7 @@ for (int i = startIndex; i < s.size(); i++) {
}
```
-如果大家对双指针法有生疏了,传送门:[双指针法:总结篇!](https://mp.weixin.qq.com/s/_p7grwjISfMh0U65uOyCjA)
+如果大家对双指针法有生疏了,传送门:[双指针法:总结篇!](https://programmercarl.com/双指针总结.html)
此时关键代码已经讲解完毕,整体代码如下(详细注释了)
diff --git "a/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md" "b/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md"
index 80784301d7..dbd830d003 100644
--- "a/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md"
+++ "b/problems/0132.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262II.md"
@@ -10,7 +10,7 @@
# 132. 分割回文串 II
-链接:https://leetcode-cn.com/problems/palindrome-partitioning-ii/
+[力扣题目链接](https://leetcode-cn.com/problems/palindrome-partitioning-ii/)
给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文。
@@ -29,7 +29,7 @@
示例 3:
输入:s = "ab"
输出:1
-
+
提示:
@@ -38,7 +38,7 @@
# 思路
-我们在讲解回溯法系列的时候,讲过了这道题目[回溯算法:131.分割回文串](https://mp.weixin.qq.com/s/Pb1epUTbU8fHIht-g_MS5Q)。
+我们在讲解回溯法系列的时候,讲过了这道题目[回溯算法:131.分割回文串](https://programmercarl.com/0131.分割回文串.html)。
本题呢其实也可以使用回溯法,只不过会超时!(通过记忆化回溯,也可以过,感兴趣的同学可以自行研究一下)
@@ -46,7 +46,7 @@
关于回文子串,两道题目题目大家是一定要掌握的。
-* [动态规划:647. 回文子串](https://mp.weixin.qq.com/s/2WetyP6IYQ6VotegepVpEw)
+* [动态规划:647. 回文子串](https://programmercarl.com/0647.回文子串.html)
* 5.最长回文子串 和 647.回文子串基本一样的
这两道题目是回文子串的基础题目,本题也要用到相关的知识点。
diff --git "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" "b/problems/0134.\345\212\240\346\262\271\347\253\231.md"
index e270c059d3..0befd0853c 100644
--- "a/problems/0134.\345\212\240\346\262\271\347\253\231.md"
+++ "b/problems/0134.\345\212\240\346\262\271\347\253\231.md"
@@ -9,7 +9,7 @@
## 134. 加油站
-题目链接:https://leetcode-cn.com/problems/gas-station/
+[力扣题目链接](https://leetcode-cn.com/problems/gas-station/)
在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。
diff --git "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md" "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md"
index 3865e14baa..526b5870fd 100644
--- "a/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md"
+++ "b/problems/0135.\345\210\206\345\217\221\347\263\226\346\236\234.md"
@@ -9,7 +9,7 @@
## 135. 分发糖果
-链接:https://leetcode-cn.com/problems/candy/
+[力扣题目链接](https://leetcode-cn.com/problems/candy/)
老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。
diff --git "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md"
index 0c19a6142c..969d2ce7d1 100644
--- "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md"
+++ "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md"
@@ -10,7 +10,7 @@
## 139.单词拆分
-题目链接:https://leetcode-cn.com/problems/word-break/
+[力扣题目链接](https://leetcode-cn.com/problems/word-break/)
给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。
@@ -37,9 +37,9 @@
## 思路
-看到这道题目的时候,大家应该回想起我们之前讲解回溯法专题的时候,讲过的一道题目[回溯算法:分割回文串](https://mp.weixin.qq.com/s/Pb1epUTbU8fHIht-g_MS5Q),就是枚举字符串的所有分割情况。
+看到这道题目的时候,大家应该回想起我们之前讲解回溯法专题的时候,讲过的一道题目[回溯算法:分割回文串](https://programmercarl.com/0131.分割回文串.html),就是枚举字符串的所有分割情况。
-[回溯算法:分割回文串](https://mp.weixin.qq.com/s/Pb1epUTbU8fHIht-g_MS5Q):是枚举分割后的所有子串,判断是否回文。
+[回溯算法:分割回文串](https://programmercarl.com/0131.分割回文串.html):是枚举分割后的所有子串,判断是否回文。
本道是枚举分割所有字符串,判断是否在字典里出现过。
@@ -161,11 +161,11 @@ dp[0]表示如果字符串为空的话,说明出现在字典里。
**如果求排列数就是外层for遍历背包,内层for循环遍历物品**。
-对这个结论还有疑问的同学可以看这篇[本周小结!(动态规划系列五)](https://mp.weixin.qq.com/s/znj-9j8mWymRFaPjJN2Qnw),这篇本周小节中,我做了如下总结:
+对这个结论还有疑问的同学可以看这篇[本周小结!(动态规划系列五)](https://programmercarl.com/%E5%91%A8%E6%80%BB%E7%BB%93/20210204动规周末总结.html),这篇本周小节中,我做了如下总结:
-求组合数:[动态规划:518.零钱兑换II](https://mp.weixin.qq.com/s/PlowDsI4WMBOzf3q80AksQ)
-求排列数:[动态规划:377. 组合总和 Ⅳ](https://mp.weixin.qq.com/s/Iixw0nahJWQgbqVNk8k6gA)、[动态规划:70. 爬楼梯进阶版(完全背包)](https://mp.weixin.qq.com/s/e_wacnELo-2PG76EjrUakA)
-求最小数:[动态规划:322. 零钱兑换](https://mp.weixin.qq.com/s/dyk-xNilHzNtVdPPLObSeQ)、[动态规划:279.完全平方数](https://mp.weixin.qq.com/s/VfJT78p7UGpDZsapKF_QJQ)
+求组合数:[动态规划:518.零钱兑换II](https://programmercarl.com/0518.零钱兑换II.html)
+求排列数:[动态规划:377. 组合总和 Ⅳ](https://programmercarl.com/0377.组合总和.html)、[动态规划:70. 爬楼梯进阶版(完全背包)](https://programmercarl.com/0070.爬楼梯完全背包版本.html)
+求最小数:[动态规划:322. 零钱兑换](https://programmercarl.com/0322.零钱兑换.html)、[动态规划:279.完全平方数](https://programmercarl.com/0279.完全平方数.html)
本题最终要求的是是否都出现过,所以对出现单词集合里的元素是组合还是排列,并不在意!
@@ -215,7 +215,7 @@ public:
## 总结
-本题和我们之前讲解回溯专题的[回溯算法:分割回文串](https://mp.weixin.qq.com/s/Pb1epUTbU8fHIht-g_MS5Q)非常像,所以我也给出了对应的回溯解法。
+本题和我们之前讲解回溯专题的[回溯算法:分割回文串](https://programmercarl.com/0131.分割回文串.html)非常像,所以我也给出了对应的回溯解法。
稍加分析,便可知道本题是完全背包,而且是求能否组成背包,所以遍历顺序理论上来讲 两层for循环谁先谁后都可以!
diff --git "a/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md" "b/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md"
index 78bcfd432c..34b8d25f95 100644
--- "a/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md"
+++ "b/problems/0141.\347\216\257\345\275\242\351\223\276\350\241\250.md"
@@ -66,7 +66,7 @@ public:
做完这道题目,可以在做做142.环形链表II,不仅仅要找环,还要找环的入口。
-142.环形链表II题解:[链表:环找到了,那入口呢?](https://mp.weixin.qq.com/s/gt_VH3hQTqNxyWcl1ECSbQ)
+142.环形链表II题解:[链表:环找到了,那入口呢?](https://programmercarl.com/0142.环形链表II.html)
# 其他语言版本
diff --git "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md"
index 91e14e27a4..e7deb343d2 100644
--- "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md"
+++ "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md"
@@ -13,7 +13,7 @@
## 142.环形链表II
-https://leetcode-cn.com/problems/linked-list-cycle-ii/
+[力扣题目链接](https://leetcode-cn.com/problems/linked-list-cycle-ii/)
题意:
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
@@ -146,7 +146,7 @@ public:
在推理过程中,大家可能有一个疑问就是:**为什么第一次在环中相遇,slow的 步数 是 x+y 而不是 x + 若干环的长度 + y 呢?**
-即文章[链表:环找到了,那入口呢?](https://mp.weixin.qq.com/s/_QVP3IkRZWx9zIpQRgajzA)中如下的地方:
+即文章[链表:环找到了,那入口呢?](https://programmercarl.com/0142.环形链表II.html)中如下的地方:

@@ -175,7 +175,7 @@ public:
那有同学又说了,为什么fast不能跳过去呢? 在刚刚已经说过一次了,**fast相对于slow是一次移动一个节点,所以不可能跳过去**。
-好了,这次把为什么第一次在环中相遇,slow的 步数 是 x+y 而不是 x + 若干环的长度 + y ,用数学推理了一下,算是对[链表:环找到了,那入口呢?](https://mp.weixin.qq.com/s/_QVP3IkRZWx9zIpQRgajzA)的补充。
+好了,这次把为什么第一次在环中相遇,slow的 步数 是 x+y 而不是 x + 若干环的长度 + y ,用数学推理了一下,算是对[链表:环找到了,那入口呢?](https://programmercarl.com/0142.环形链表II.html)的补充。
## 总结
diff --git "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md"
index bcde7d5ba4..7eb5bc008c 100644
--- "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md"
+++ "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md"
@@ -13,7 +13,7 @@
# 150. 逆波兰表达式求值
-https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/
+[力扣题目链接](https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/)
根据 逆波兰表示法,求表达式的值。
@@ -23,7 +23,7 @@ https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/
整数除法只保留整数部分。
给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
-
+
示例 1:
* 输入: ["2", "1", "+", "3", " * "]
@@ -40,13 +40,13 @@ https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/
* 输出: 22
* 解释:该算式转化为常见的中缀算术表达式为:
((10 * (6 / ((9 + 3) * -11))) + 17) + 5
-= ((10 * (6 / (12 * -11))) + 17) + 5
-= ((10 * (6 / -132)) + 17) + 5
-= ((10 * 0) + 17) + 5
-= (0 + 17) + 5
-= 17 + 5
-= 22
-
+ = ((10 * (6 / (12 * -11))) + 17) + 5
+ = ((10 * (6 / -132)) + 17) + 5
+ = ((10 * 0) + 17) + 5
+ = (0 + 17) + 5
+ = 17 + 5
+ = 22
+
逆波兰表达式:是一种后缀表达式,所谓后缀就是指算符写在后面。
@@ -62,7 +62,7 @@ https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/
# 思路
-在上一篇文章中[1047.删除字符串中的所有相邻重复项](https://mp.weixin.qq.com/s/1-x6r1wGA9mqIHW5LrMvBg)提到了 递归就是用栈来实现的。
+在上一篇文章中[1047.删除字符串中的所有相邻重复项](https://programmercarl.com/1047.删除字符串中的所有相邻重复项.html)提到了 递归就是用栈来实现的。
所以**栈与递归之间在某种程度上是可以转换的!** 这一点我们在后续讲解二叉树的时候,会更详细的讲解到。
@@ -70,12 +70,12 @@ https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/
但我们没有必要从二叉树的角度去解决这个问题,只要知道逆波兰表达式是用后续遍历的方式把二叉树序列化了,就可以了。
-在进一步看,本题中每一个子表达式要得出一个结果,然后拿这个结果再进行运算,那么**这岂不就是一个相邻字符串消除的过程,和[1047.删除字符串中的所有相邻重复项](https://mp.weixin.qq.com/s/1-x6r1wGA9mqIHW5LrMvBg)中的对对碰游戏是不是就非常像了。**
+在进一步看,本题中每一个子表达式要得出一个结果,然后拿这个结果再进行运算,那么**这岂不就是一个相邻字符串消除的过程,和[1047.删除字符串中的所有相邻重复项](https://programmercarl.com/1047.删除字符串中的所有相邻重复项.html)中的对对碰游戏是不是就非常像了。**
如动画所示:

-相信看完动画大家应该知道,这和[1047. 删除字符串中的所有相邻重复项](https://mp.weixin.qq.com/s/1-x6r1wGA9mqIHW5LrMvBg)是差不错的,只不过本题不要相邻元素做消除了,而是做运算!
+相信看完动画大家应该知道,这和[1047. 删除字符串中的所有相邻重复项](https://programmercarl.com/1047.删除字符串中的所有相邻重复项.html)是差不错的,只不过本题不要相邻元素做消除了,而是做运算!
C++代码如下:
@@ -223,19 +223,17 @@ var evalRPN = function(tokens) {
python3
```python
-class Solution:
- def evalRPN(self, tokens: List[str]) -> int:
- stack = []
- for item in tokens:
- if item not in {"+", "-", "*", "/"}:
- stack.append(item)
- else:
- first_num, second_num = stack.pop(), stack.pop()
- stack.append(
- int(eval(f'{second_num} {item} {first_num}')) # 第一个出来的在运算符后面
- )
- return int(stack.pop()) # 如果一开始只有一个数,那么会是字符串形式的
-
+def evalRPN(tokens) -> int:
+ stack = list()
+ for i in range(len(tokens)):
+ if tokens[i] not in ["+", "-", "*", "/"]:
+ stack.append(tokens[i])
+ else:
+ tmp1 = stack.pop()
+ tmp2 = stack.pop()
+ res = eval(tmp2+tokens[i]+tmp1)
+ stack.append(str(int(res)))
+ return stack[-1]
```
diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md"
index 3f4d00b26f..84e348a965 100644
--- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md"
+++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md"
@@ -12,7 +12,7 @@
# 151.翻转字符串里的单词
-https://leetcode-cn.com/problems/reverse-words-in-a-string/
+[力扣题目链接](https://leetcode-cn.com/problems/reverse-words-in-a-string/)
给定一个字符串,逐个翻转字符串中的每个单词。
@@ -83,13 +83,13 @@ void removeExtraSpaces(string& s) {
如果不仔细琢磨一下erase的时间复杂读,还以为以上的代码是O(n)的时间复杂度呢。
-想一下真正的时间复杂度是多少,一个erase本来就是O(n)的操作,erase实现原理题目:[数组:就移除个元素很难么?](https://mp.weixin.qq.com/s/RMkulE4NIb6XsSX83ra-Ww),最优的算法来移除元素也要O(n)。
+想一下真正的时间复杂度是多少,一个erase本来就是O(n)的操作,erase实现原理题目:[数组:就移除个元素很难么?](https://programmercarl.com/0027.移除元素.html),最优的算法来移除元素也要O(n)。
erase操作上面还套了一个for循环,那么以上代码移除冗余空格的代码时间复杂度为O(n^2)。
那么使用双指针法来去移除空格,最后resize(重新设置)一下字符串的大小,就可以做到O(n)的时间复杂度。
-如果对这个操作比较生疏了,可以再看一下这篇文章:[数组:就移除个元素很难么?](https://mp.weixin.qq.com/s/RMkulE4NIb6XsSX83ra-Ww)是如何移除元素的。
+如果对这个操作比较生疏了,可以再看一下这篇文章:[数组:就移除个元素很难么?](https://programmercarl.com/0027.移除元素.html)是如何移除元素的。
那么使用双指针来移除冗余空格代码如下: fastIndex走的快,slowIndex走的慢,最后slowIndex就标记着移除多余空格后新字符串的长度。
@@ -125,7 +125,7 @@ void removeExtraSpaces(string& s) {
此时我们已经实现了removeExtraSpaces函数来移除冗余空格。
-还做实现反转字符串的功能,支持反转字符串子区间,这个实现我们分别在[344.反转字符串](https://mp.weixin.qq.com/s/_rNm66OJVl92gBDIbGpA3w)和[541.反转字符串II](https://mp.weixin.qq.com/s/pzXt6PQ029y7bJ9YZB2mVQ)里已经讲过了。
+还做实现反转字符串的功能,支持反转字符串子区间,这个实现我们分别在[344.反转字符串](https://programmercarl.com/0344.反转字符串.html)和[541.反转字符串II](https://programmercarl.com/0541.反转字符串II.html)里已经讲过了。
代码如下:
diff --git "a/problems/0160.\347\233\270\344\272\244\351\223\276\350\241\250.md" "b/problems/0160.\347\233\270\344\272\244\351\223\276\350\241\250.md"
index 7ac1848b45..42b2ee5693 100644
--- "a/problems/0160.\347\233\270\344\272\244\351\223\276\350\241\250.md"
+++ "b/problems/0160.\347\233\270\344\272\244\351\223\276\350\241\250.md"
@@ -1,3 +1,3 @@
-同:[链表:链表相交](./面试题02.07.链表相交.md)
+同:[链表:链表相交](https://programmercarl.com/面试题02.07.链表相交.html)
diff --git "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md" "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md"
index 66676a7a74..bcb8a1ab72 100644
--- "a/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md"
+++ "b/problems/0188.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272IV.md"
@@ -8,7 +8,7 @@
## 188.买卖股票的最佳时机IV
-题目链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iv/
+[力扣题目链接](https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iv/)
给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格。
@@ -35,13 +35,13 @@
## 思路
-这道题目可以说是[动态规划:123.买卖股票的最佳时机III](https://mp.weixin.qq.com/s/Sbs157mlVDtAR0gbLpdKzg)的进阶版,这里要求至多有k次交易。
+这道题目可以说是[动态规划:123.买卖股票的最佳时机III](https://programmercarl.com/0123.买卖股票的最佳时机III.html)的进阶版,这里要求至多有k次交易。
动规五部曲,分析如下:
1. 确定dp数组以及下标的含义
-在[动态规划:123.买卖股票的最佳时机III](https://mp.weixin.qq.com/s/Sbs157mlVDtAR0gbLpdKzg)中,我是定义了一个二维dp数组,本题其实依然可以用一个二维dp数组。
+在[动态规划:123.买卖股票的最佳时机III](https://programmercarl.com/0123.买卖股票的最佳时机III.html)中,我是定义了一个二维dp数组,本题其实依然可以用一个二维dp数组。
使用二维数组 dp[i][j] :第i天的状态为j,所剩下的最大现金是dp[i][j]
@@ -91,7 +91,7 @@ for (int j = 0; j < 2 * k - 1; j += 2) {
}
```
-**本题和[动态规划:123.买卖股票的最佳时机III](https://mp.weixin.qq.com/s/Sbs157mlVDtAR0gbLpdKzg)最大的区别就是这里要类比j为奇数是买,偶数是卖剩的状态**。
+**本题和[动态规划:123.买卖股票的最佳时机III](https://programmercarl.com/0123.买卖股票的最佳时机III.html)最大的区别就是这里要类比j为奇数是买,偶数是卖剩的状态**。
3. dp数组如何初始化
diff --git "a/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" "b/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md"
index be46bf4c1b..ba6edd1f65 100644
--- "a/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md"
+++ "b/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md"
@@ -37,17 +37,17 @@
这道题目在字符串里其实很常见,我把字符串反转相关的题目列一下:
-* [字符串:力扣541.反转字符串II](https://mp.weixin.qq.com/s/pzXt6PQ029y7bJ9YZB2mVQ)
-* [字符串:力扣151.翻转字符串里的单词](https://mp.weixin.qq.com/s/4j6vPFHkFAXnQhmSkq2X9g)
-* [字符串:剑指Offer58-II.左旋转字符串](https://mp.weixin.qq.com/s/Px_L-RfT2b_jXKcNmccPsw)
+* [字符串:力扣541.反转字符串II](https://programmercarl.com/0541.反转字符串II.html)
+* [字符串:力扣151.翻转字符串里的单词](https://programmercarl.com/0151.翻转字符串里的单词.html)
+* [字符串:剑指Offer58-II.左旋转字符串](https://programmercarl.com/剑指Offer58-II.左旋转字符串.html)
-本题其实和[字符串:剑指Offer58-II.左旋转字符串](https://mp.weixin.qq.com/s/Px_L-RfT2b_jXKcNmccPsw)就非常像了,剑指offer上左旋转,本题是右旋转。
+本题其实和[字符串:剑指Offer58-II.左旋转字符串](https://programmercarl.com/剑指Offer58-II.左旋转字符串.html)就非常像了,剑指offer上左旋转,本题是右旋转。
注意题目要求是**要求使用空间复杂度为 O(1) 的 原地 算法**
那么我来提供一种旋转的方式哈。
-在[字符串:剑指Offer58-II.左旋转字符串](https://mp.weixin.qq.com/s/Px_L-RfT2b_jXKcNmccPsw)中,我们提到,如下步骤就可以坐旋转字符串:
+在[字符串:剑指Offer58-II.左旋转字符串](https://programmercarl.com/剑指Offer58-II.左旋转字符串.html)中,我们提到,如下步骤就可以坐旋转字符串:
1. 反转区间为前n的子串
2. 反转区间为n到末尾的子串
diff --git "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md" "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md"
index 93b56dae91..c8645c48db 100644
--- "a/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md"
+++ "b/problems/0198.\346\211\223\345\256\266\345\212\253\350\210\215.md"
@@ -8,7 +8,7 @@
## 198.打家劫舍
-题目链接:https://leetcode-cn.com/problems/house-robber/
+[力扣题目链接](https://leetcode-cn.com/problems/house-robber/)
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
diff --git "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" "b/problems/0202.\345\277\253\344\271\220\346\225\260.md"
index 2e784e6ac8..b9386a68d9 100644
--- "a/problems/0202.\345\277\253\344\271\220\346\225\260.md"
+++ "b/problems/0202.\345\277\253\344\271\220\346\225\260.md"
@@ -12,7 +12,7 @@
# 第202题. 快乐数
-https://leetcode-cn.com/problems/happy-number/
+[力扣题目链接](https://leetcode-cn.com/problems/happy-number/)
编写一个算法来判断一个数 n 是不是快乐数。
@@ -36,7 +36,7 @@ https://leetcode-cn.com/problems/happy-number/
题目中说了会 **无限循环**,那么也就是说**求和的过程中,sum会重复出现,这对解题很重要!**
-正如:[关于哈希表,你该了解这些!](https://mp.weixin.qq.com/s/RSUANESA_tkhKhYe3ZR8Jg)中所说,**当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法了。**
+正如:[关于哈希表,你该了解这些!](https://programmercarl.com/哈希表理论基础.html)中所说,**当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法了。**
所以这道题目使用哈希法,来判断这个sum是否重复出现,如果重复了就是return false, 否则一直找到sum为1为止。
diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md"
index d67a7d2a40..555dad03d0 100644
--- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md"
+++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md"
@@ -11,7 +11,7 @@
# 203.移除链表元素
-https://leetcode-cn.com/problems/remove-linked-list-elements/
+[力扣题目链接](https://leetcode-cn.com/problems/remove-linked-list-elements/)
题意:删除链表中等于给定值 val 的所有节点。
@@ -245,15 +245,13 @@ Python:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
-
class Solution:
def removeElements(self, head: ListNode, val: int) -> ListNode:
- dummy_head = ListNode(next=head)
+ dummy_head = ListNode(next=head) #添加一个虚拟节点
cur = dummy_head
-
- while cur.next:
- if cur.next.val == val:
- cur.next = cur.next.next # 删除下一个节点
+ while(cur.next!=None):
+ if(cur.next.val == val):
+ cur.next = cur.next.next #删除cur.next节点
else:
cur = cur.next
return dummy_head.next
diff --git "a/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" "b/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md"
index d5077e03de..5b0dd82bc9 100644
--- "a/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md"
+++ "b/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md"
@@ -9,7 +9,7 @@
# 205. 同构字符串
-题目地址:https://leetcode-cn.com/problems/isomorphic-strings/
+[力扣题目链接](https://leetcode-cn.com/problems/isomorphic-strings/)
给定两个字符串 s 和 t,判断它们是否是同构的。
diff --git "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md" "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md"
index 0c850d52cc..45196386af 100644
--- "a/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md"
+++ "b/problems/0206.\347\277\273\350\275\254\351\223\276\350\241\250.md"
@@ -11,7 +11,7 @@
# 206.反转链表
-https://leetcode-cn.com/problems/reverse-linked-list/
+[力扣题目链接](https://leetcode-cn.com/problems/reverse-linked-list/)
题意:反转一个单链表。
diff --git "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md"
index 3219d16fb1..45d2a22948 100644
--- "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md"
+++ "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md"
@@ -9,7 +9,7 @@
## 209.长度最小的子数组
-题目链接: https://leetcode-cn.com/problems/minimum-size-subarray-sum/
+[力扣题目链接](https://leetcode-cn.com/problems/minimum-size-subarray-sum/)
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
diff --git "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md" "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md"
index e828d17a8e..332d321850 100644
--- "a/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md"
+++ "b/problems/0213.\346\211\223\345\256\266\345\212\253\350\210\215II.md"
@@ -8,7 +8,7 @@
## 213.打家劫舍II
-题目链接:https://leetcode-cn.com/problems/house-robber-ii/
+[力扣题目链接](https://leetcode-cn.com/problems/house-robber-ii/)
你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。
@@ -28,14 +28,14 @@
示例 3:
输入:nums = [0]
输出:0
-
+
提示:
* 1 <= nums.length <= 100
* 0 <= nums[i] <= 1000
## 思路
-这道题目和[198.打家劫舍](https://mp.weixin.qq.com/s/UZ31WdLEEFmBegdgLkJ8Dw)是差不多的,唯一区别就是成环了。
+这道题目和[198.打家劫舍](https://programmercarl.com/0198.打家劫舍.html)是差不多的,唯一区别就是成环了。
对于一个数组,成环的话主要有如下三种情况:
@@ -55,7 +55,7 @@
**而情况二 和 情况三 都包含了情况一了,所以只考虑情况二和情况三就可以了**。
-分析到这里,本题其实比较简单了。 剩下的和[198.打家劫舍](https://mp.weixin.qq.com/s/UZ31WdLEEFmBegdgLkJ8Dw)就是一样的了。
+分析到这里,本题其实比较简单了。 剩下的和[198.打家劫舍](https://programmercarl.com/0198.打家劫舍.html)就是一样的了。
代码如下:
diff --git "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md" "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md"
index c9cfa97329..177c6b03e1 100644
--- "a/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md"
+++ "b/problems/0216.\347\273\204\345\220\210\346\200\273\345\222\214III.md"
@@ -13,7 +13,7 @@
# 216.组合总和III
-链接:https://leetcode-cn.com/problems/combination-sum-iii/
+[力扣题目链接](https://leetcode-cn.com/problems/combination-sum-iii/)
找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
@@ -34,9 +34,9 @@
本题就是在[1,2,3,4,5,6,7,8,9]这个集合中找到和为n的k个数的组合。
-相对于[77. 组合](https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ),无非就是多了一个限制,本题是要找到和为n的k个数的组合,而整个集合已经是固定的了[1,...,9]。
+相对于[77. 组合](https://programmercarl.com/0077.组合.html),无非就是多了一个限制,本题是要找到和为n的k个数的组合,而整个集合已经是固定的了[1,...,9]。
-想到这一点了,做过[77. 组合](https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ)之后,本题是简单一些了。
+想到这一点了,做过[77. 组合](https://programmercarl.com/0077.组合.html)之后,本题是简单一些了。
本题k相当于了树的深度,9(因为整个集合就是9个数)就是树的宽度。
@@ -53,7 +53,7 @@
* **确定递归函数参数**
-和[77. 组合](https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ)一样,依然需要一维数组path来存放符合条件的结果,二维数组result来存放结果集。
+和[77. 组合](https://programmercarl.com/0077.组合.html)一样,依然需要一维数组path来存放符合条件的结果,二维数组result来存放结果集。
这里我依然定义path 和 result为全局变量。
@@ -103,7 +103,7 @@ if (path.size() == k) {
* **单层搜索过程**
-本题和[77. 组合](https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ)区别之一就是集合固定的就是9个数[1,...,9],所以for循环固定i<=9
+本题和[77. 组合](https://programmercarl.com/0077.组合.html)区别之一就是集合固定的就是9个数[1,...,9],所以for循环固定i<=9
如图:

@@ -124,7 +124,7 @@ for (int i = startIndex; i <= 9; i++) {
**别忘了处理过程 和 回溯过程是一一对应的,处理有加,回溯就要有减!**
-参照[关于回溯算法,你该了解这些!](https://mp.weixin.qq.com/s/gjSgJbNbd1eAA5WkA-HeWw)中的模板,不难写出如下C++代码:
+参照[关于回溯算法,你该了解这些!](https://programmercarl.com/回溯算法理论基础.html)中的模板,不难写出如下C++代码:
```CPP
class Solution {
@@ -176,7 +176,7 @@ if (sum > targetSum) { // 剪枝操作
}
```
-和[回溯算法:组合问题再剪剪枝](https://mp.weixin.qq.com/s/Ri7spcJMUmph4c6XjPWXQA) 一样,for循环的范围也可以剪枝,i <= 9 - (k - path.size()) + 1就可以了。
+和[回溯算法:组合问题再剪剪枝](https://programmercarl.com/0077.组合优化.html) 一样,for循环的范围也可以剪枝,i <= 9 - (k - path.size()) + 1就可以了。
最后C++代码如下:
@@ -214,7 +214,7 @@ public:
# 总结
-开篇就介绍了本题与[回溯算法:求组合问题!](https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ)的区别,相对来说加了元素总和的限制,如果做完[回溯算法:求组合问题!](https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ)再做本题在合适不过。
+开篇就介绍了本题与[回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)的区别,相对来说加了元素总和的限制,如果做完[回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)再做本题在合适不过。
分析完区别,依然把问题抽象为树形结构,按照回溯三部曲进行讲解,最后给出剪枝的优化。
diff --git "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md"
index 0d3a818e48..6268c447b5 100644
--- "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md"
+++ "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md"
@@ -9,7 +9,7 @@
# 222.完全二叉树的节点个数
-题目地址:https://leetcode-cn.com/problems/count-complete-tree-nodes/
+[力扣题目链接](https://leetcode-cn.com/problems/count-complete-tree-nodes/)
给出一个完全二叉树,求出该树的节点个数。
@@ -41,13 +41,13 @@
首先按照普通二叉树的逻辑来求。
-这道题目的递归法和求二叉树的深度写法类似, 而迭代法,[二叉树:层序遍历登场!](https://mp.weixin.qq.com/s/4-bDKi7SdwfBGRm9FYduiA)遍历模板稍稍修改一下,记录遍历的节点数量就可以了。
+这道题目的递归法和求二叉树的深度写法类似, 而迭代法,[二叉树:层序遍历登场!](https://programmercarl.com/0102.二叉树的层序遍历.html)遍历模板稍稍修改一下,记录遍历的节点数量就可以了。
递归遍历的顺序依然是后序(左右中)。
### 递归
-如果对求二叉树深度还不熟悉的话,看这篇:[二叉树:看看这些树的最大深度](https://mp.weixin.qq.com/s/jRaRcRerhEHepQbt-aKstw)。
+如果对求二叉树深度还不熟悉的话,看这篇:[二叉树:看看这些树的最大深度](https://programmercarl.com/0104.二叉树的最大深度.html)。
1. 确定递归函数的参数和返回值:参数就是传入树的根节点,返回就返回以该节点为根节点二叉树的节点数量,所以返回值为int类型。
@@ -115,7 +115,7 @@ public:
### 迭代法
-如果对求二叉树层序遍历还不熟悉的话,看这篇:[二叉树:层序遍历登场!](https://mp.weixin.qq.com/s/4-bDKi7SdwfBGRm9FYduiA)。
+如果对求二叉树层序遍历还不熟悉的话,看这篇:[二叉树:层序遍历登场!](https://programmercarl.com/0102.二叉树的层序遍历.html)。
那么只要模板少做改动,加一个变量result,统计节点数量就可以了
@@ -145,7 +145,7 @@ public:
## 完全二叉树
-以上方法都是按照普通二叉树来做的,对于完全二叉树特性不了解的同学可以看这篇 [关于二叉树,你该了解这些!](https://mp.weixin.qq.com/s/q_eKfL8vmSbSFcptZ3aeRA),这篇详细介绍了各种二叉树的特性。
+以上方法都是按照普通二叉树来做的,对于完全二叉树特性不了解的同学可以看这篇 [关于二叉树,你该了解这些!](https://programmercarl.com/二叉树理论基础.html),这篇详细介绍了各种二叉树的特性。
完全二叉树只有两种情况,情况一:就是满二叉树,情况二:最后一层叶子节点没有满。
diff --git "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md"
index ccf93f1fbd..d6386cee96 100644
--- "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md"
+++ "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md"
@@ -12,7 +12,7 @@
# 225. 用队列实现栈
-https://leetcode-cn.com/problems/implement-stack-using-queues/
+[力扣题目链接](https://leetcode-cn.com/problems/implement-stack-using-queues/)
使用队列实现栈的下列操作:
@@ -34,7 +34,7 @@ https://leetcode-cn.com/problems/implement-stack-using-queues/
有的同学可能疑惑这种题目有什么实际工程意义,**其实很多算法题目主要是对知识点的考察和教学意义远大于其工程实践的意义,所以面试题也是这样!**
-刚刚做过[栈与队列:我用栈来实现队列怎么样?](https://mp.weixin.qq.com/s/Cj6R0qu8rFA7Et9V_ZMjCA)的同学可能依然想着用一个输入队列,一个输出队列,就可以模拟栈的功能,仔细想一下还真不行!
+刚刚做过[栈与队列:我用栈来实现队列怎么样?](https://programmercarl.com/0232.用栈实现队列.html)的同学可能依然想着用一个输入队列,一个输出队列,就可以模拟栈的功能,仔细想一下还真不行!
**队列模拟栈,其实一个队列就够了**,那么我们先说一说两个队列来实现栈的思路。
@@ -294,66 +294,53 @@ Python:
```python
from collections import deque
-
class MyStack:
-
def __init__(self):
"""
- Python普通的Queue或SimpleQueue没有类似于peek的功能
- 也无法用索引访问,在实现top的时候较为困难。
-
- 用list可以,但是在使用pop(0)的时候时间复杂度为O(n)
- 因此这里使用双向队列,我们保证只执行popleft()和append(),因为deque可以用索引访问,可以实现和peek相似的功能
-
- in - 存所有数据
- out - 仅在pop的时候会用到
+ Initialize your data structure here.
"""
- self.queue_in = deque()
- self.queue_out = deque()
+ #使用两个队列来实现
+ self.que1 = deque()
+ self.que2 = deque()
def push(self, x: int) -> None:
"""
- 直接append即可
+ Push element x onto stack.
"""
- self.queue_in.append(x)
-
+ self.que1.append(x)
def pop(self) -> int:
"""
- 1. 首先确认不空
- 2. 因为队列的特殊性,FIFO,所以我们只有在pop()的时候才会使用queue_out
- 3. 先把queue_in中的所有元素(除了最后一个),依次出列放进queue_out
- 4. 交换in和out,此时out里只有一个元素
- 5. 把out中的pop出来,即是原队列的最后一个
-
- tip:这不能像栈实现队列一样,因为另一个queue也是FIFO,如果执行pop()它不能像
- stack一样从另一个pop(),所以干脆in只用来存数据,pop()的时候两个进行交换
+ Removes the element on top of the stack and returns that element.
"""
- if self.empty():
- return None
+ size = len(self.que1)
+ size -= 1#这里先减一是为了保证最后面的元素
+ while size > 0:
+ size -= 1
+ self.que2.append(self.que1.popleft())
+
- for i in range(len(self.queue_in) - 1):
- self.queue_out.append(self.queue_in.popleft())
-
- self.queue_in, self.queue_out = self.queue_out, self.queue_in # 交换in和out,这也是为啥in只用来存
- return self.queue_out.popleft()
+ result = self.que1.popleft()
+ self.que1, self.que2= self.que2, self.que1#将que2和que1交换 que1经过之前的操作应该是空了
+ #一定注意不能直接使用que1 = que2 这样que2的改变会影响que1 可以用浅拷贝
+ return result
def top(self) -> int:
"""
- 1. 首先确认不空
- 2. 我们仅有in会存放数据,所以返回第一个即可
+ Get the top element.
"""
- if self.empty():
- return None
-
- return self.queue_in[-1]
-
+ return self.que1[-1]
def empty(self) -> bool:
"""
- 因为只有in存了数据,只要判断in是不是有数即可
+ Returns whether the stack is empty.
"""
- return len(self.queue_in) == 0
+ #print(self.que1)
+ if len(self.que1) == 0:
+ return True
+ else:
+ return False
+
```
diff --git "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md"
index 6eb6f301f8..490957c270 100644
--- "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md"
+++ "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md"
@@ -9,7 +9,7 @@
# 226.翻转二叉树
-题目地址:https://leetcode-cn.com/problems/invert-binary-tree/
+[力扣题目链接](https://leetcode-cn.com/problems/invert-binary-tree/)
翻转一棵二叉树。
@@ -51,7 +51,7 @@
-对于二叉树的递归法的前中后序遍历,已经在[二叉树:前中后序递归遍历](https://mp.weixin.qq.com/s/Ww60X5mIKWdMQV4cN3ejOA)详细讲解了。
+对于二叉树的递归法的前中后序遍历,已经在[二叉树:前中后序递归遍历](https://programmercarl.com/二叉树的递归遍历.html)详细讲解了。
我们下文以前序遍历为例,通过动画来看一下翻转的过程:
@@ -106,8 +106,7 @@ public:
### 深度优先遍历
-
-[二叉树:听说递归能做的,栈也能做!](https://mp.weixin.qq.com/s/OH7aCVJ5-Gi32PkNCoZk4A)中给出了前中后序迭代方式的写法,所以本地可以很轻松的切出如下迭代法的代码:
+[二叉树:听说递归能做的,栈也能做!](https://programmercarl.com/二叉树的迭代遍历.html)中给出了前中后序迭代方式的写法,所以本地可以很轻松的切出如下迭代法的代码:
C++代码迭代法(前序遍历)
@@ -129,10 +128,10 @@ public:
}
};
```
-如果这个代码看不懂的话可以在回顾一下[二叉树:听说递归能做的,栈也能做!](https://mp.weixin.qq.com/s/OH7aCVJ5-Gi32PkNCoZk4A)。
+如果这个代码看不懂的话可以在回顾一下[二叉树:听说递归能做的,栈也能做!](https://programmercarl.com/二叉树的迭代遍历.html)。
-我们在[二叉树:前中后序迭代方式的统一写法](https://mp.weixin.qq.com/s/ATQMPCpBlaAgrqdLDMVPZA)中介绍了统一的写法,所以,本题也只需将文中的代码少做修改便可。
+我们在[二叉树:前中后序迭代方式的统一写法](https://programmercarl.com/二叉树的统一迭代法.html)中介绍了统一的写法,所以,本题也只需将文中的代码少做修改便可。
C++代码如下迭代法(前序遍历)
@@ -162,7 +161,7 @@ public:
};
```
-如果上面这个代码看不懂,回顾一下文章[二叉树:前中后序迭代方式的统一写法](https://mp.weixin.qq.com/s/ATQMPCpBlaAgrqdLDMVPZA)。
+如果上面这个代码看不懂,回顾一下文章[二叉树:前中后序迭代方式的统一写法](https://programmercarl.com/二叉树的统一迭代法.html)。
### 广度优先遍历
@@ -188,7 +187,7 @@ public:
}
};
```
-如果对以上代码不理解,或者不清楚二叉树的层序遍历,可以看这篇[二叉树:层序遍历登场!](https://mp.weixin.qq.com/s/4-bDKi7SdwfBGRm9FYduiA)
+如果对以上代码不理解,或者不清楚二叉树的层序遍历,可以看这篇[二叉树:层序遍历登场!](https://programmercarl.com/0102.二叉树的层序遍历.html)
## 拓展
diff --git "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md"
index 27a3de4e5e..2452e8f169 100644
--- "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md"
+++ "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md"
@@ -11,7 +11,7 @@
# 232.用栈实现队列
-https://leetcode-cn.com/problems/implement-queue-using-stacks/
+[力扣题目链接](https://leetcode-cn.com/problems/implement-queue-using-stacks/)
使用栈实现队列的下列操作:
@@ -281,60 +281,48 @@ class MyQueue {
Python:
```python
+# 使用两个栈实现先进先出的队列
class MyQueue:
-
def __init__(self):
"""
- in主要负责push,out主要负责pop
+ Initialize your data structure here.
"""
- self.stack_in = []
- self.stack_out = []
-
+ self.stack1 = list()
+ self.stack2 = list()
def push(self, x: int) -> None:
"""
- 有新元素进来,就往in里面push
+ Push element x to the back of queue.
"""
- self.stack_in.append(x)
-
+ # self.stack1用于接受元素
+ self.stack1.append(x)
def pop(self) -> int:
"""
- 1. 检查如果out里面元素,则直接pop
- 2. 如果out没有元素,就把in里面的元素(除了第一个)依次pop后装进out里面
- 3. 直接把in剩下的元素pop出来,就是queue头部的
+ Removes the element from in front of queue and returns that element.
"""
- if self.empty:
- return None
-
- if self.stack_out:
- return self.stack_out.pop()
- else:
- for i in range(1, len(self.stack_in)):
- self.stack_out.append(self.stack_in.pop())
- return self.stack_in.pop()
-
+ # self.stack2用于弹出元素,如果self.stack2为[],则将self.stack1中元素全部弹出给self.stack2
+ if self.stack2 == []:
+ while self.stack1:
+ tmp = self.stack1.pop()
+ self.stack2.append(tmp)
+ return self.stack2.pop()
def peek(self) -> int:
"""
- 1. 查out有没有元素,有就把最上面的返回
- 2. 如果out没有元素,就把in最下面的返回
+ Get the front element.
"""
- if self.empty:
- return None
-
- if self.stack_out:
- return self.stack_out[-1]
- else:
- return self.stack_in[0]
-
+ if self.stack2 == []:
+ while self.stack1:
+ tmp = self.stack1.pop()
+ self.stack2.append(tmp)
+ return self.stack2[-1]
def empty(self) -> bool:
"""
- 只要in或者out有元素,说明队列不为空
+ Returns whether the queue is empty.
"""
- return not (self.stack_in or self.stack_out)
-
+ return self.stack1 == [] and self.stack2 == []
```
diff --git "a/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" "b/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md"
index b3ad899caa..04015a7f52 100644
--- "a/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md"
+++ "b/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md"
@@ -9,7 +9,7 @@
# 234.回文链表
-题目链接:https://leetcode-cn.com/problems/palindrome-linked-list/
+[力扣题目链接](https://leetcode-cn.com/problems/palindrome-linked-list/)
请判断一个链表是否为回文链表。
diff --git "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md"
index fe87506754..fab450baf9 100644
--- "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md"
+++ "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md"
@@ -9,7 +9,7 @@
## 235. 二叉搜索树的最近公共祖先
-链接:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-search-tree/
+[力扣题目链接](https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-search-tree/)
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
@@ -38,7 +38,7 @@
## 思路
-做过[二叉树:公共祖先问题](https://mp.weixin.qq.com/s/n6Rk3nc_X3TSkhXHrVmBTQ)题目的同学应该知道,利用回溯从底向上搜索,遇到一个节点的左子树里有p,右子树里有q,那么当前节点就是最近公共祖先。
+做过[二叉树:公共祖先问题](https://programmercarl.com/0236.二叉树的最近公共祖先.html)题目的同学应该知道,利用回溯从底向上搜索,遇到一个节点的左子树里有p,右子树里有q,那么当前节点就是最近公共祖先。
那么本题是二叉搜索树,二叉搜索树是有序的,那得好好利用一下这个特点。
@@ -48,7 +48,7 @@
理解这一点,本题就很好解了。
-和[二叉树:公共祖先问题](https://mp.weixin.qq.com/s/n6Rk3nc_X3TSkhXHrVmBTQ)不同,普通二叉树求最近公共祖先需要使用回溯,从底向上来查找,二叉搜索树就不用了,因为搜索树有序(相当于自带方向),那么只要从上向下遍历就可以了。
+和[二叉树:公共祖先问题](https://programmercarl.com/0236.二叉树的最近公共祖先.html)不同,普通二叉树求最近公共祖先需要使用回溯,从底向上来查找,二叉搜索树就不用了,因为搜索树有序(相当于自带方向),那么只要从上向下遍历就可以了。
那么我们可以采用前序遍历(其实这里没有中节点的处理逻辑,遍历顺序无所谓了)。
@@ -105,7 +105,7 @@ if (cur->val > p->val && cur->val > q->val) {
**细心的同学会发现,在这里调用递归函数的地方,把递归函数的返回值left,直接return**。
-在[二叉树:公共祖先问题](https://mp.weixin.qq.com/s/n6Rk3nc_X3TSkhXHrVmBTQ)中,如果递归函数有返回值,如何区分要搜索一条边,还是搜索整个树。
+在[二叉树:公共祖先问题](https://programmercarl.com/0236.二叉树的最近公共祖先.html)中,如果递归函数有返回值,如何区分要搜索一条边,还是搜索整个树。
搜索一条边的写法:
@@ -192,7 +192,7 @@ public:
## 迭代法
-对于二叉搜索树的迭代法,大家应该在[二叉树:二叉搜索树登场!](https://mp.weixin.qq.com/s/vsKrWRlETxCVsiRr8v_hHg)就了解了。
+对于二叉搜索树的迭代法,大家应该在[二叉树:二叉搜索树登场!](https://programmercarl.com/0700.二叉搜索树中的搜索.html)就了解了。
利用其有序性,迭代的方式还是比较简单的,解题思路在递归中已经分析了。
@@ -218,7 +218,7 @@ public:
## 总结
-对于二叉搜索树的最近祖先问题,其实要比[普通二叉树公共祖先问题](https://mp.weixin.qq.com/s/n6Rk3nc_X3TSkhXHrVmBTQ)简单的多。
+对于二叉搜索树的最近祖先问题,其实要比[普通二叉树公共祖先问题](https://programmercarl.com/0236.二叉树的最近公共祖先.html)简单的多。
不用使用回溯,二叉搜索树自带方向性,可以方便的从上向下查找目标区间,遇到目标区间内的节点,直接返回。
diff --git "a/problems/0236.\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.md" "b/problems/0236.\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.md"
index 0885e20f07..16c235ee96 100644
--- "a/problems/0236.\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.md"
+++ "b/problems/0236.\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.md"
@@ -11,7 +11,7 @@
## 236. 二叉树的最近公共祖先
-题目链接:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/
+[力扣题目链接](https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/)
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
@@ -79,7 +79,7 @@ if (root == q || root == p || root == NULL) return root;
值得注意的是 本题函数有返回值,是因为回溯的过程需要递归函数的返回值做判断,但本题我们依然要遍历树的所有节点。
-我们在[二叉树:递归函数究竟什么时候需要返回值,什么时候不要返回值?](https://mp.weixin.qq.com/s/6TWAVjxQ34kVqROWgcRFOg)中说了 递归函数有返回值就是要遍历某一条边,但有返回值也要看如何处理返回值!
+我们在[二叉树:递归函数究竟什么时候需要返回值,什么时候不要返回值?](https://programmercarl.com/0112.路径总和.html)中说了 递归函数有返回值就是要遍历某一条边,但有返回值也要看如何处理返回值!
如果递归函数有返回值,如何区分要搜索一条边,还是搜索整个树呢?
diff --git "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md" "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md"
index 3c12a985b2..a61e4ca856 100644
--- "a/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md"
+++ "b/problems/0239.\346\273\221\345\212\250\347\252\227\345\217\243\346\234\200\345\244\247\345\200\274.md"
@@ -12,7 +12,7 @@
# 239. 滑动窗口最大值
-https://leetcode-cn.com/problems/sliding-window-maximum/
+[力扣题目链接](https://leetcode-cn.com/problems/sliding-window-maximum/)
给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
@@ -21,7 +21,7 @@ https://leetcode-cn.com/problems/sliding-window-maximum/
进阶:
你能在线性时间复杂度内解决此题吗?
-
+
提示:
@@ -104,7 +104,7 @@ public:
那么我们用什么数据结构来实现这个单调队列呢?
-使用deque最为合适,在文章[栈与队列:来看看栈和队列不为人知的一面](https://mp.weixin.qq.com/s/HCXfQ_Bhpi63YaX0ZRSnAQ)中,我们就提到了常用的queue在没有指定容器的情况下,deque就是默认底层容器。
+使用deque最为合适,在文章[栈与队列:来看看栈和队列不为人知的一面](https://programmercarl.com/栈与队列理论基础.html)中,我们就提到了常用的queue在没有指定容器的情况下,deque就是默认底层容器。
基于刚刚说过的单调队列pop和push的规则,代码不难实现,如下:
diff --git "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md"
index b215a88a38..15bf14cab6 100644
--- "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md"
+++ "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md"
@@ -11,7 +11,7 @@
## 242.有效的字母异位词
-https://leetcode-cn.com/problems/valid-anagram/
+[力扣题目链接](https://leetcode-cn.com/problems/valid-anagram/)
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
@@ -35,7 +35,7 @@ https://leetcode-cn.com/problems/valid-anagram/
**数组其实就是一个简单哈希表**,而且这道题目中字符串只有小写字符,那么就可以定义一个数组,来记录字符串s里字符出现的次数。
-如果对哈希表的理论基础关于数组,set,map不了解的话可以看这篇:[关于哈希表,你该了解这些!](https://mp.weixin.qq.com/s/g8N6WmoQmsCUw3_BaWxHZA)
+如果对哈希表的理论基础关于数组,set,map不了解的话可以看这篇:[关于哈希表,你该了解这些!](https://programmercarl.com/哈希表理论基础.html)
需要定义一个多大的数组呢,定一个数组叫做record,大小为26 就可以了,初始化为0,因为字符a到字符z的ASCII也是26个连续的数值。
diff --git "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md"
index 8431550779..2984427fec 100644
--- "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md"
+++ "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md"
@@ -11,7 +11,7 @@
# 257. 二叉树的所有路径
-题目地址:https://leetcode-cn.com/problems/binary-tree-paths/
+[力扣题目链接](https://leetcode-cn.com/problems/binary-tree-paths/)
给定一个二叉树,返回所有从根节点到叶子节点的路径。
@@ -270,7 +270,7 @@ if (cur->right) {
## 迭代法
-至于非递归的方式,我们可以依然可以使用前序遍历的迭代方式来模拟遍历路径的过程,对该迭代方式不了解的同学,可以看文章[二叉树:听说递归能做的,栈也能做!](https://mp.weixin.qq.com/s/OH7aCVJ5-Gi32PkNCoZk4A)和[二叉树:前中后序迭代方式统一写法](https://mp.weixin.qq.com/s/ATQMPCpBlaAgrqdLDMVPZA)。
+至于非递归的方式,我们可以依然可以使用前序遍历的迭代方式来模拟遍历路径的过程,对该迭代方式不了解的同学,可以看文章[二叉树:听说递归能做的,栈也能做!](https://programmercarl.com/二叉树的迭代遍历.html)和[二叉树:前中后序迭代方式统一写法](https://programmercarl.com/二叉树的统一迭代法.html)。
这里除了模拟递归需要一个栈,同时还需要一个栈来存放对应的遍历路径。
diff --git "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md"
index 3c0f0414e0..8a9c291ecb 100644
--- "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md"
+++ "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md"
@@ -9,7 +9,7 @@
## 279.完全平方数
-题目地址:https://leetcode-cn.com/problems/perfect-squares/
+[力扣题目链接](https://leetcode-cn.com/problems/perfect-squares/)
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
@@ -36,7 +36,7 @@
**我来把题目翻译一下:完全平方数就是物品(可以无限件使用),凑个正整数n就是背包,问凑满这个背包最少有多少物品?**
-感受出来了没,这么浓厚的完全背包氛围,而且和昨天的题目[动态规划:322. 零钱兑换](https://mp.weixin.qq.com/s/dyk-xNilHzNtVdPPLObSeQ)就是一样一样的!
+感受出来了没,这么浓厚的完全背包氛围,而且和昨天的题目[动态规划:322. 零钱兑换](https://programmercarl.com/0322.零钱兑换.html)就是一样一样的!
动规五部曲分析如下:
@@ -70,7 +70,7 @@ dp[0]表示 和为0的完全平方数的最小数量,那么dp[0]一定是0。
如果求排列数就是外层for遍历背包,内层for循环遍历物品。
-在[动态规划:322. 零钱兑换](https://mp.weixin.qq.com/s/dyk-xNilHzNtVdPPLObSeQ)中我们就深入探讨了这个问题,本题也是一样的,是求最小数!
+在[动态规划:322. 零钱兑换](https://programmercarl.com/0322.零钱兑换.html)中我们就深入探讨了这个问题,本题也是一样的,是求最小数!
**所以本题外层for遍历背包,里层for遍历物品,还是外层for遍历物品,内层for遍历背包,都是可以的!**
@@ -146,7 +146,7 @@ public:
## 总结
-如果大家认真做了昨天的题目[动态规划:322. 零钱兑换](https://mp.weixin.qq.com/s/dyk-xNilHzNtVdPPLObSeQ),今天这道就非常简单了,一样的套路一样的味道。
+如果大家认真做了昨天的题目[动态规划:322. 零钱兑换](https://programmercarl.com/0322.零钱兑换.html),今天这道就非常简单了,一样的套路一样的味道。
但如果没有按照「代码随想录」的题目顺序来做的话,做动态规划或者做背包问题,上来就做这道题,那还是挺难的!
@@ -161,7 +161,6 @@ public:
Java:
```Java
class Solution {
- // 版本一,先遍历物品, 再遍历背包
public int numSquares(int n) {
int max = Integer.MAX_VALUE;
int[] dp = new int[n + 1];
@@ -171,9 +170,7 @@ class Solution {
}
//当和为0时,组合的个数为0
dp[0] = 0;
- // 遍历物品
for (int i = 1; i * i <= n; i++) {
- // 遍历背包
for (int j = i * i; j <= n; j++) {
if (dp[j - i * i] != max) {
dp[j] = Math.min(dp[j], dp[j - i * i] + 1);
@@ -183,28 +180,6 @@ class Solution {
return dp[n];
}
}
-
-class Solution {
- // 版本二, 先遍历背包, 再遍历物品
- public int numSquares(int n) {
- int max = Integer.MAX_VALUE;
- int[] dp = new int[n + 1];
- // 初始化
- for (int j = 0; j <= n; j++) {
- dp[j] = max;
- }
- // 当和为0时,组合的个数为0
- dp[0] = 0;
- // 遍历背包
- for (int j = 1; j <= n; j++) {
- // 遍历物品
- for (int i = 1; i * i <= j; i++) {
- dp[j] = Math.min(dp[j], dp[j - i * i] + 1);
- }
- }
- return dp[n];
- }
-}
```
Python:
@@ -212,7 +187,7 @@ Python:
```python3
class Solution:
def numSquares(self, n: int) -> int:
- '''版本一,先遍历背包, 再遍历物品'''
+ '''版本一'''
# 初始化
nums = [i**2 for i in range(1, n + 1) if i**2 <= n]
dp = [10**4]*(n + 1)
@@ -226,7 +201,7 @@ class Solution:
return dp[n]
def numSquares1(self, n: int) -> int:
- '''版本二, 先遍历物品, 再遍历背包'''
+ '''版本二'''
# 初始化
nums = [i**2 for i in range(1, n + 1) if i**2 <= n]
dp = [10**4]*(n + 1)
@@ -242,22 +217,6 @@ class Solution:
Python3:
```python
class Solution:
- '''版本一,先遍历背包, 再遍历物品'''
- def numSquares(self, n: int) -> int:
- dp = [n] * (n + 1)
- dp[0] = 0
- # 遍历背包
- for j in range(1, n+1):
- for i in range(1, n):
- num = i ** 2
- if num > j: break
- # 遍历物品
- if j - num >= 0:
- dp[j] = min(dp[j], dp[j - num] + 1)
- return dp[n]
-
-class Solution:
- '''版本二, 先遍历物品, 再遍历背包'''
def numSquares(self, n: int) -> int:
# 初始化
# 组成和的完全平方数的最多个数,就是只用1构成
diff --git "a/problems/0283.\347\247\273\345\212\250\351\233\266.md" "b/problems/0283.\347\247\273\345\212\250\351\233\266.md"
index af7142faed..3909bcd5c0 100644
--- "a/problems/0283.\347\247\273\345\212\250\351\233\266.md"
+++ "b/problems/0283.\347\247\273\345\212\250\351\233\266.md"
@@ -10,7 +10,7 @@
# 283. 移动零
-题目链接:https://leetcode-cn.com/problems/move-zeroes/
+[力扣题目链接](https://leetcode-cn.com/problems/move-zeroes/)
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
@@ -26,13 +26,13 @@
# 思路
-做这道题目之前,大家可以做一做[27.移除元素](https://mp.weixin.qq.com/s/RMkulE4NIb6XsSX83ra-Ww)
+做这道题目之前,大家可以做一做[27.移除元素](https://programmercarl.com/0027.移除元素.html)
这道题目,使用暴力的解法,可以两层for循环,模拟数组删除元素(也就是向前覆盖)的过程。
-好了,我们说一说双指针法,大家如果对双指针还不熟悉,可以看我的这篇总结[双指针法:总结篇!](https://mp.weixin.qq.com/s/PLfYLuUIGDR6xVRQ_jTrmg)。
+好了,我们说一说双指针法,大家如果对双指针还不熟悉,可以看我的这篇总结[双指针法:总结篇!](https://programmercarl.com/双指针总结.html)。
-双指针法在数组移除元素中,可以达到O(n)的时间复杂度,在[27.移除元素](https://mp.weixin.qq.com/s/RMkulE4NIb6XsSX83ra-Ww)里已经详细讲解了,那么本题和移除元素其实是一个套路。
+双指针法在数组移除元素中,可以达到O(n)的时间复杂度,在[27.移除元素](https://programmercarl.com/0027.移除元素.html)里已经详细讲解了,那么本题和移除元素其实是一个套路。
**相当于对整个数组移除元素0,然后slowIndex之后都是移除元素0的冗余元素,把这些元素都赋值为0就可以了**。
diff --git "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md"
index 1161e15898..b2e942eda3 100644
--- "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md"
+++ "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md"
@@ -8,13 +8,13 @@
## 300.最长递增子序列
-题目链接:https://leetcode-cn.com/problems/longest-increasing-subsequence/
+[力扣题目链接](https://leetcode-cn.com/problems/longest-increasing-subsequence/)
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
-
+
示例 1:
输入:nums = [10,9,2,5,3,7,101,18]
输出:4
@@ -27,7 +27,7 @@
示例 3:
输入:nums = [7,7,7,7,7,7,7]
输出:1
-
+
提示:
* 1 <= nums.length <= 2500
@@ -215,9 +215,9 @@ const lengthOfLIS = (nums) => {
1. if(nums[i]>list[len-1],此时,list中子序列长度为1到len的对应的最右端最小值不变,并新增长度为len+1的子序列,最右端的最小值为nums[i],时间复杂度O(1);
2. if(nums[i]<=list[len-1]),此时,我们可以在0到len-1范围内找到k,list[k]为>=nums[i]的最小值,由于list单调递增,所以我们可以使用二分搜索在O(logn)的时间复杂度内找到k。
- 1. 对于0<=jnums[i];
+ 1. 对于0<=jnums[i];
3. 综上,算法时间复杂度为O(nlogn),空间复杂度为O(n),需要O(n)的空间保存list。
diff --git "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md"
index 3b1b65003c..a1e2c7619d 100644
--- "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md"
+++ "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md"
@@ -8,7 +8,7 @@
## 309.最佳买卖股票时机含冷冻期
-题目链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/
+[力扣题目链接](https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/)
给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。
@@ -25,12 +25,12 @@
## 思路
-> 之前我们在[动态规划:最佳买卖股票时机含冷冻期](https://mp.weixin.qq.com/s/IgC0iWWCDpYL9ZbTHGHgfw)讲过一次这道题目,讲解的过程感觉不是很严谨,和录友们也聊过这个问题,本着对大家负责的态度,有问题的地方我都会及时纠正,所以重新发文讲解一下。
+> 之前我们在[动态规划:最佳买卖股票时机含冷冻期](https://programmercarl.com/0309.最佳买卖股票时机含冷冻期.html)讲过一次这道题目,讲解的过程感觉不是很严谨,和录友们也聊过这个问题,本着对大家负责的态度,有问题的地方我都会及时纠正,所以重新发文讲解一下。
-相对于[动态规划:122.买卖股票的最佳时机II](https://mp.weixin.qq.com/s/d4TRWFuhaY83HPa6t5ZL-w),本题加上了一个冷冻期
+相对于[动态规划:122.买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II(动态规划).html),本题加上了一个冷冻期
-在[动态规划:122.买卖股票的最佳时机II](https://mp.weixin.qq.com/s/d4TRWFuhaY83HPa6t5ZL-w) 中有两个状态,持有股票后的最多现金,和不持有股票的最多现金。
+在[动态规划:122.买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II(动态规划).html) 中有两个状态,持有股票后的最多现金,和不持有股票的最多现金。
动规五部曲,分析如下:
diff --git "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md" "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md"
index 758bd5b8a8..cdc5027ce8 100644
--- "a/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md"
+++ "b/problems/0322.\351\233\266\351\222\261\345\205\221\346\215\242.md"
@@ -9,7 +9,7 @@
## 322. 零钱兑换
-题目链接:https://leetcode-cn.com/problems/coin-change/
+[力扣题目链接](https://leetcode-cn.com/problems/coin-change/)
给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。
@@ -44,7 +44,7 @@
## 思路
-在[动态规划:518.零钱兑换II](https://mp.weixin.qq.com/s/PlowDsI4WMBOzf3q80AksQ)中我们已经兑换一次零钱了,这次又要兑换,套路不一样!
+在[动态规划:518.零钱兑换II](https://programmercarl.com/0518.零钱兑换II.html)中我们已经兑换一次零钱了,这次又要兑换,套路不一样!
题目中说每种硬币的数量是无限的,可以看出是典型的完全背包问题。
@@ -91,7 +91,7 @@ dp[0] = 0;
**如果求排列数就是外层for遍历背包,内层for循环遍历物品**。
-在动态规划专题我们讲过了求组合数是[动态规划:518.零钱兑换II](https://mp.weixin.qq.com/s/PlowDsI4WMBOzf3q80AksQ),求排列数是[动态规划:377. 组合总和 Ⅳ](https://mp.weixin.qq.com/s/Iixw0nahJWQgbqVNk8k6gA)。
+在动态规划专题我们讲过了求组合数是[动态规划:518.零钱兑换II](https://programmercarl.com/0518.零钱兑换II.html),求排列数是[动态规划:377. 组合总和 Ⅳ](https://programmercarl.com/0377.组合总和Ⅳ.html)。
**所以本题的两个for循环的关系是:外层for循环遍历物品,内层for遍历背包或者外层for遍历背包,内层for循环遍历物品都是可以的!**
@@ -166,7 +166,7 @@ public:
那么这篇文章就把遍历顺序分析的清清楚楚。
-[动态规划:518.零钱兑换II](https://mp.weixin.qq.com/s/PlowDsI4WMBOzf3q80AksQ)中求的是组合数,[动态规划:377. 组合总和 Ⅳ](https://mp.weixin.qq.com/s/Iixw0nahJWQgbqVNk8k6gA)中求的是排列数。
+[动态规划:518.零钱兑换II](https://programmercarl.com/0518.零钱兑换II.html)中求的是组合数,[动态规划:377. 组合总和 Ⅳ](https://programmercarl.com/0377.组合总和Ⅳ.html)中求的是排列数。
**而本题是要求最少硬币数量,硬币是组合数还是排列数都无所谓!所以两个for循环先后顺序怎样都可以!**
diff --git "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md" "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md"
index 8a28899be6..13ad9e3568 100644
--- "a/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md"
+++ "b/problems/0332.\351\207\215\346\226\260\345\256\211\346\216\222\350\241\214\347\250\213.md"
@@ -11,7 +11,7 @@
## 332.重新安排行程
-题目地址:https://leetcode-cn.com/problems/reconstruct-itinerary/
+[力扣题目链接](https://leetcode-cn.com/problems/reconstruct-itinerary/)
给定一个机票的字符串二维数组 [from, to],子数组中的两个成员分别表示飞机出发和降落的机场地点,对该行程进行重新规划排序。所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK 开始。
@@ -20,7 +20,7 @@
* 所有的机场都用三个大写字母表示(机场代码)。
* 假定所有机票至少存在一种合理的行程。
* 所有的机票必须都用一次 且 只能用一次。
-
+
示例 1:
输入:[["MUC", "LHR"], ["JFK", "MUC"], ["SFO", "SJC"], ["LHR", "SFO"]]
@@ -36,7 +36,7 @@
**如果对回溯算法基础还不了解的话,我还特意录制了一期视频:[带你学透回溯算法(理论篇)](https://www.bilibili.com/video/BV1cy4y167mM/)** 可以结合题解和视频一起看,希望对大家理解回溯算法有所帮助。
-这道题目还是很难的,之前我们用回溯法解决了如下问题:[组合问题](https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ),[分割问题](https://mp.weixin.qq.com/s/v--VmA8tp9vs4bXCqHhBuA),[子集问题](https://mp.weixin.qq.com/s/NNRzX-vJ_pjK4qxohd_LtA),[排列问题](https://mp.weixin.qq.com/s/SCOjeMX1t41wcvJq49GhMw)。
+这道题目还是很难的,之前我们用回溯法解决了如下问题:[组合问题](https://programmercarl.com/0077.组合.html),[分割问题](https://programmercarl.com/0093.复原IP地址.html),[子集问题](https://programmercarl.com/0078.子集.html),[排列问题](https://programmercarl.com/0046.全排列.html)。
直觉上来看 这道题和回溯法没有什么关系,更像是图论中的深度优先搜索。
@@ -69,7 +69,7 @@
一个机场映射多个机场,机场之间要靠字母序排列,一个机场映射多个机场,可以使用std::unordered_map,如果让多个机场之间再有顺序的话,就是用std::map 或者std::multimap 或者 std::multiset。
-如果对map 和 set 的实现机制不太了解,也不清楚为什么 map、multimap就是有序的同学,可以看这篇文章[关于哈希表,你该了解这些!](https://mp.weixin.qq.com/s/g8N6WmoQmsCUw3_BaWxHZA)。
+如果对map 和 set 的实现机制不太了解,也不清楚为什么 map、multimap就是有序的同学,可以看这篇文章[关于哈希表,你该了解这些!](https://programmercarl.com/哈希表理论基础.html)。
这样存放映射关系可以定义为 `unordered_map> targets` 或者 `unordered_map> targets`。
@@ -140,7 +140,7 @@ bool backtracking(int ticketNum, vector& result) {

-所以找到了这个叶子节点了直接返回,这个递归函数的返回值问题我们在讲解二叉树的系列的时候,在这篇[二叉树:递归函数究竟什么时候需要返回值,什么时候不要返回值?](https://mp.weixin.qq.com/s/6TWAVjxQ34kVqROWgcRFOg)详细介绍过。
+所以找到了这个叶子节点了直接返回,这个递归函数的返回值问题我们在讲解二叉树的系列的时候,在这篇[二叉树:递归函数究竟什么时候需要返回值,什么时候不要返回值?](https://programmercarl.com/0112.路径总和.html)详细介绍过。
当然本题的targets和result都需要初始化,代码如下:
```
@@ -164,7 +164,7 @@ if (result.size() == ticketNum + 1) {
}
```
-已经看习惯回溯法代码的同学,到叶子节点了习惯性的想要收集结果,但发现并不需要,本题的result相当于 [回溯算法:求组合总和!](https://mp.weixin.qq.com/s/HX7WW6ixbFZJASkRnCTC3w)中的path,也就是本题的result就是记录路径的(就一条),在如下单层搜索的逻辑中result就添加元素了。
+已经看习惯回溯法代码的同学,到叶子节点了习惯性的想要收集结果,但发现并不需要,本题的result相当于 [回溯算法:求组合总和!](https://programmercarl.com/0216.组合总和III.html)中的path,也就是本题的result就是记录路径的(就一条),在如下单层搜索的逻辑中result就添加元素了。
* 单层搜索的逻辑
diff --git "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md"
index 44e60fb3d3..2a69ac5682 100644
--- "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md"
+++ "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md"
@@ -9,7 +9,7 @@
## 337.打家劫舍 III
-题目链接:https://leetcode-cn.com/problems/house-robber-iii/
+[力扣题目链接](https://leetcode-cn.com/problems/house-robber-iii/)
在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。
@@ -19,7 +19,7 @@
## 思路
-这道题目和 [198.打家劫舍](https://mp.weixin.qq.com/s/UZ31WdLEEFmBegdgLkJ8Dw),[213.打家劫舍II](https://mp.weixin.qq.com/s/kKPx4HpH3RArbRcxAVHbeQ)也是如出一辙,只不过这个换成了树。
+这道题目和 [198.打家劫舍](https://programmercarl.com/0198.打家劫舍.html),[213.打家劫舍II](https://programmercarl.com/0213.打家劫舍II.html)也是如出一辙,只不过这个换成了树。
如果对树的遍历不够熟悉的话,那本题就有难度了。
@@ -210,7 +210,7 @@ public:
只不过平时我们习惯了在一维数组或者二维数组上推导公式,一下子换成了树,就需要对树的遍历方式足够了解!
-大家还记不记得我在讲解贪心专题的时候,讲到这道题目:[贪心算法:我要监控二叉树!](https://mp.weixin.qq.com/s/kCxlLLjWKaE6nifHC3UL2Q),这也是贪心算法在树上的应用。**那我也可以把这个算法起一个名字,叫做树形贪心**,哈哈哈
+大家还记不记得我在讲解贪心专题的时候,讲到这道题目:[贪心算法:我要监控二叉树!](https://programmercarl.com/0968.监控二叉树.html),这也是贪心算法在树上的应用。**那我也可以把这个算法起一个名字,叫做树形贪心**,哈哈哈
“树形贪心”词汇从此诞生,来自「代码随想录」
diff --git "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md" "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md"
index 03b6f0fc46..c11210fc59 100644
--- "a/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md"
+++ "b/problems/0343.\346\225\264\346\225\260\346\213\206\345\210\206.md"
@@ -8,14 +8,15 @@
## 343. 整数拆分
-题目链接:https://leetcode-cn.com/problems/integer-break/
+[力扣题目链接](https://leetcode-cn.com/problems/integer-break/)
给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。
示例 1:
输入: 2
输出: 1
-解释: 2 = 1 + 1, 1 × 1 = 1。
+
+\解释: 2 = 1 + 1, 1 × 1 = 1。
示例 2:
输入: 10
diff --git "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md"
index 763097bee8..6bb5f87af2 100644
--- "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md"
+++ "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md"
@@ -12,7 +12,7 @@
# 344.反转字符串
-https://leetcode-cn.com/problems/reverse-string/
+[力扣题目链接](https://leetcode-cn.com/problems/reverse-string/)
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
@@ -55,7 +55,7 @@ https://leetcode-cn.com/problems/reverse-string/
接下来再来讲一下如何解决反转字符串的问题。
-大家应该还记得,我们已经讲过了[206.反转链表](https://mp.weixin.qq.com/s/ckEvIVGcNLfrz6OLOMoT0A)。
+大家应该还记得,我们已经讲过了[206.反转链表](https://programmercarl.com/0206.翻转链表.html)。
在反转链表中,使用了双指针的方法。
@@ -63,7 +63,7 @@ https://leetcode-cn.com/problems/reverse-string/
因为字符串也是一种数组,所以元素在内存中是连续分布,这就决定了反转链表和反转字符串方式上还是有所差异的。
-如果对数组和链表原理不清楚的同学,可以看这两篇,[关于链表,你该了解这些!](https://mp.weixin.qq.com/s/fDGMmLrW7ZHlzkzlf_dZkw),[必须掌握的数组理论知识](https://mp.weixin.qq.com/s/c2KABb-Qgg66HrGf8z-8Og)。
+如果对数组和链表原理不清楚的同学,可以看这两篇,[关于链表,你该了解这些!](https://programmercarl.com/链表理论基础.html),[必须掌握的数组理论知识](https://programmercarl.com/数组理论基础.html)。
对于字符串,我们定义两个指针(也可以说是索引下表),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。
@@ -162,14 +162,21 @@ class Solution:
Do not return anything, modify s in-place instead.
"""
left, right = 0, len(s) - 1
-
- # 该方法已经不需要判断奇偶数,经测试后时间空间复杂度比用 for i in range(right//2)更低
- # 推荐该写法,更加通俗易懂
- while left < right:
+ while(left < right):
s[left], s[right] = s[right], s[left]
left += 1
right -= 1
-
+
+# 下面的写法更加简洁,但是都是同样的算法
+# class Solution:
+# def reverseString(self, s: List[str]) -> None:
+# """
+# Do not return anything, modify s in-place instead.
+# """
+ # 不需要判别是偶数个还是奇数个序列,因为奇数个的时候,中间那个不需要交换就可
+# for i in range(len(s)//2):
+# s[i], s[len(s)-1-i] = s[len(s)-1-i], s[i]
+# return s
```
Go:
diff --git "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md"
index 680de3bde3..54be5cc4ee 100644
--- "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md"
+++ "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md"
@@ -13,7 +13,7 @@
# 347.前 K 个高频元素
-https://leetcode-cn.com/problems/top-k-frequent-elements/
+[力扣题目链接](https://leetcode-cn.com/problems/top-k-frequent-elements/)
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md"
index 62abf6399f..49fe926b2a 100644
--- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md"
+++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md"
@@ -14,7 +14,7 @@
## 349. 两个数组的交集
-https://leetcode-cn.com/problems/intersection-of-two-arrays/
+[力扣题目链接](https://leetcode-cn.com/problems/intersection-of-two-arrays/)
题意:给定两个数组,编写一个函数来计算它们的交集。
@@ -32,7 +32,7 @@ https://leetcode-cn.com/problems/intersection-of-two-arrays/
这道题用暴力的解法时间复杂度是O(n^2),那来看看使用哈希法进一步优化。
-那么用数组来做哈希表也是不错的选择,例如[242. 有效的字母异位词](https://mp.weixin.qq.com/s/ffS8jaVFNUWyfn_8T31IdA)
+那么用数组来做哈希表也是不错的选择,例如[242. 有效的字母异位词](https://programmercarl.com/0242.有效的字母异位词.html)
但是要注意,**使用数组来做哈希的题目,是因为题目都限制了数值的大小。**
@@ -143,26 +143,6 @@ func intersection(nums1 []int, nums2 []int) []int {
return res
}
```
-```golang
-//优化版,利用set,减少count统计
-func intersection(nums1 []int, nums2 []int) []int {
- set:=make(map[int]struct{},0)
- res:=make([]int,0)
- for _,v:=range nums1{
- if _,ok:=set[v];!ok{
- set[v]=struct{}{}
- }
- }
- for _,v:=range nums2{
- //如果存在于上一个数组中,则加入结果集,并清空该set值
- if _,ok:=set[v];ok{
- res=append(res,v)
- delete(set, v)
- }
- }
- return res
-}
-```
javaScript:
diff --git "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md" "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md"
index 0ccc405afa..75965c3711 100644
--- "a/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md"
+++ "b/problems/0376.\346\221\206\345\212\250\345\272\217\345\210\227.md"
@@ -7,11 +7,11 @@
欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!
-> 本周讲解了[贪心理论基础](https://mp.weixin.qq.com/s/O935TaoHE9Eexwe_vSbRAg),以及第一道贪心的题目:[贪心算法:分发饼干](https://mp.weixin.qq.com/s/YSuLIAYyRGlyxbp9BNC1uw),可能会给大家一种贪心算法比较简单的错觉,好了,接下来几天的题目难度要上来了,哈哈。
+> 本周讲解了[贪心理论基础](https://programmercarl.com/贪心算法理论基础.html),以及第一道贪心的题目:[贪心算法:分发饼干](https://programmercarl.com/0455.分发饼干.html),可能会给大家一种贪心算法比较简单的错觉,好了,接下来几天的题目难度要上来了,哈哈。
## 376. 摆动序列
-题目链接:https://leetcode-cn.com/problems/wiggle-subsequence/
+[力扣题目链接](https://leetcode-cn.com/problems/wiggle-subsequence/)
如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。
diff --git "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md" "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md"
index 3f735727f5..f062a897da 100644
--- "a/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md"
+++ "b/problems/0377.\347\273\204\345\220\210\346\200\273\345\222\214\342\205\243.md"
@@ -9,7 +9,7 @@
## 377. 组合总和 Ⅳ
-题目链接:https://leetcode-cn.com/problems/combination-sum-iv/
+[力扣题目链接](https://leetcode-cn.com/problems/combination-sum-iv/)
难度:中等
@@ -43,7 +43,7 @@ target = 4
排列强调顺序,(1,5)和(5,1)是两个不同的排列。
-大家在公众号里学习回溯算法专题的时候,一定做过这两道题目[回溯算法:39.组合总和](https://mp.weixin.qq.com/s/FLg8G6EjVcxBjwCbzpACPw)和[回溯算法:40.组合总和II](https://mp.weixin.qq.com/s/_1zPYk70NvHsdY8UWVGXmQ)会感觉这两题和本题很像!
+大家在公众号里学习回溯算法专题的时候,一定做过这两道题目[回溯算法:39.组合总和](https://programmercarl.com/0039.组合总和.html)和[回溯算法:40.组合总和II](https://programmercarl.com/0040.组合总和II.html)会感觉这两题和本题很像!
但其本质是本题求的是排列总和,而且仅仅是求排列总和的个数,并不是把所有的排列都列出来。
@@ -61,7 +61,7 @@ dp[i](考虑nums[j])可以由 dp[i - nums[j]](不考虑nums[j]) 推导
因为只要得到nums[j],排列个数dp[i - nums[j]],就是dp[i]的一部分。
-在[动态规划:494.目标和](https://mp.weixin.qq.com/s/2pWmaohX75gwxvBENS-NCw) 和 [动态规划:518.零钱兑换II](https://mp.weixin.qq.com/s/PlowDsI4WMBOzf3q80AksQ)中我们已经讲过了,求装满背包有几种方法,递推公式一般都是dp[i] += dp[i - nums[j]];
+在[动态规划:494.目标和](https://programmercarl.com/0494.目标和.html) 和 [动态规划:518.零钱兑换II](https://programmercarl.com/0518.零钱兑换II.html)中我们已经讲过了,求装满背包有几种方法,递推公式一般都是dp[i] += dp[i - nums[j]];
本题也一样。
@@ -87,7 +87,7 @@ dp[i](考虑nums[j])可以由 dp[i - nums[j]](不考虑nums[j]) 推导
本题要求的是排列,那么这个for循环嵌套的顺序可以有说法了。
-在[动态规划:518.零钱兑换II](https://mp.weixin.qq.com/s/PlowDsI4WMBOzf3q80AksQ) 中就已经讲过了。
+在[动态规划:518.零钱兑换II](https://programmercarl.com/0518.零钱兑换II.html) 中就已经讲过了。
**如果求组合数就是外层for循环遍历物品,内层for遍历背包**。
@@ -134,7 +134,7 @@ C++测试用例有超过两个树相加超过int的数据,所以需要在if里
**求装满背包有几种方法,递归公式都是一样的,没有什么差别,但关键在于遍历顺序!**
-本题与[动态规划:518.零钱兑换II](https://mp.weixin.qq.com/s/PlowDsI4WMBOzf3q80AksQ)就是一个鲜明的对比,一个是求排列,一个是求组合,遍历顺序完全不同。
+本题与[动态规划:518.零钱兑换II](https://programmercarl.com/0518.零钱兑换II.html)就是一个鲜明的对比,一个是求排列,一个是求组合,遍历顺序完全不同。
如果对遍历顺序没有深度理解的话,做这种完全背包的题目会很懵逼,即使题目刷过了可能也不太清楚具体是怎么过的。
diff --git "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" "b/problems/0383.\350\265\216\351\207\221\344\277\241.md"
index d4b7384876..64503cef7b 100644
--- "a/problems/0383.\350\265\216\351\207\221\344\277\241.md"
+++ "b/problems/0383.\350\265\216\351\207\221\344\277\241.md"
@@ -12,7 +12,7 @@
# 383. 赎金信
-https://leetcode-cn.com/problems/ransom-note/
+[力扣题目链接](https://leetcode-cn.com/problems/ransom-note/)
给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构成。如果可以构成,返回 true ;否则返回 false。
@@ -28,7 +28,7 @@ canConstruct("aa", "aab") -> true
## 思路
-这道题目和[242.有效的字母异位词](https://mp.weixin.qq.com/s/ffS8jaVFNUWyfn_8T31IdA)很像,[242.有效的字母异位词](https://mp.weixin.qq.com/s/ffS8jaVFNUWyfn_8T31IdA)相当于求 字符串a 和 字符串b 是否可以相互组成 ,而这道题目是求 字符串a能否组成字符串b,而不用管字符串b 能不能组成字符串a。
+这道题目和[242.有效的字母异位词](https://programmercarl.com/0242.有效的字母异位词.html)很像,[242.有效的字母异位词](https://programmercarl.com/0242.有效的字母异位词.html)相当于求 字符串a 和 字符串b 是否可以相互组成 ,而这道题目是求 字符串a能否组成字符串b,而不用管字符串b 能不能组成字符串a。
本题判断第一个字符串ransom能不能由第二个字符串magazines里面的字符构成,但是这里需要注意两点。
diff --git "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md"
index bcf3462b6e..54c16489cf 100644
--- "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md"
+++ "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md"
@@ -9,7 +9,7 @@
## 392.判断子序列
-题目链接:https://leetcode-cn.com/problems/is-subsequence/
+[力扣题目链接](https://leetcode-cn.com/problems/is-subsequence/)
给定字符串 s 和 t ,判断 s 是否为 t 的子序列。
diff --git "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md"
index 84ec2310b8..2b627b6c12 100644
--- "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md"
+++ "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md"
@@ -9,7 +9,7 @@
# 404.左叶子之和
-题目地址:https://leetcode-cn.com/problems/sum-of-left-leaves/
+[力扣题目链接](https://leetcode-cn.com/problems/sum-of-left-leaves/)
计算给定二叉树的所有左叶子之和。
@@ -119,7 +119,7 @@ public:
## 迭代法
-本题迭代法使用前中后序都是可以的,只要把左叶子节点统计出来,就可以了,那么参考文章 [二叉树:听说递归能做的,栈也能做!](https://mp.weixin.qq.com/s/OH7aCVJ5-Gi32PkNCoZk4A)和[二叉树:迭代法统一写法](https://mp.weixin.qq.com/s/ATQMPCpBlaAgrqdLDMVPZA)中的写法,可以写出一个前序遍历的迭代法。
+本题迭代法使用前中后序都是可以的,只要把左叶子节点统计出来,就可以了,那么参考文章 [二叉树:听说递归能做的,栈也能做!](https://programmercarl.com/二叉树的迭代遍历.html)和[二叉树:迭代法统一写法](https://programmercarl.com/二叉树的统一迭代法.html)中的写法,可以写出一个前序遍历的迭代法。
判断条件都是一样的,代码如下:
@@ -326,7 +326,7 @@ var sumOfLeftLeaves = function(root) {
}
return nodesSum(root);
};
-```
+```
**迭代法**
```javascript
diff --git "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md" "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md"
index e9b9a7386c..6d8f703b2e 100644
--- "a/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md"
+++ "b/problems/0406.\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.md"
@@ -9,7 +9,7 @@
## 406.根据身高重建队列
-题目链接:https://leetcode-cn.com/problems/queue-reconstruction-by-height/
+[力扣题目链接](https://leetcode-cn.com/problems/queue-reconstruction-by-height/)
假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。
@@ -43,9 +43,9 @@
本题有两个维度,h和k,看到这种题目一定要想如何确定一个维度,然后在按照另一个维度重新排列。
-其实如果大家认真做了[135. 分发糖果](https://mp.weixin.qq.com/s/8MwlgFfvaNYmjGwjuMlETQ),就会发现和此题有点点的像。
+其实如果大家认真做了[135. 分发糖果](https://programmercarl.com/0135.分发糖果.html),就会发现和此题有点点的像。
-在[135. 分发糖果](https://mp.weixin.qq.com/s/8MwlgFfvaNYmjGwjuMlETQ)我就强调过一次,遇到两个维度权衡的时候,一定要先确定一个维度,再确定另一个维度。
+在[135. 分发糖果](https://programmercarl.com/0135.分发糖果.html)我就强调过一次,遇到两个维度权衡的时候,一定要先确定一个维度,再确定另一个维度。
**如果两个维度一起考虑一定会顾此失彼**。
@@ -76,11 +76,11 @@
一些同学可能也会疑惑,你怎么知道局部最优就可以推出全局最优呢? 有数学证明么?
-在贪心系列开篇词[关于贪心算法,你该了解这些!](https://mp.weixin.qq.com/s/O935TaoHE9Eexwe_vSbRAg)中,我已经讲过了这个问题了。
+在贪心系列开篇词[关于贪心算法,你该了解这些!](https://programmercarl.com/贪心算法理论基础.html)中,我已经讲过了这个问题了。
刷题或者面试的时候,手动模拟一下感觉可以局部最优推出整体最优,而且想不到反例,那么就试一试贪心,至于严格的数学证明,就不在讨论范围内了。
-如果没有读过[关于贪心算法,你该了解这些!](https://mp.weixin.qq.com/s/O935TaoHE9Eexwe_vSbRAg)的同学建议读一下,相信对贪心就有初步的了解了。
+如果没有读过[关于贪心算法,你该了解这些!](https://programmercarl.com/贪心算法理论基础.html)的同学建议读一下,相信对贪心就有初步的了解了。
回归本题,整个插入过程如下:
@@ -157,15 +157,15 @@ public:
大家可以把两个版本的代码提交一下试试,就可以发现其差别了!
-关于本题使用数组还是使用链表的性能差异,我在[贪心算法:根据身高重建队列(续集)](https://mp.weixin.qq.com/s/K-pRN0lzR-iZhoi-1FgbSQ)中详细讲解了一波
+关于本题使用数组还是使用链表的性能差异,我在[贪心算法:根据身高重建队列(续集)](https://programmercarl.com/根据身高重建队列(vector原理讲解).html)中详细讲解了一波
## 总结
-关于出现两个维度一起考虑的情况,我们已经做过两道题目了,另一道就是[135. 分发糖果](https://mp.weixin.qq.com/s/8MwlgFfvaNYmjGwjuMlETQ)。
+关于出现两个维度一起考虑的情况,我们已经做过两道题目了,另一道就是[135. 分发糖果](https://programmercarl.com/0135.分发糖果.html)。
**其技巧都是确定一边然后贪心另一边,两边一起考虑,就会顾此失彼**。
-这道题目可以说比[135. 分发糖果](https://mp.weixin.qq.com/s/8MwlgFfvaNYmjGwjuMlETQ)难不少,其贪心的策略也是比较巧妙。
+这道题目可以说比[135. 分发糖果](https://programmercarl.com/0135.分发糖果.html)难不少,其贪心的策略也是比较巧妙。
最后我给出了两个版本的代码,可以明显看是使用C++中的list(底层链表实现)比vector(数组)效率高得多。
diff --git "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md" "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md"
index 0f1f094aef..c8a5beea84 100644
--- "a/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md"
+++ "b/problems/0416.\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.md"
@@ -8,7 +8,7 @@
## 416. 分割等和子集
-题目链接:https://leetcode-cn.com/problems/partition-equal-subset-sum/
+[力扣题目链接](https://leetcode-cn.com/problems/partition-equal-subset-sum/)
题目难易:中等
@@ -22,7 +22,7 @@
输入: [1, 5, 11, 5]
输出: true
解释: 数组可以分割成 [1, 5, 5] 和 [11].
-
+
示例 2:
输入: [1, 2, 3, 5]
输出: false
@@ -47,8 +47,8 @@
如果对01背包不够了解,建议仔细看完如下两篇:
-* [动态规划:关于01背包问题,你该了解这些!](https://mp.weixin.qq.com/s/FwIiPPmR18_AJO5eiidT6w)
-* [动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://mp.weixin.qq.com/s/M4uHxNVKRKm5HPjkNZBnFA)
+* [动态规划:关于01背包问题,你该了解这些!](https://programmercarl.com/背包理论基础01背包-1.html)
+* [动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html)
## 01背包问题
@@ -114,7 +114,7 @@ vector dp(10001, 0);
4. 确定遍历顺序
-在[动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://mp.weixin.qq.com/s/M4uHxNVKRKm5HPjkNZBnFA)中就已经说明:如果使用一维dp数组,物品遍历的for循环放在外层,遍历背包的for循环放在内层,且内层for循环倒叙遍历!
+在[动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html)中就已经说明:如果使用一维dp数组,物品遍历的for循环放在外层,遍历背包的for循环放在内层,且内层for循环倒叙遍历!
代码如下:
diff --git "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md" "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md"
index 70d0ff3adc..a92aae7e44 100644
--- "a/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md"
+++ "b/problems/0435.\346\227\240\351\207\215\345\217\240\345\214\272\351\227\264.md"
@@ -9,7 +9,7 @@
## 435. 无重叠区间
-题目链接:https://leetcode-cn.com/problems/non-overlapping-intervals/
+[力扣题目链接](https://leetcode-cn.com/problems/non-overlapping-intervals/)
给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。
@@ -122,9 +122,9 @@ public:
## 补充
-本题其实和[452.用最少数量的箭引爆气球](https://mp.weixin.qq.com/s/HxVAJ6INMfNKiGwI88-RFw)非常像,弓箭的数量就相当于是非交叉区间的数量,只要把弓箭那道题目代码里射爆气球的判断条件加个等号(认为[0,1][1,2]不是相邻区间),然后用总区间数减去弓箭数量 就是要移除的区间数量了。
+本题其实和[452.用最少数量的箭引爆气球](https://programmercarl.com/0452.用最少数量的箭引爆气球.html)非常像,弓箭的数量就相当于是非交叉区间的数量,只要把弓箭那道题目代码里射爆气球的判断条件加个等号(认为[0,1][1,2]不是相邻区间),然后用总区间数减去弓箭数量 就是要移除的区间数量了。
-把[452.用最少数量的箭引爆气球](https://mp.weixin.qq.com/s/HxVAJ6INMfNKiGwI88-RFw)代码稍做修改,就可以AC本题。
+把[452.用最少数量的箭引爆气球](https://programmercarl.com/0452.用最少数量的箭引爆气球.html)代码稍做修改,就可以AC本题。
```CPP
class Solution {
diff --git "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md" "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md"
index 96c4946860..0c8ea9ffff 100644
--- "a/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md"
+++ "b/problems/0450.\345\210\240\351\231\244\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\350\212\202\347\202\271.md"
@@ -11,7 +11,7 @@
## 450.删除二叉搜索树中的节点
-题目链接: https://leetcode-cn.com/problems/delete-node-in-a-bst/
+[力扣题目链接]( https://leetcode-cn.com/problems/delete-node-in-a-bst/)
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
@@ -35,7 +35,7 @@
* 确定递归函数参数以及返回值
-说道递归函数的返回值,在[二叉树:搜索树中的插入操作](https://mp.weixin.qq.com/s/lwKkLQcfbCNX2W-5SOeZEA)中通过递归返回值来加入新节点, 这里也可以通过递归返回值删除节点。
+说道递归函数的返回值,在[二叉树:搜索树中的插入操作](https://programmercarl.com/0701.二叉搜索树中的插入操作.html)中通过递归返回值来加入新节点, 这里也可以通过递归返回值删除节点。
代码如下:
diff --git "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md"
index 589105b260..7b8130f027 100644
--- "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md"
+++ "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md"
@@ -9,7 +9,7 @@
## 452. 用最少数量的箭引爆气球
-题目链接:https://leetcode-cn.com/problems/minimum-number-of-arrows-to-burst-balloons/
+[力扣题目链接](https://leetcode-cn.com/problems/minimum-number-of-arrows-to-burst-balloons/)
在二维空间中有许多球形的气球。对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标。由于它是水平的,所以纵坐标并不重要,因此只要知道开始和结束的横坐标就足够了。开始坐标总是小于结束坐标。
diff --git "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md"
index eafee43e86..7bb24e59b2 100644
--- "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md"
+++ "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md"
@@ -11,8 +11,7 @@
# 第454题.四数相加II
-
-https://leetcode-cn.com/problems/4sum-ii/
+[力扣题目链接](https://leetcode-cn.com/problems/4sum-ii/)
给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。
@@ -35,9 +34,9 @@ D = [ 0, 2]
# 思路
-本题咋眼一看好像和[0015.三数之和](https://mp.weixin.qq.com/s/r5cgZFu0tv4grBAexdcd8A),[0018.四数之和](https://mp.weixin.qq.com/s/nQrcco8AZJV1pAOVjeIU_g)差不多,其实差很多。
+本题咋眼一看好像和[0015.三数之和](https://programmercarl.com/0015.三数之和.html),[0018.四数之和](https://programmercarl.com/0018.四数之和.html)差不多,其实差很多。
-**本题是使用哈希法的经典题目,而[0015.三数之和](https://mp.weixin.qq.com/s/r5cgZFu0tv4grBAexdcd8A),[0018.四数之和](https://mp.weixin.qq.com/s/nQrcco8AZJV1pAOVjeIU_g)并不合适使用哈希法**,因为三数之和和四数之和这两道题目使用哈希法在不超时的情况下做到对结果去重是很困难的,很有多细节需要处理。
+**本题是使用哈希法的经典题目,而[0015.三数之和](https://programmercarl.com/0015.三数之和.html),[0018.四数之和](https://programmercarl.com/0018.四数之和.html)并不合适使用哈希法**,因为三数之和和四数之和这两道题目使用哈希法在不超时的情况下做到对结果去重是很困难的,很有多细节需要处理。
**而这道题目是四个独立的数组,只要找到A[i] + B[j] + C[k] + D[l] = 0就可以,不用考虑有重复的四个元素相加等于0的情况,所以相对于题目18. 四数之和,题目15.三数之和,还是简单了不少!**
diff --git "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md"
index 1926894237..b6fa4a98c8 100644
--- "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md"
+++ "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md"
@@ -9,7 +9,7 @@
## 455.分发饼干
-题目链接:https://leetcode-cn.com/problems/assign-cookies/
+[力扣题目链接](https://leetcode-cn.com/problems/assign-cookies/)
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。
@@ -165,7 +165,7 @@ func findContentChildren(g []int, s []int) int {
Javascript:
-```Javascript
+```Javascript
var findContentChildren = function(g, s) {
g = g.sort((a, b) => a - b)
diff --git "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md"
index 3b73594244..7d8a728647 100644
--- "a/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md"
+++ "b/problems/0459.\351\207\215\345\244\215\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md"
@@ -13,7 +13,7 @@
# 459.重复的子字符串
-https://leetcode-cn.com/problems/repeated-substring-pattern/
+[力扣题目链接](https://leetcode-cn.com/problems/repeated-substring-pattern/)
给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。
@@ -41,11 +41,11 @@ https://leetcode-cn.com/problems/repeated-substring-pattern/
* [帮你把KMP算法学个通透!(求next数组代码篇)](https://www.bilibili.com/video/BV1M5411j7Xx)
-我们在[字符串:KMP算法精讲](https://mp.weixin.qq.com/s/MoRBHbS4hQXn7LcPdmHmIg)里提到了,在一个串中查找是否出现过另一个串,这是KMP的看家本领。
+我们在[字符串:KMP算法精讲](https://programmercarl.com/0028.实现strStr.html)里提到了,在一个串中查找是否出现过另一个串,这是KMP的看家本领。
那么寻找重复子串怎么也涉及到KMP算法了呢?
-这里就要说一说next数组了,next 数组记录的就是最长相同前后缀( [字符串:KMP算法精讲](https://mp.weixin.qq.com/s/MoRBHbS4hQXn7LcPdmHmIg) 这里介绍了什么是前缀,什么是后缀,什么又是最长相同前后缀), 如果 next[len - 1] != -1,则说明字符串有最长相同的前后缀(就是字符串里的前缀子串和后缀子串相同的最长长度)。
+这里就要说一说next数组了,next 数组记录的就是最长相同前后缀( [字符串:KMP算法精讲](https://programmercarl.com/0028.实现strStr.html) 这里介绍了什么是前缀,什么是后缀,什么又是最长相同前后缀), 如果 next[len - 1] != -1,则说明字符串有最长相同的前后缀(就是字符串里的前缀子串和后缀子串相同的最长长度)。
最长相等前后缀的长度为:next[len - 1] + 1。
@@ -137,11 +137,11 @@ public:
# 拓展
-在[字符串:KMP算法精讲](https://mp.weixin.qq.com/s/MoRBHbS4hQXn7LcPdmHmIg)中讲解KMP算法的基础理论,给出next数组究竟是如何来了,前缀表又是怎么回事,为什么要选择前缀表。
+在[字符串:KMP算法精讲](https://programmercarl.com/0028.实现strStr.html)中讲解KMP算法的基础理论,给出next数组究竟是如何来了,前缀表又是怎么回事,为什么要选择前缀表。
讲解一道KMP的经典题目,力扣:28. 实现 strStr(),判断文本串里是否出现过模式串,这里涉及到构造next数组的代码实现,以及使用next数组完成模式串与文本串的匹配过程。
-后来很多同学反馈说:搞不懂前后缀,什么又是最长相同前后缀(最长公共前后缀我认为这个用词不准确),以及为什么前缀表要统一减一(右移)呢,不减一行不行?针对这些问题,我在[字符串:KMP算法精讲](https://mp.weixin.qq.com/s/MoRBHbS4hQXn7LcPdmHmIg)给出了详细的讲解。
+后来很多同学反馈说:搞不懂前后缀,什么又是最长相同前后缀(最长公共前后缀我认为这个用词不准确),以及为什么前缀表要统一减一(右移)呢,不减一行不行?针对这些问题,我在[字符串:KMP算法精讲](https://programmercarl.com/0028.实现strStr.html)给出了详细的讲解。
## 其他语言版本
diff --git "a/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md" "b/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md"
index 15255d3ec5..1865475816 100644
--- "a/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md"
+++ "b/problems/0463.\345\262\233\345\261\277\347\232\204\345\221\250\351\225\277.md"
@@ -1,6 +1,6 @@
## 题目链接
-https://leetcode-cn.com/problems/island-perimeter/
+[力扣题目链接](https://leetcode-cn.com/problems/island-perimeter/)
## 思路
diff --git "a/problems/0474.\344\270\200\345\222\214\351\233\266.md" "b/problems/0474.\344\270\200\345\222\214\351\233\266.md"
index 90d1227a4a..48dae28702 100644
--- "a/problems/0474.\344\270\200\345\222\214\351\233\266.md"
+++ "b/problems/0474.\344\270\200\345\222\214\351\233\266.md"
@@ -9,7 +9,7 @@
## 474.一和零
-题目链接:https://leetcode-cn.com/problems/ones-and-zeroes/
+[力扣题目链接](https://leetcode-cn.com/problems/ones-and-zeroes/)
给你一个二进制字符串数组 strs 和两个整数 m 和 n 。
@@ -84,13 +84,13 @@ dp[i][j] 就可以是 dp[i - zeroNum][j - oneNum] + 1。
3. dp数组如何初始化
-在[动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://mp.weixin.qq.com/s/M4uHxNVKRKm5HPjkNZBnFA)中已经讲解了,01背包的dp数组初始化为0就可以。
+在[动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html)中已经讲解了,01背包的dp数组初始化为0就可以。
因为物品价值不会是负数,初始为0,保证递推的时候dp[i][j]不会被初始值覆盖。
4. 确定遍历顺序
-在[动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://mp.weixin.qq.com/s/M4uHxNVKRKm5HPjkNZBnFA)中,我们讲到了01背包为什么一定是外层for循环遍历物品,内层for循环遍历背包容量且从后向前遍历!
+在[动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html)中,我们讲到了01背包为什么一定是外层for循环遍历物品,内层for循环遍历背包容量且从后向前遍历!
那么本题也是,物品就是strs里的字符串,背包容量就是题目描述中的m和n。
diff --git "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md"
index ed712f34b3..8eeb434d0a 100644
--- "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md"
+++ "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md"
@@ -11,7 +11,7 @@
## 491.递增子序列
-题目链接:https://leetcode-cn.com/problems/increasing-subsequences/
+[力扣题目链接](https://leetcode-cn.com/problems/increasing-subsequences/)
给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。
@@ -33,11 +33,11 @@
这个递增子序列比较像是取有序的子集。而且本题也要求不能有相同的递增子序列。
-这又是子集,又是去重,是不是不由自主的想起了刚刚讲过的[回溯算法:求子集问题(二)](https://mp.weixin.qq.com/s/WJ4JNDRJgsW3eUN72Hh3uQ)。
+这又是子集,又是去重,是不是不由自主的想起了刚刚讲过的[回溯算法:求子集问题(二)](https://programmercarl.com/0090.子集II.html)。
就是因为太像了,更要注意差别所在,要不就掉坑里了!
-在[回溯算法:求子集问题(二)](https://mp.weixin.qq.com/s/WJ4JNDRJgsW3eUN72Hh3uQ)中我们是通过排序,再加一个标记数组来达到去重的目的。
+在[回溯算法:求子集问题(二)](https://programmercarl.com/0090.子集II.html)中我们是通过排序,再加一个标记数组来达到去重的目的。
而本题求自增子序列,是不能对原数组经行排序的,排完序的数组都是自增子序列了。
@@ -66,7 +66,7 @@ void backtracking(vector& nums, int startIndex)
* 终止条件
-本题其实类似求子集问题,也是要遍历树形结构找每一个节点,所以和[回溯算法:求子集问题!](https://mp.weixin.qq.com/s/NNRzX-vJ_pjK4qxohd_LtA)一样,可以不加终止条件,startIndex每次都会加1,并不会无限递归。
+本题其实类似求子集问题,也是要遍历树形结构找每一个节点,所以和[回溯算法:求子集问题!](https://programmercarl.com/0078.子集.html)一样,可以不加终止条件,startIndex每次都会加1,并不会无限递归。
但本题收集结果有所不同,题目要求递增子序列大小至少为2,所以代码如下:
@@ -184,7 +184,7 @@ public:
这份代码在leetcode上提交,要比版本一耗时要好的多。
-**所以正如在[哈希表:总结篇!(每逢总结必经典)](https://mp.weixin.qq.com/s/1s91yXtarL-PkX07BfnwLg)中说的那样,数组,set,map都可以做哈希表,而且数组干的活,map和set都能干,但如何数值范围小的话能用数组尽量用数组**。
+**所以正如在[哈希表:总结篇!(每逢总结必经典)](https://programmercarl.com/哈希表总结.html)中说的那样,数组,set,map都可以做哈希表,而且数组干的活,map和set都能干,但如何数值范围小的话能用数组尽量用数组**。
@@ -192,7 +192,7 @@ public:
本题题解清一色都说是深度优先搜索,但我更倾向于说它用回溯法,而且本题我也是完全使用回溯法的逻辑来分析的。
-相信大家在本题中处处都能看到是[回溯算法:求子集问题(二)](https://mp.weixin.qq.com/s/WJ4JNDRJgsW3eUN72Hh3uQ)的身影,但处处又都是陷阱。
+相信大家在本题中处处都能看到是[回溯算法:求子集问题(二)](https://programmercarl.com/0090.子集II.html)的身影,但处处又都是陷阱。
**对于养成思维定式或者套模板套嗨了的同学,这道题起到了很好的警醒作用。更重要的是拓展了大家的思路!**
diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md"
index 5d89f7dce5..93e90356bc 100644
--- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md"
+++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md"
@@ -9,7 +9,7 @@
## 494. 目标和
-题目链接:https://leetcode-cn.com/problems/target-sum/
+[力扣题目链接](https://leetcode-cn.com/problems/target-sum/)
难度:中等
@@ -19,15 +19,15 @@
示例:
-输入:nums: [1, 1, 1, 1, 1], S: 3
-输出:5
+输入:nums: [1, 1, 1, 1, 1], S: 3
+输出:5
-解释:
--1+1+1+1+1 = 3
-+1-1+1+1+1 = 3
-+1+1-1+1+1 = 3
-+1+1+1-1+1 = 3
-+1+1+1+1-1 = 3
+解释:
+-1+1+1+1+1 = 3
++1-1+1+1+1 = 3
++1+1-1+1+1 = 3
++1+1+1-1+1 = 3
++1+1+1+1-1 = 3
一共有5种方法让最终目标和为3。
@@ -39,7 +39,7 @@
## 思路
-如果跟着「代码随想录」一起学过[回溯算法系列](https://mp.weixin.qq.com/s/r73thpBnK1tXndFDtlsdCQ)的录友,看到这道题,应该有一种直觉,就是感觉好像回溯法可以爆搜出来。
+如果跟着「代码随想录」一起学过[回溯算法系列](https://programmercarl.com/回溯总结.html)的录友,看到这道题,应该有一种直觉,就是感觉好像回溯法可以爆搜出来。
事实确实如此,下面我也会给出相应的代码,只不过会超时,哈哈。
@@ -59,7 +59,7 @@ target是固定的,sum是固定的,left就可以求出来。
## 回溯算法
-在回溯算法系列中,一起学过这道题目[回溯算法:39. 组合总和](https://mp.weixin.qq.com/s/FLg8G6EjVcxBjwCbzpACPw)的录友应该感觉很熟悉,这不就是组合总和问题么?
+在回溯算法系列中,一起学过这道题目[回溯算法:39. 组合总和](https://programmercarl.com/0039.组合总和.html)的录友应该感觉很熟悉,这不就是组合总和问题么?
此时可以套组合总和的回溯法代码,几乎不用改动。
@@ -144,7 +144,7 @@ dp[j] 表示:填满j(包括j)这么大容积的包,有dp[i]种方法
其实也可以使用二维dp数组来求解本题,dp[i][j]:使用 下标为[0, i]的nums[i]能够凑满j(包括j)这么大容量的包,有dp[i][j]种方法。
-下面我都是统一使用一维数组进行讲解, 二维降为一维(滚动数组),其实就是上一层拷贝下来,这个我在[动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://mp.weixin.qq.com/s/M4uHxNVKRKm5HPjkNZBnFA)也有介绍。
+下面我都是统一使用一维数组进行讲解, 二维降为一维(滚动数组),其实就是上一层拷贝下来,这个我在[动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html)也有介绍。
2. 确定递推公式
@@ -179,7 +179,7 @@ dp[j]其他下标对应的数值应该初始化为0,从递归公式也可以
4. 确定遍历顺序
-在[动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://mp.weixin.qq.com/s/M4uHxNVKRKm5HPjkNZBnFA)中,我们讲过对于01背包问题一维dp的遍历,nums放在外循环,target在内循环,且内循环倒序。
+在[动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html)中,我们讲过对于01背包问题一维dp的遍历,nums放在外循环,target在内循环,且内循环倒序。
5. 举例推导dp数组
@@ -202,7 +202,6 @@ public:
for (int i = 0; i < nums.size(); i++) sum += nums[i];
if (S > sum) return 0; // 此时没有方案
if ((S + sum) % 2 == 1) return 0; // 此时没有方案
- if (S + sum < 0) return 0; // 以确保bagSize为正数
int bagSize = (S + sum) / 2;
vector dp(bagSize + 1, 0);
dp[0] = 1;
@@ -222,9 +221,9 @@ public:
## 总结
-此时 大家应该不仅想起,我们之前讲过的[回溯算法:39. 组合总和](https://mp.weixin.qq.com/s/FLg8G6EjVcxBjwCbzpACPw)是不是应该也可以用dp来做啊?
+此时 大家应该不仅想起,我们之前讲过的[回溯算法:39. 组合总和](https://programmercarl.com/0039.组合总和.html)是不是应该也可以用dp来做啊?
-是的,如果仅仅是求个数的话,就可以用dp,但[回溯算法:39. 组合总和](https://mp.weixin.qq.com/s/FLg8G6EjVcxBjwCbzpACPw)要求的是把所有组合列出来,还是要使用回溯法爆搜的。
+是的,如果仅仅是求个数的话,就可以用dp,但[回溯算法:39. 组合总和](https://programmercarl.com/0039.组合总和.html)要求的是把所有组合列出来,还是要使用回溯法爆搜的。
本题还是有点难度,大家也可以记住,在求装满背包有几种方法的情况下,递推公式一般为:
@@ -312,7 +311,7 @@ Javascript:
const findTargetSumWays = (nums, target) => {
const sum = nums.reduce((a, b) => a+b);
-
+
if(target > sum) {
return 0;
}
diff --git "a/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md" "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md"
index 589ee8adb1..95aca60bda 100644
--- "a/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md"
+++ "b/problems/0496.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240I.md"
@@ -1,7 +1,7 @@
# 496.下一个更大元素 I
-题目链接:https://leetcode-cn.com/problems/next-greater-element-i/
+[力扣题目链接](https://leetcode-cn.com/problems/next-greater-element-i/)
给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。
@@ -24,7 +24,7 @@ nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位
解释:
对于 num1 中的数字 2 ,第二个数组中的下一个较大数字是 3 。
对于 num1 中的数字 4 ,第二个数组中没有下一个更大的数字,因此输出-1 。
-
+
提示:
* 1 <= nums1.length <= nums2.length <= 1000
@@ -34,13 +34,13 @@ nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位
# 思路
-做本题之前,建议先做一下[739. 每日温度](https://mp.weixin.qq.com/s/YeQ7eE0-hZpxJfJJziq25Q)
+做本题之前,建议先做一下[739. 每日温度](https://programmercarl.com/0739.每日温度.html)
-在[739. 每日温度](https://mp.weixin.qq.com/s/YeQ7eE0-hZpxJfJJziq25Q)中是求每个元素下一个比当前元素大的元素的位置。
+在[739. 每日温度](https://programmercarl.com/0739.每日温度.html)中是求每个元素下一个比当前元素大的元素的位置。
本题则是说nums1 是 nums2的子集,找nums1中的元素在nums2中下一个比当前元素大的元素。
-看上去和[739. 每日温度](https://mp.weixin.qq.com/s/YeQ7eE0-hZpxJfJJziq25Q) 就如出一辙了。
+看上去和[739. 每日温度](https://programmercarl.com/0739.每日温度.html) 就如出一辙了。
几乎是一样的,但是这么绕了一下,其实还上升了一点难度。
@@ -60,7 +60,7 @@ nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位
没有重复元素,我们就可以用map来做映射了。根据数值快速找到下标,还可以判断nums2[i]是否在nums1中出现过。
-C++中,当我们要使用集合来解决哈希问题的时候,优先使用unordered_set,因为它的查询和增删效率是最优的。我在[关于哈希表,你该了解这些!](https://mp.weixin.qq.com/s/RSUANESA_tkhKhYe3ZR8Jg)中也做了详细的解释。
+C++中,当我们要使用集合来解决哈希问题的时候,优先使用unordered_set,因为它的查询和增删效率是最优的。我在[关于哈希表,你该了解这些!](https://programmercarl.com/哈希表理论基础.html)中也做了详细的解释。
那么预处理代码如下:
diff --git "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md"
index f29fd08aab..4221e2857c 100644
--- "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md"
+++ "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md"
@@ -11,7 +11,7 @@
## 501.二叉搜索树中的众数
-题目地址:https://leetcode-cn.com/problems/find-mode-in-binary-search-tree/solution/
+[力扣题目链接](https://leetcode-cn.com/problems/find-mode-in-binary-search-tree/solution/)
给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。
@@ -161,7 +161,7 @@ void searchBST(TreeNode* cur) {
这就考察对树的操作了。
-在[二叉树:搜索树的最小绝对差](https://mp.weixin.qq.com/s/Hwzml6698uP3qQCC1ctUQQ)中我们就使用了pre指针和cur指针的技巧,这次又用上了。
+在[二叉树:搜索树的最小绝对差](https://programmercarl.com/0530.二叉搜索树的最小绝对差.html)中我们就使用了pre指针和cur指针的技巧,这次又用上了。
弄一个指针指向前一个节点,这样每次cur(当前节点)才能和pre(前一个节点)作比较。
@@ -272,8 +272,8 @@ public:
二叉树前中后序转迭代,传送门:
-* [二叉树:前中后序迭代法](https://mp.weixin.qq.com/s/c_zCrGHIVlBjUH_hJtghCg)
-* [二叉树:前中后序统一风格的迭代方式](https://mp.weixin.qq.com/s/WKg0Ty1_3SZkztpHubZPRg)
+* [二叉树:前中后序迭代法](https://programmercarl.com/二叉树的迭代遍历.html)
+* [二叉树:前中后序统一风格的迭代方式](https://programmercarl.com/二叉树的统一迭代法.html)
下面我给出其中的一种中序遍历的迭代法,其中间处理逻辑一点都没有变(我从递归法直接粘过来的代码,连注释都没改,哈哈)
diff --git "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md"
index 9f38d80d36..4e088ed447 100644
--- "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md"
+++ "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md"
@@ -1,7 +1,7 @@
# 503.下一个更大元素II
-链接:https://leetcode-cn.com/problems/next-greater-element-ii/
+[力扣题目链接](https://leetcode-cn.com/problems/next-greater-element-ii/)
给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。
@@ -14,13 +14,13 @@
# 思路
-做本题之前建议先做[739. 每日温度](https://mp.weixin.qq.com/s/YeQ7eE0-hZpxJfJJziq25Q) 和 [496.下一个更大元素 I](https://mp.weixin.qq.com/s/U0O6XkFOe-RMXthPS16sWQ)。
+做本题之前建议先做[739. 每日温度](https://programmercarl.com/0739.每日温度.html) 和 [496.下一个更大元素 I](https://programmercarl.com/0496.下一个更大元素I.html)。
-这道题和[739. 每日温度](https://mp.weixin.qq.com/s/YeQ7eE0-hZpxJfJJziq25Q)也几乎如出一辙。
+这道题和[739. 每日温度](https://programmercarl.com/0739.每日温度.html)也几乎如出一辙。
不同的时候本题要循环数组了。
-关于单调栈的讲解我在题解[739. 每日温度](https://mp.weixin.qq.com/s/YeQ7eE0-hZpxJfJJziq25Q)中已经详细讲解了。
+关于单调栈的讲解我在题解[739. 每日温度](https://programmercarl.com/0739.每日温度.html)中已经详细讲解了。
本篇我侧重与说一说,如何处理循环数组。
diff --git "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md" "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md"
index 3b3d5056f1..293e232302 100644
--- "a/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md"
+++ "b/problems/0509.\346\226\220\346\263\242\351\202\243\345\245\221\346\225\260.md"
@@ -8,7 +8,7 @@
## 509. 斐波那契数
-题目地址:https://leetcode-cn.com/problems/fibonacci-number/
+[力扣题目链接](https://leetcode-cn.com/problems/fibonacci-number/)
斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0,F(1) = 1
@@ -29,7 +29,7 @@ F(n) = F(n - 1) + F(n - 2),其中 n > 1
输入:4
输出:3
解释:F(4) = F(3) + F(2) = 2 + 1 = 3
-
+
提示:
* 0 <= n <= 30
@@ -47,7 +47,7 @@ F(n) = F(n - 1) + F(n - 2),其中 n > 1
对于动规,如果没有方法论的话,可能简单题目可以顺手一写就过,难一点就不知道如何下手了。
-所以我总结的动规五部曲,是要用来贯穿整个动态规划系列的,就像之前讲过[二叉树系列的递归三部曲](https://mp.weixin.qq.com/s/I6ZXFbw09NR31F5CJR_geQ),[回溯法系列的回溯三部曲](https://mp.weixin.qq.com/s/gjSgJbNbd1eAA5WkA-HeWw)一样。后面慢慢大家就会体会到,动规五部曲方法的重要性。
+所以我总结的动规五部曲,是要用来贯穿整个动态规划系列的,就像之前讲过[二叉树系列的递归三部曲](https://programmercarl.com/前序/通过一道面试题目,讲一讲递归算法的时间复杂度!.html),[回溯法系列的回溯三部曲](https://programmercarl.com/回溯算法理论基础.html)一样。后面慢慢大家就会体会到,动规五部曲方法的重要性。
### 动态规划
@@ -150,14 +150,14 @@ public:
* 时间复杂度:O(2^n)
* 空间复杂度:O(n) 算上了编程语言中实现递归的系统栈所占空间
-这个递归的时间复杂度大家画一下树形图就知道了,如果不清晰的同学,可以看这篇:[通过一道面试题目,讲一讲递归算法的时间复杂度!](https://mp.weixin.qq.com/s/I6ZXFbw09NR31F5CJR_geQ)
+这个递归的时间复杂度大家画一下树形图就知道了,如果不清晰的同学,可以看这篇:[通过一道面试题目,讲一讲递归算法的时间复杂度!](https://programmercarl.com/前序/通过一道面试题目,讲一讲递归算法的时间复杂度!.html)
# 总结
斐波那契数列这道题目是非常基础的题目,我在后面的动态规划的讲解中将会多次提到斐波那契数列!
-这里我严格按照[关于动态规划,你该了解这些!](https://leetcode-cn.com/circle/article/tNuNnM/)中的动规五部曲来分析了这道题目,一些分析步骤可能同学感觉没有必要搞的这么复杂,代码其实上来就可以撸出来。
+这里我严格按照[关于动态规划,你该了解这些!](https://programmercarl.com/动态规划理论基础.html)中的动规五部曲来分析了这道题目,一些分析步骤可能同学感觉没有必要搞的这么复杂,代码其实上来就可以撸出来。
但我还是强调一下,简单题是用来掌握方法论的,动规五部曲将在接下来的动态规划讲解中发挥重要作用,敬请期待!
diff --git "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md" "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md"
index bca7e074c6..0dcbbb762d 100644
--- "a/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md"
+++ "b/problems/0513.\346\211\276\346\240\221\345\267\246\344\270\213\350\247\222\347\232\204\345\200\274.md"
@@ -9,7 +9,7 @@
# 513.找树左下角的值
-题目地址:[https://leetcode-cn.com/problems/find-bottom-left-tree-value/](https://leetcode-cn.com/problems/find-bottom-left-tree-value/v)
+[力扣题目链接]([https://leetcode-cn.com/problems/find-bottom-left-tree-value/](https://leetcode-cn.com/problems/find-bottom-left-tree-value/v))
给定一个二叉树,在树的最后一行找到最左边的值。
@@ -39,7 +39,7 @@
如果使用递归法,如何判断是最后一行呢,其实就是深度最大的叶子节点一定是最后一行。
-如果对二叉树深度和高度还有点疑惑的话,请看:[110.平衡二叉树](https://mp.weixin.qq.com/s/7QeWnxaAB66LjFJOs40XKg)。
+如果对二叉树深度和高度还有点疑惑的话,请看:[110.平衡二叉树](https://programmercarl.com/0110.平衡二叉树.html)。
所以要找深度最大的叶子节点。
@@ -170,7 +170,7 @@ public:
};
```
-如果对回溯部分精简的代码 不理解的话,可以看这篇[257. 二叉树的所有路径](https://mp.weixin.qq.com/s/-x0IL-5eb9W0kZC1-TM0Lw)
+如果对回溯部分精简的代码 不理解的话,可以看这篇[257. 二叉树的所有路径](https://programmercarl.com/0257.二叉树的所有路径.html)
## 迭代法
@@ -179,7 +179,7 @@ public:
只需要记录最后一行第一个节点的数值就可以了。
-如果对层序遍历不了解,看这篇[二叉树:层序遍历登场!](https://mp.weixin.qq.com/s/4-bDKi7SdwfBGRm9FYduiA),这篇里也给出了层序遍历的模板,稍作修改就一过刷了这道题了。
+如果对层序遍历不了解,看这篇[二叉树:层序遍历登场!](https://programmercarl.com/0102.二叉树的层序遍历.html),这篇里也给出了层序遍历的模板,稍作修改就一过刷了这道题了。
代码如下:
@@ -209,9 +209,9 @@ public:
本题涉及如下几点:
-* 递归求深度的写法,我们在[110.平衡二叉树](https://mp.weixin.qq.com/s/7QeWnxaAB66LjFJOs40XKg)中详细的分析了深度应该怎么求,高度应该怎么求。
-* 递归中其实隐藏了回溯,在[257. 二叉树的所有路径](https://mp.weixin.qq.com/s/-x0IL-5eb9W0kZC1-TM0Lw)中讲解了究竟哪里使用了回溯,哪里隐藏了回溯。
-* 层次遍历,在[二叉树:层序遍历登场!](https://mp.weixin.qq.com/s/4-bDKi7SdwfBGRm9FYduiA)深度讲解了二叉树层次遍历。
+* 递归求深度的写法,我们在[110.平衡二叉树](https://programmercarl.com/0110.平衡二叉树.html)中详细的分析了深度应该怎么求,高度应该怎么求。
+* 递归中其实隐藏了回溯,在[257. 二叉树的所有路径](https://programmercarl.com/0257.二叉树的所有路径.html)中讲解了究竟哪里使用了回溯,哪里隐藏了回溯。
+* 层次遍历,在[二叉树:层序遍历登场!](https://programmercarl.com/0102.二叉树的层序遍历.html)深度讲解了二叉树层次遍历。
所以本题涉及到的点,我们之前都讲解过,这些知识点需要同学们灵活运用,这样就举一反三了。
diff --git "a/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md"
index 54cea10eb6..89b5667fb1 100644
--- "a/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md"
+++ "b/problems/0516.\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.md"
@@ -7,7 +7,7 @@
欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!
## 516.最长回文子序列
-题目链接:https://leetcode-cn.com/problems/longest-palindromic-subsequence/
+[力扣题目链接](https://leetcode-cn.com/problems/longest-palindromic-subsequence/)
给定一个字符串 s ,找到其中最长的回文子序列,并返回该序列的长度。可以假设 s 的最大长度为 1000 。
@@ -29,7 +29,7 @@
## 思路
-我们刚刚做过了 [动态规划:回文子串](https://mp.weixin.qq.com/s/2WetyP6IYQ6VotegepVpEw),求的是回文子串,而本题要求的是回文子序列, 要搞清楚这两者之间的区别。
+我们刚刚做过了 [动态规划:回文子串](https://programmercarl.com/0647.回文子串.html),求的是回文子串,而本题要求的是回文子序列, 要搞清楚这两者之间的区别。
**回文子串是要连续的,回文子序列可不是连续的!** 回文子串,回文子序列都是动态规划经典题目。
diff --git "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md" "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md"
index ea2b1777b7..fda3621bcb 100644
--- "a/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md"
+++ "b/problems/0518.\351\233\266\351\222\261\345\205\221\346\215\242II.md"
@@ -9,7 +9,7 @@
## 518. 零钱兑换 II
-链接:https://leetcode-cn.com/problems/coin-change-2/
+[力扣题目链接](https://leetcode-cn.com/problems/coin-change-2/)
难度:中等
@@ -46,7 +46,7 @@
这是一道典型的背包问题,一看到钱币数量不限,就知道这是一个完全背包。
-对完全背包还不了解的同学,可以看这篇:[动态规划:关于完全背包,你该了解这些!](https://mp.weixin.qq.com/s/akwyxlJ4TLvKcw26KB9uJw)
+对完全背包还不了解的同学,可以看这篇:[动态规划:关于完全背包,你该了解这些!](https://programmercarl.com/背包问题理论基础完全背包.html)
但本题和纯完全背包不一样,**纯完全背包是能否凑成总金额,而本题是要求凑成总金额的个数!**
@@ -78,7 +78,7 @@ dp[j] (考虑coins[i]的组合总和) 就是所有的dp[j - coins[i]](不
所以递推公式:dp[j] += dp[j - coins[i]];
-**这个递推公式大家应该不陌生了,我在讲解01背包题目的时候在这篇[动态规划:目标和!](https://mp.weixin.qq.com/s/2pWmaohX75gwxvBENS-NCw)中就讲解了,求装满背包有几种方法,一般公式都是:dp[j] += dp[j - nums[i]];**
+**这个递推公式大家应该不陌生了,我在讲解01背包题目的时候在这篇[动态规划:目标和!](https://programmercarl.com/0494.目标和.html)中就讲解了,求装满背包有几种方法,一般公式都是:dp[j] += dp[j - nums[i]];**
3. dp数组如何初始化
@@ -93,7 +93,7 @@ dp[j] (考虑coins[i]的组合总和) 就是所有的dp[j - coins[i]](不
本题中我们是外层for循环遍历物品(钱币),内层for遍历背包(金钱总额),还是外层for遍历背包(金钱总额),内层for循环遍历物品(钱币)呢?
-我在[动态规划:关于完全背包,你该了解这些!](https://mp.weixin.qq.com/s/akwyxlJ4TLvKcw26KB9uJw)中讲解了完全背包的两个for循环的先后顺序都是可以的。
+我在[动态规划:关于完全背包,你该了解这些!](https://programmercarl.com/背包问题理论基础完全背包.html)中讲解了完全背包的两个for循环的先后顺序都是可以的。
**但本题就不行了!**
@@ -170,7 +170,7 @@ public:
## 总结
-本题的递推公式,其实我们在[动态规划:目标和!](https://mp.weixin.qq.com/s/2pWmaohX75gwxvBENS-NCw)中就已经讲过了,**而难点在于遍历顺序!**
+本题的递推公式,其实我们在[动态规划:目标和!](https://programmercarl.com/0494.目标和.html)中就已经讲过了,**而难点在于遍历顺序!**
在求装满背包有几种方案的时候,认清遍历顺序是非常关键的。
diff --git "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md"
index 04c03b3f48..c770e88c48 100644
--- "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md"
+++ "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md"
@@ -11,7 +11,7 @@
## 530.二叉搜索树的最小绝对差
-题目地址:https://leetcode-cn.com/problems/minimum-absolute-difference-in-bst/
+[力扣题目链接](https://leetcode-cn.com/problems/minimum-absolute-difference-in-bst/)
给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。
@@ -101,7 +101,7 @@ public:
## 迭代
-看过这两篇[二叉树:听说递归能做的,栈也能做!](https://mp.weixin.qq.com/s/c_zCrGHIVlBjUH_hJtghCg),[二叉树:前中后序迭代方式的写法就不能统一一下么?](https://mp.weixin.qq.com/s/WKg0Ty1_3SZkztpHubZPRg)文章之后,不难写出两种中序遍历的迭代法。
+看过这两篇[二叉树:听说递归能做的,栈也能做!](https://programmercarl.com/二叉树的迭代遍历.html),[二叉树:前中后序迭代方式的写法就不能统一一下么?](https://programmercarl.com/二叉树的统一迭代法.html)文章之后,不难写出两种中序遍历的迭代法。
下面我给出其中的一种中序遍历的迭代法,代码如下:
diff --git "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md" "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md"
index d22cb4bcaf..df22511d7c 100644
--- "a/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md"
+++ "b/problems/0538.\346\212\212\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\350\275\254\346\215\242\344\270\272\347\264\257\345\212\240\346\240\221.md"
@@ -9,7 +9,7 @@
## 538.把二叉搜索树转换为累加树
-题目链接:https://leetcode-cn.com/problems/convert-bst-to-greater-tree/
+[力扣题目链接](https://leetcode-cn.com/problems/convert-bst-to-greater-tree/)
给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。
@@ -69,7 +69,7 @@
本题依然需要一个pre指针记录当前遍历节点cur的前一个节点,这样才方便做累加。
-pre指针的使用技巧,我们在[二叉树:搜索树的最小绝对差](https://mp.weixin.qq.com/s/Hwzml6698uP3qQCC1ctUQQ)和[二叉树:我的众数是多少?](https://mp.weixin.qq.com/s/KSAr6OVQIMC-uZ8MEAnGHg)都提到了,这是常用的操作手段。
+pre指针的使用技巧,我们在[二叉树:搜索树的最小绝对差](https://programmercarl.com/0530.二叉搜索树的最小绝对差.html)和[二叉树:我的众数是多少?](https://programmercarl.com/0501.二叉搜索树中的众数.html)都提到了,这是常用的操作手段。
* 递归函数参数以及返回值
@@ -129,7 +129,7 @@ public:
## 迭代法
-迭代法其实就是中序模板题了,在[二叉树:前中后序迭代法](https://mp.weixin.qq.com/s/c_zCrGHIVlBjUH_hJtghCg)和[二叉树:前中后序统一方式迭代法](https://mp.weixin.qq.com/s/WKg0Ty1_3SZkztpHubZPRg)可以选一种自己习惯的写法。
+迭代法其实就是中序模板题了,在[二叉树:前中后序迭代法](https://programmercarl.com/二叉树的迭代遍历.html)和[二叉树:前中后序统一方式迭代法](https://programmercarl.com/二叉树的统一迭代法.html)可以选一种自己习惯的写法。
这里我给出其中的一种,代码如下:
diff --git "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md"
index 02713c65a4..469b568576 100644
--- "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md"
+++ "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md"
@@ -12,7 +12,7 @@
# 541. 反转字符串II
-https://leetcode-cn.com/problems/reverse-string-ii/
+[力扣题目链接](https://leetcode-cn.com/problems/reverse-string-ii/)
给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。
@@ -65,7 +65,7 @@ public:
};
```
-那么我们也可以实现自己的reverse函数,其实和题目[344. 反转字符串](https://mp.weixin.qq.com/s/_rNm66OJVl92gBDIbGpA3w)道理是一样的。
+那么我们也可以实现自己的reverse函数,其实和题目[344. 反转字符串](https://programmercarl.com/0344.反转字符串.html)道理是一样的。
下面我实现的reverse函数区间是左闭右闭区间,代码如下:
@@ -155,27 +155,34 @@ class Solution {
Python:
```python
-class Solution:
- def reverseStr(self, s: str, k: int) -> str:
+
+class Solution(object):
+ def reverseStr(self, s, k):
"""
- 1. 使用range(start, end, step)来确定需要调换的初始位置
- 2. 对于字符串s = 'abc',如果使用s[0:999] ===> 'abc'。字符串末尾如果超过最大长度,则会返回至字符串最后一个值,这个特性可以避免一些边界条件的处理。
- 3. 用切片整体替换,而不是一个个替换.
+ :type s: str
+ :type k: int
+ :rtype: str
"""
- def reverse_substring(text):
- left, right = 0, len(text) - 1
+ from functools import reduce
+ # turn s into a list
+ s = list(s)
+
+ # another way to simply use a[::-1], but i feel this is easier to understand
+ def reverse(s):
+ left, right = 0, len(s) - 1
while left < right:
- text[left], text[right] = text[right], text[left]
+ s[left], s[right] = s[right], s[left]
left += 1
right -= 1
- return text
+ return s
- res = list(s)
-
- for cur in range(0, len(s), 2 * k):
- res[cur: cur + k] = reverse_substring(res[cur: cur + k])
+ # make sure we reverse each 2k elements
+ for i in range(0, len(s), 2*k):
+ s[i:(i+k)] = reverse(s[i:(i+k)])
+
+ # combine list into str.
+ return reduce(lambda a, b: a+b, s)
- return ''.join(res)
```
From 7f11771df9b4ff16304a1f6b5033099cf7d92d31 Mon Sep 17 00:00:00 2001
From: xsduan98
Date: Tue, 24 Aug 2021 12:47:11 +0800
Subject: [PATCH 0069/3468] =?UTF-8?q?=E7=AC=AC90=E9=A2=98.=E5=AD=90?=
=?UTF-8?q?=E9=9B=86II=20cpp=E4=BB=A3=E7=A0=81=E6=B7=BB=E5=8A=A0=E6=B3=A8?=
=?UTF-8?q?=E9=87=8A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
"problems/0090.\345\255\220\351\233\206II.md" | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
diff --git "a/problems/0090.\345\255\220\351\233\206II.md" "b/problems/0090.\345\255\220\351\233\206II.md"
index 5c19adc059..ae8f9928f2 100644
--- "a/problems/0090.\345\255\220\351\233\206II.md"
+++ "b/problems/0090.\345\255\220\351\233\206II.md"
@@ -48,7 +48,7 @@
## C++代码
-```
+```c++
class Solution {
private:
vector> result;
@@ -80,11 +80,10 @@ public:
return result;
}
};
-
```
使用set去重的版本。
-```
+```c++
class Solution {
private:
vector> result;
@@ -113,7 +112,6 @@ public:
return result;
}
};
-
```
## 补充
@@ -151,7 +149,6 @@ public:
return result;
}
};
-
```
## 总结
From 8c748680f1a6c4273cc0b3e0f2d2fabb1da712e5 Mon Sep 17 00:00:00 2001
From: XuDaHaoRen <1547794387@qq.com>
Date: Tue, 24 Aug 2021 13:11:57 +0800
Subject: [PATCH 0070/3468] =?UTF-8?q?541~1382=E8=BF=9E=E6=8E=A5=E5=90=88?=
=?UTF-8?q?=E5=B9=B6+commit=E4=B9=8B=E5=89=8D=20gitpull?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...40\351\231\244\346\223\215\344\275\234.md" | 4 +-
...66\344\272\214\345\217\211\346\240\221.md" | 6 +--
...36\346\226\207\345\255\220\344\270\262.md" | 2 +-
...a2\345\217\202\350\256\256\351\231\242.md" | 2 +-
...47\344\272\214\345\217\211\346\240\221.md" | 6 +--
...24\345\233\236\345\216\237\347\202\271.md" | 2 +-
...11\346\220\234\347\264\242\346\240\221.md" | 4 +-
...22\345\242\236\345\272\217\345\210\227.md" | 10 ++---
...\344\275\231\350\277\236\346\216\245II.md" | 2 +-
...55\347\232\204\346\220\234\347\264\242.md" | 8 ++--
...22\345\205\245\346\223\215\344\275\234.md" | 6 +--
...14\345\210\206\346\237\245\346\211\276.md" | 4 +-
...76\350\256\241\351\223\276\350\241\250.md" | 6 +--
...53\346\211\213\347\273\255\350\264\271.md" | 8 ++--
...01\350\247\204\345\210\222\357\274\211.md" | 8 ++--
...15\345\255\220\346\225\260\347\273\204.md" | 2 +-
...36\347\232\204\346\225\260\345\255\227.md" | 2 +-
...17\346\227\245\346\270\251\345\272\246.md" | 3 +-
...71\347\210\254\346\245\274\346\242\257.md" | 8 ++--
...27\346\257\215\345\214\272\351\227\264.md" | 4 +-
...31\345\222\214\346\210\277\351\227\264.md" | 2 +-
...04\345\255\227\347\254\246\344\270\262.md" | 4 +-
...54\346\260\264\346\211\276\351\233\266.md" | 2 +-
...77\346\214\211\351\224\256\345\205\245.md" | 2 +-
...61\350\204\211\346\225\260\347\273\204.md" | 4 +-
...47\344\272\214\345\217\211\346\240\221.md" | 2 +-
...04\347\232\204\345\271\263\346\226\271.md" | 2 +-
...70\347\224\250\345\255\227\347\254\246.md" | 44 +++----------------
...04\346\225\260\347\273\204\345\222\214.md" | 2 +-
...70\344\272\244\347\232\204\347\272\277.md" | 12 ++---
...73\351\207\215\345\244\215\351\241\271.md" | 39 ++++------------
...\347\232\204\351\207\215\351\207\217II.md" | 16 +++----
...61\345\255\220\345\272\217\345\210\227.md" | 4 +-
...72\347\216\260\346\254\241\346\225\260.md" | 6 +--
...60\347\233\256\346\216\222\345\272\217.md" | 2 +-
...27\347\232\204\346\225\260\345\255\227.md" | 6 +--
...21\345\217\230\345\271\263\350\241\241.md" | 6 +--
37 files changed, 97 insertions(+), 155 deletions(-)
diff --git "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md"
index f6c13039f5..89a8f57cd2 100644
--- "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md"
+++ "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md"
@@ -8,7 +8,7 @@
## 583. 两个字符串的删除操作
-题目链接:https://leetcode-cn.com/problems/delete-operation-for-two-strings/
+[力扣题目链接](https://leetcode-cn.com/problems/delete-operation-for-two-strings/)
给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。
@@ -20,7 +20,7 @@
## 思路
-本题和[动态规划:115.不同的子序列](https://mp.weixin.qq.com/s/1SULY2XVSROtk_hsoVLu8A)相比,其实就是两个字符串可以都可以删除了,情况虽说复杂一些,但整体思路是不变的。
+本题和[动态规划:115.不同的子序列](https://programmercarl.com/0115.不同的子序列.html)相比,其实就是两个字符串可以都可以删除了,情况虽说复杂一些,但整体思路是不变的。
这次是两个字符串可以相互删了,这种题目也知道用动态规划的思路来解,动规五部曲,分析如下:
diff --git "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md"
index b24a934b66..22cfe14786 100644
--- "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md"
+++ "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md"
@@ -9,7 +9,7 @@
## 617.合并二叉树
-题目地址:https://leetcode-cn.com/problems/merge-two-binary-trees/
+[力扣题目链接](https://leetcode-cn.com/problems/merge-two-binary-trees/)
给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。
@@ -165,7 +165,7 @@ public:
使用迭代法,如何同时处理两棵树呢?
-思路我们在[二叉树:我对称么?](https://mp.weixin.qq.com/s/Kgf0gjvlDlNDfKIH2b1Oxg)中的迭代法已经讲过一次了,求二叉树对称的时候就是把两个树的节点同时加入队列进行比较。
+思路我们在[二叉树:我对称么?](https://programmercarl.com/0101.对称二叉树.html)中的迭代法已经讲过一次了,求二叉树对称的时候就是把两个树的节点同时加入队列进行比较。
本题我们也使用队列,模拟的层序遍历,代码如下:
@@ -245,7 +245,7 @@ public:
合并二叉树,也是二叉树操作的经典题目,如果没有接触过的话,其实并不简单,因为我们习惯了操作一个二叉树,一起操作两个二叉树,还会有点懵懵的。
-这不是我们第一次操作两颗二叉树了,在[二叉树:我对称么?](https://mp.weixin.qq.com/s/Kgf0gjvlDlNDfKIH2b1Oxg)中也一起操作了两棵二叉树。
+这不是我们第一次操作两颗二叉树了,在[二叉树:我对称么?](https://programmercarl.com/0101.对称二叉树.html)中也一起操作了两棵二叉树。
迭代法中,一般一起操作两个树都是使用队列模拟类似层序遍历,同时处理两个树的节点,这种方式最好理解,如果用模拟递归的思路的话,要复杂一些。
diff --git "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md" "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md"
index f81801b76e..7b90ca0ca8 100644
--- "a/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md"
+++ "b/problems/0647.\345\233\236\346\226\207\345\255\220\344\270\262.md"
@@ -8,7 +8,7 @@
## 647. 回文子串
-题目链接:https://leetcode-cn.com/problems/palindromic-substrings/
+[力扣题目链接](https://leetcode-cn.com/problems/palindromic-substrings/)
给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。
diff --git "a/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" "b/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md"
index b73686c472..9cec740105 100644
--- "a/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md"
+++ "b/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md"
@@ -67,7 +67,7 @@ Dota2 参议院由来自两派的参议员组成。现在参议院希望对一
局部最优可以退出全局最优,举不出反例,那么试试贪心。
-如果对贪心算法理论基础还不了解的话,可以看看这篇:[关于贪心算法,你该了解这些!](https://mp.weixin.qq.com/s/O935TaoHE9Eexwe_vSbRAg) ,相信看完之后对贪心就有基本的了解了。
+如果对贪心算法理论基础还不了解的话,可以看看这篇:[关于贪心算法,你该了解这些!](https://programmercarl.com/贪心算法理论基础.html) ,相信看完之后对贪心就有基本的了解了。
# 代码实现
diff --git "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md"
index 8c310a21f3..ee7f5eebcc 100644
--- "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md"
+++ "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md"
@@ -9,7 +9,7 @@
## 654.最大二叉树
-题目地址:https://leetcode-cn.com/problems/maximum-binary-tree/
+[力扣题目地址](https://leetcode-cn.com/problems/maximum-binary-tree/)
给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:
@@ -143,7 +143,7 @@ public:
以上代码比较冗余,效率也不高,每次还要切割的时候每次都要定义新的vector(也就是数组),但逻辑比较清晰。
-和文章[二叉树:构造二叉树登场!](https://mp.weixin.qq.com/s/7r66ap2s-shvVvlZxo59xg)中一样的优化思路,就是每次分隔不用定义新的数组,而是通过下表索引直接在原数组上操作。
+和文章[二叉树:构造二叉树登场!](https://programmercarl.com/0106.从中序与后序遍历序列构造二叉树.html)中一样的优化思路,就是每次分隔不用定义新的数组,而是通过下表索引直接在原数组上操作。
优化后代码如下:
@@ -212,7 +212,7 @@ root->right = traversal(nums, maxValueIndex + 1, right);
## 总结
-这道题目其实和 [二叉树:构造二叉树登场!](https://mp.weixin.qq.com/s/7r66ap2s-shvVvlZxo59xg) 是一个思路,比[二叉树:构造二叉树登场!](https://mp.weixin.qq.com/s/7r66ap2s-shvVvlZxo59xg) 还简单一些。
+这道题目其实和 [二叉树:构造二叉树登场!](https://programmercarl.com/0106.从中序与后序遍历序列构造二叉树.html) 是一个思路,比[二叉树:构造二叉树登场!](https://programmercarl.com/0106.从中序与后序遍历序列构造二叉树.html) 还简单一些。
**注意类似用数组构造二叉树的题目,每次分隔尽量不要定义新的数组,而是通过下表索引直接在原数组上操作,这样可以节约时间和空间上的开销。**
diff --git "a/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md" "b/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md"
index 480e830f4d..ffa5d6f20a 100644
--- "a/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md"
+++ "b/problems/0657.\346\234\272\345\231\250\344\272\272\350\203\275\345\220\246\350\277\224\345\233\236\345\216\237\347\202\271.md"
@@ -9,7 +9,7 @@
# 657. 机器人能否返回原点
-题目地址:https://leetcode-cn.com/problems/robot-return-to-origin/
+[力扣题目链接](https://leetcode-cn.com/problems/robot-return-to-origin/)
在二维平面上,有一个机器人从原点 (0, 0) 开始。给出它的移动顺序,判断这个机器人在完成移动后是否在 (0, 0) 处结束。
diff --git "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md"
index 267497b46c..fe18e5a571 100644
--- "a/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md"
+++ "b/problems/0669.\344\277\256\345\211\252\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md"
@@ -12,7 +12,7 @@
## 669. 修剪二叉搜索树
-题目链接:https://leetcode-cn.com/problems/trim-a-binary-search-tree/
+[力扣题目链接](https://leetcode-cn.com/problems/trim-a-binary-search-tree/)
给定一个二叉搜索树,同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>=L) 。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。
@@ -71,7 +71,7 @@ public:
但是有返回值,更方便,可以通过递归函数的返回值来移除节点。
-这样的做法在[二叉树:搜索树中的插入操作](https://mp.weixin.qq.com/s/lwKkLQcfbCNX2W-5SOeZEA)和[二叉树:搜索树中的删除操作](https://mp.weixin.qq.com/s/-p-Txvch1FFk3ygKLjPAKw)中大家已经了解过了。
+这样的做法在[二叉树:搜索树中的插入操作](https://programmercarl.com/0701.二叉搜索树中的插入操作.html)和[二叉树:搜索树中的删除操作](https://programmercarl.com/0450.删除二叉搜索树中的节点.html)中大家已经了解过了。
代码如下:
diff --git "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md" "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md"
index 0fe1c49a7b..3f3b5e6f9d 100644
--- "a/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md"
+++ "b/problems/0674.\346\234\200\351\225\277\350\277\236\347\273\255\351\200\222\345\242\236\345\272\217\345\210\227.md"
@@ -8,7 +8,7 @@
## 674. 最长连续递增序列
-题目链接:https://leetcode-cn.com/problems/longest-continuous-increasing-subsequence/
+[力扣题目链接](https://leetcode-cn.com/problems/longest-continuous-increasing-subsequence/)
给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。
@@ -24,7 +24,7 @@
输入:nums = [2,2,2,2,2]
输出:1
解释:最长连续递增序列是 [2], 长度为1。
-
+
提示:
* 0 <= nums.length <= 10^4
@@ -33,7 +33,7 @@
## 思路
-本题相对于昨天的[动态规划:300.最长递增子序列](https://mp.weixin.qq.com/s/f8nLO3JGfgriXep_gJQpqQ)最大的区别在于“连续”。
+本题相对于昨天的[动态规划:300.最长递增子序列](https://programmercarl.com/0300.最长上升子序列.html)最大的区别在于“连续”。
本题要求的是最长**连续**递增序列
@@ -53,7 +53,7 @@
即:dp[i + 1] = dp[i] + 1;
-**注意这里就体现出和[动态规划:300.最长递增子序列](https://mp.weixin.qq.com/s/f8nLO3JGfgriXep_gJQpqQ)的区别!**
+**注意这里就体现出和[动态规划:300.最长递增子序列](https://programmercarl.com/0300.最长上升子序列.html)的区别!**
因为本题要求连续递增子序列,所以就必要比较nums[i + 1]与nums[i],而不用去比较nums[j]与nums[i] (j是在0到i之间遍历)。
@@ -144,7 +144,7 @@ public:
本题也是动规里子序列问题的经典题目,但也可以用贪心来做,大家也会发现贪心好像更简单一点,而且空间复杂度仅是O(1)。
-在动规分析中,关键是要理解和[动态规划:300.最长递增子序列](https://mp.weixin.qq.com/s/f8nLO3JGfgriXep_gJQpqQ)的区别。
+在动规分析中,关键是要理解和[动态规划:300.最长递增子序列](https://programmercarl.com/0300.最长上升子序列.html)的区别。
**要联动起来,才能理解递增子序列怎么求,递增连续子序列又要怎么求**。
diff --git "a/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md" "b/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md"
index e282e620a8..68d0376ed6 100644
--- "a/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md"
+++ "b/problems/0685.\345\206\227\344\275\231\350\277\236\346\216\245II.md"
@@ -11,7 +11,7 @@
# 685.冗余连接II
-题目地址:https://leetcode-cn.com/problems/redundant-connection-ii/
+[力扣题目链接](https://leetcode-cn.com/problems/redundant-connection-ii/)
在本问题中,有根树指满足以下条件的 有向 图。该树只有一个根节点,所有其他节点都是该根节点的后继。该树除了根节点之外的每一个节点都有且只有一个父节点,而根节点没有父节点。
diff --git "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md"
index 68d30e3f85..2c2fdc432c 100644
--- "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md"
+++ "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md"
@@ -9,7 +9,7 @@
## 700.二叉搜索树中的搜索
-题目地址:https://leetcode-cn.com/problems/search-in-a-binary-search-tree/
+[力扣题目地址](https://leetcode-cn.com/problems/search-in-a-binary-search-tree/)
给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。
@@ -23,7 +23,7 @@
之前我们讲了都是普通二叉树,那么接下来看看二叉搜索树。
-在[关于二叉树,你该了解这些!](https://mp.weixin.qq.com/s/_ymfWYvTNd2GvWvC5HOE4A)中,我们已经讲过了二叉搜索树。
+在[关于二叉树,你该了解这些!](https://programmercarl.com/二叉树理论基础.html)中,我们已经讲过了二叉搜索树。
二叉搜索树是一个有序树:
@@ -73,7 +73,7 @@ return NULL;
这里可能会疑惑,在递归遍历的时候,什么时候直接return 递归函数的返回值,什么时候不用加这个 return呢。
-我们在[二叉树:递归函数究竟什么时候需要返回值,什么时候不要返回值?](https://mp.weixin.qq.com/s/6TWAVjxQ34kVqROWgcRFOg)中讲了,如果要搜索一条边,递归函数就要加返回值,这里也是一样的道理。
+我们在[二叉树:递归函数究竟什么时候需要返回值,什么时候不要返回值?](https://programmercarl.com/0112.路径总和.html)中讲了,如果要搜索一条边,递归函数就要加返回值,这里也是一样的道理。
**因为搜索到目标节点了,就要立即return了,这样才是找到节点就返回(搜索某一条边),如果不加return,就是遍历整棵树了。**
@@ -327,7 +327,7 @@ var searchBST = function (root, val) {
return searchBST(root.right, val);
return null;
};
-```
+```
> 迭代
diff --git "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md" "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md"
index fdaba43ed1..c245ddcf78 100644
--- "a/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md"
+++ "b/problems/0701.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\217\222\345\205\245\346\223\215\344\275\234.md"
@@ -9,7 +9,7 @@
## 701.二叉搜索树中的插入操作
-链接:https://leetcode-cn.com/problems/insert-into-a-binary-search-tree/
+[力扣题目链接](https://leetcode-cn.com/problems/insert-into-a-binary-search-tree/)
给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据保证,新值和原始二叉搜索树中的任意节点值都不同。
@@ -164,11 +164,11 @@ public:
## 迭代
-再来看看迭代法,对二叉搜索树迭代写法不熟悉,可以看这篇:[二叉树:二叉搜索树登场!](https://mp.weixin.qq.com/s/vsKrWRlETxCVsiRr8v_hHg)
+再来看看迭代法,对二叉搜索树迭代写法不熟悉,可以看这篇:[二叉树:二叉搜索树登场!](https://programmercarl.com/0700.二叉搜索树中的搜索.html)
在迭代法遍历的过程中,需要记录一下当前遍历的节点的父节点,这样才能做插入节点的操作。
-在[二叉树:搜索树的最小绝对差](https://mp.weixin.qq.com/s/Hwzml6698uP3qQCC1ctUQQ)和[二叉树:我的众数是多少?](https://mp.weixin.qq.com/s/KSAr6OVQIMC-uZ8MEAnGHg)中,都是用了记录pre和cur两个指针的技巧,本题也是一样的。
+在[二叉树:搜索树的最小绝对差](https://programmercarl.com/0530.二叉搜索树的最小绝对差.html)和[二叉树:我的众数是多少?](https://programmercarl.com/0501.二叉搜索树中的众数.html)中,都是用了记录pre和cur两个指针的技巧,本题也是一样的。
代码如下:
diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md"
index 2efbd7c471..e576443ea4 100644
--- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md"
+++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md"
@@ -9,7 +9,7 @@
## 704. 二分查找
-题目链接:https://leetcode-cn.com/problems/binary-search/
+[力扣题目链接](https://leetcode-cn.com/problems/binary-search/)
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
@@ -139,7 +139,7 @@ public:
## 相关题目推荐
-* [35.搜索插入位置](./0035.搜索插入位置.md)
+* [35.搜索插入位置](https://programmercarl.com/0035.搜索插入位置.html)
* 34.在排序数组中查找元素的第一个和最后一个位置
* 69.x 的平方根
* 367.有效的完全平方数
diff --git "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md" "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md"
index 10a3e948fb..e05165a932 100644
--- "a/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md"
+++ "b/problems/0707.\350\256\276\350\256\241\351\223\276\350\241\250.md"
@@ -11,7 +11,7 @@
# 707.设计链表
-https://leetcode-cn.com/problems/design-linked-list/
+[力扣题目链接](https://leetcode-cn.com/problems/design-linked-list/)
题意:
@@ -28,9 +28,9 @@ https://leetcode-cn.com/problems/design-linked-list/
# 思路
-如果对链表的基础知识还不太懂,可以看这篇文章:[关于链表,你该了解这些!](https://mp.weixin.qq.com/s/fDGMmLrW7ZHlzkzlf_dZkw)
+如果对链表的基础知识还不太懂,可以看这篇文章:[关于链表,你该了解这些!](https://programmercarl.com/链表理论基础.html)
-如果对链表的虚拟头结点不清楚,可以看这篇文章:[链表:听说用虚拟头节点会方便很多?](https://mp.weixin.qq.com/s/L5aanfALdLEwVWGvyXPDqA)
+如果对链表的虚拟头结点不清楚,可以看这篇文章:[链表:听说用虚拟头节点会方便很多?](https://programmercarl.com/0203.移除链表元素.html)
删除链表节点:

diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md"
index b0a64bd226..4ac4684eb3 100644
--- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md"
+++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.md"
@@ -9,7 +9,7 @@
## 714. 买卖股票的最佳时机含手续费
-题目链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/
+[力扣题目链接](https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/)
给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;非负整数 fee 代表了交易股票的手续费用。
@@ -37,11 +37,11 @@
## 思路
-本题相对于[贪心算法:122.买卖股票的最佳时机II](https://mp.weixin.qq.com/s/VsTFA6U96l18Wntjcg3fcg),多添加了一个条件就是手续费。
+本题相对于[贪心算法:122.买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II.html),多添加了一个条件就是手续费。
## 贪心算法
-在[贪心算法:122.买卖股票的最佳时机II](https://mp.weixin.qq.com/s/VsTFA6U96l18Wntjcg3fcg)中使用贪心策略不用关心具体什么时候买卖,只要收集每天的正利润,最后稳稳的就是最大利润了。
+在[贪心算法:122.买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II.html)中使用贪心策略不用关心具体什么时候买卖,只要收集每天的正利润,最后稳稳的就是最大利润了。
而本题有了手续费,就要关系什么时候买卖了,因为计算所获得利润,需要考虑买卖利润可能不足以手续费的情况。
@@ -97,7 +97,7 @@ public:
我在公众号「代码随想录」里将在下一个系列详细讲解动态规划,所以本题解先给出我的C++代码(带详细注释),感兴趣的同学可以自己先学习一下。
-相对于[贪心算法:122.买卖股票的最佳时机II](https://mp.weixin.qq.com/s/VsTFA6U96l18Wntjcg3fcg)的动态规划解法中,只需要在计算卖出操作的时候减去手续费就可以了,代码几乎是一样的。
+相对于[贪心算法:122.买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II.html)的动态规划解法中,只需要在计算卖出操作的时候减去手续费就可以了,代码几乎是一样的。
C++代码如下:
diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md"
index 53952a7fcf..50db8868cd 100644
--- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md"
+++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md"
@@ -8,7 +8,7 @@
## 714.买卖股票的最佳时机含手续费
-题目链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/
+[力扣题目链接](https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/)
给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;非负整数 fee 代表了交易股票的手续费用。
@@ -36,7 +36,7 @@
## 思路
-在讲解贪心专题的时候,我们已经讲过本题了[贪心算法:买卖股票的最佳时机含手续费](https://mp.weixin.qq.com/s/olWrUuDEYw2Jx5rMeG7XAg)
+在讲解贪心专题的时候,我们已经讲过本题了[贪心算法:买卖股票的最佳时机含手续费](https://programmercarl.com/0714.买卖股票的最佳时机含手续费.html)
使用贪心算法,的性能是:
* 时间复杂度:O(n)
@@ -44,7 +44,7 @@
那么我们再来看看是使用动规的方法如何解题。
-相对于[动态规划:122.买卖股票的最佳时机II](https://mp.weixin.qq.com/s/d4TRWFuhaY83HPa6t5ZL-w),本题只需要在计算卖出操作的时候减去手续费就可以了,代码几乎是一样的。
+相对于[动态规划:122.买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II.html),本题只需要在计算卖出操作的时候减去手续费就可以了,代码几乎是一样的。
唯一差别在于递推公式部分,所以本篇也就不按照动规五部曲详细讲解了,主要讲解一下递推公式部分。
@@ -68,7 +68,7 @@ dp[i][1] 表示第i天不持有股票所得最多现金
所以:dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i] - fee);
-**本题和[动态规划:122.买卖股票的最佳时机II](https://mp.weixin.qq.com/s/d4TRWFuhaY83HPa6t5ZL-w)的区别就是这里需要多一个减去手续费的操作**。
+**本题和[动态规划:122.买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II.html)的区别就是这里需要多一个减去手续费的操作**。
以上分析完毕,C++代码如下:
diff --git "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md" "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md"
index 2fe38f0a37..9e3da6635d 100644
--- "a/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md"
+++ "b/problems/0718.\346\234\200\351\225\277\351\207\215\345\244\215\345\255\220\346\225\260\347\273\204.md"
@@ -8,7 +8,7 @@
## 718. 最长重复子数组
-题目链接:https://leetcode-cn.com/problems/maximum-length-of-repeated-subarray/
+[力扣题目链接](https://leetcode-cn.com/problems/maximum-length-of-repeated-subarray/)
给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。
diff --git "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md" "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md"
index 82f7f3ae83..f63a05b88e 100644
--- "a/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md"
+++ "b/problems/0738.\345\215\225\350\260\203\351\200\222\345\242\236\347\232\204\346\225\260\345\255\227.md"
@@ -8,7 +8,7 @@
## 738.单调递增的数字
-题目链接: https://leetcode-cn.com/problems/monotone-increasing-digits/
+[力扣题目链接](https://leetcode-cn.com/problems/monotone-increasing-digits/)
给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。
diff --git "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md" "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md"
index ddcbe428f3..b00701edc4 100644
--- "a/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md"
+++ "b/problems/0739.\346\257\217\346\227\245\346\270\251\345\272\246.md"
@@ -9,8 +9,7 @@
# 739. 每日温度
-
-https://leetcode-cn.com/problems/daily-temperatures/
+[力扣题目链接](https://leetcode-cn.com/problems/daily-temperatures/)
请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。
diff --git "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md" "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md"
index 9b691c5f7f..eb2a437a6c 100644
--- "a/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md"
+++ "b/problems/0746.\344\275\277\347\224\250\346\234\200\345\260\217\350\212\261\350\264\271\347\210\254\346\245\274\346\242\257.md"
@@ -8,7 +8,7 @@
## 746. 使用最小花费爬楼梯
-题目链接:https://leetcode-cn.com/problems/min-cost-climbing-stairs/
+[力扣题目链接](https://leetcode-cn.com/problems/min-cost-climbing-stairs/)
数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始)。
@@ -34,7 +34,7 @@
## 思路
-这道题目可以说是昨天[动态规划:爬楼梯](https://mp.weixin.qq.com/s/Ohop0jApSII9xxOMiFhGIw)的花费版本。
+这道题目可以说是昨天[动态规划:爬楼梯](https://programmercarl.com/0070.爬楼梯.html)的花费版本。
**注意题目描述:每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应的体力值,你就可以选择向上爬一个阶梯或者爬两个阶梯**
@@ -185,9 +185,9 @@ public:
# 总结
-大家可以发现这道题目相对于 昨天的[动态规划:爬楼梯](https://mp.weixin.qq.com/s/Ohop0jApSII9xxOMiFhGIw)有难了一点,但整体思路是一样。
+大家可以发现这道题目相对于 昨天的[动态规划:爬楼梯](https://programmercarl.com/0070.爬楼梯.html)有难了一点,但整体思路是一样。
-从[动态规划:斐波那契数](https://mp.weixin.qq.com/s/ko0zLJplF7n_4TysnPOa_w)到 [动态规划:爬楼梯](https://mp.weixin.qq.com/s/Ohop0jApSII9xxOMiFhGIw)再到今天这道题目,录友们感受到循序渐进的梯度了嘛。
+从[动态规划:斐波那契数](https://programmercarl.com/0509.斐波那契数.html)到 [动态规划:爬楼梯](https://programmercarl.com/0070.爬楼梯.html)再到今天这道题目,录友们感受到循序渐进的梯度了嘛。
每个系列开始的时候,都有录友和我反馈说题目太简单了,赶紧上难度,但也有录友和我说有点难了,快跟不上了。
diff --git "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md" "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md"
index ccf654d47a..43c663c295 100644
--- "a/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md"
+++ "b/problems/0763.\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264.md"
@@ -9,7 +9,7 @@
## 763.划分字母区间
-题目链接: https://leetcode-cn.com/problems/partition-labels/
+[力扣题目链接](https://leetcode-cn.com/problems/partition-labels/)
字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。
@@ -20,7 +20,7 @@
划分结果为 "ababcbaca", "defegde", "hijhklij"。
每个字母最多出现在一个片段中。
像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。
-
+
提示:
* S的长度在[1, 500]之间。
diff --git "a/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md" "b/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md"
index bd7c99c9a7..4a0185ec41 100644
--- "a/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md"
+++ "b/problems/0841.\351\222\245\345\214\231\345\222\214\346\210\277\351\227\264.md"
@@ -10,7 +10,7 @@
# 841.钥匙和房间
-题目地址:https://leetcode-cn.com/problems/keys-and-rooms/
+[力扣题目链接](https://leetcode-cn.com/problems/keys-and-rooms/)
有 N 个房间,开始时你位于 0 号房间。每个房间有不同的号码:0,1,2,...,N-1,并且房间里可能有一些钥匙能使你进入下一个房间。
diff --git "a/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md" "b/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md"
index 32232c4ab2..e6bf349359 100644
--- "a/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md"
+++ "b/problems/0844.\346\257\224\350\276\203\345\220\253\351\200\200\346\240\274\347\232\204\345\255\227\347\254\246\344\270\262.md"
@@ -9,7 +9,7 @@
# 844.比较含退格的字符串
-题目链接:https://leetcode-cn.com/problems/backspace-string-compare/
+[力扣题目链接](https://leetcode-cn.com/problems/backspace-string-compare/)
给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果。 # 代表退格字符。
@@ -42,7 +42,7 @@
## 普通方法(使用栈的思路)
-这道题目一看就是要使用栈的节奏,这种匹配(消除)问题也是栈的擅长所在,跟着一起刷题的同学应该知道,在[栈与队列:匹配问题都是栈的强项](https://mp.weixin.qq.com/s/1-x6r1wGA9mqIHW5LrMvBg),我就已经提过了一次使用栈来做类似的事情了。
+这道题目一看就是要使用栈的节奏,这种匹配(消除)问题也是栈的擅长所在,跟着一起刷题的同学应该知道,在[栈与队列:匹配问题都是栈的强项](https://programmercarl.com/1047.删除字符串中的所有相邻重复项.html),我就已经提过了一次使用栈来做类似的事情了。
**那么本题,确实可以使用栈的思路,但是没有必要使用栈,因为最后比较的时候还要比较栈里的元素,有点麻烦**。
diff --git "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md" "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md"
index 792bee9a01..46e054199d 100644
--- "a/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md"
+++ "b/problems/0860.\346\237\240\346\252\254\346\260\264\346\211\276\351\233\266.md"
@@ -9,7 +9,7 @@
## 860.柠檬水找零
-题目链接:https://leetcode-cn.com/problems/lemonade-change/
+[力扣题目链接](https://leetcode-cn.com/problems/lemonade-change/)
在柠檬水摊上,每一杯柠檬水的售价为 5 美元。
diff --git "a/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md" "b/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md"
index c851a8dfd1..3502f2fb70 100644
--- "a/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md"
+++ "b/problems/0925.\351\225\277\346\214\211\351\224\256\345\205\245.md"
@@ -8,7 +8,7 @@
欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!
# 925.长按键入
-题目链接:https://leetcode-cn.com/problems/long-pressed-name/
+[力扣题目链接](https://leetcode-cn.com/problems/long-pressed-name/)
你的朋友正在使用键盘输入他的名字 name。偶尔,在键入字符 c 时,按键可能会被长按,而字符可能被输入 1 次或多次。
diff --git "a/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md" "b/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md"
index 9834494903..ef5739e30c 100644
--- "a/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md"
+++ "b/problems/0941.\346\234\211\346\225\210\347\232\204\345\261\261\350\204\211\346\225\260\347\273\204.md"
@@ -9,7 +9,7 @@
# 941.有效的山脉数组
-题目链接:https://leetcode-cn.com/problems/valid-mountain-array/
+[力扣题目链接](https://leetcode-cn.com/problems/valid-mountain-array/)
给定一个整数数组 arr,如果它是有效的山脉数组就返回 true,否则返回 false。
@@ -71,7 +71,7 @@ public:
};
```
-如果想系统学一学双指针的话, 可以看一下这篇[双指针法:总结篇!](https://mp.weixin.qq.com/s/_p7grwjISfMh0U65uOyCjA)
+如果想系统学一学双指针的话, 可以看一下这篇[双指针法:总结篇!](https://programmercarl.com/双指针总结.html)
# 其他语言版本
diff --git "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md"
index 380ca8f86b..c715279a67 100644
--- "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md"
+++ "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md"
@@ -9,7 +9,7 @@
## 968.监控二叉树
-题目地址 : https://leetcode-cn.com/problems/binary-tree-cameras/
+[力扣题目链接](https://leetcode-cn.com/problems/binary-tree-cameras/)
给定一个二叉树,我们在树的节点上安装摄像头。
diff --git "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md"
index 71c4640198..131428531b 100644
--- "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md"
+++ "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md"
@@ -10,7 +10,7 @@
# 977.有序数组的平方
-https://leetcode-cn.com/problems/squares-of-a-sorted-array/
+[力扣题目链接](https://leetcode-cn.com/problems/squares-of-a-sorted-array/)
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
diff --git "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md"
index a789373b7c..391511853c 100644
--- "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md"
+++ "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md"
@@ -10,7 +10,7 @@
# 1002. 查找常用字符
-https://leetcode-cn.com/problems/find-common-characters/
+[力扣题目链接](https://leetcode-cn.com/problems/find-common-characters/)
给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。
@@ -23,7 +23,7 @@ https://leetcode-cn.com/problems/find-common-characters/
【示例二】
输入:["cool","lock","cook"]
输出:["c","o"]
-
+
# 思路
@@ -40,9 +40,9 @@ https://leetcode-cn.com/problems/find-common-characters/
可以看出这是指数级别的时间复杂度,非常高,而且代码实现也不容易,因为要统计 重复的字符,还要适当的替换或者去重。
-那我们还是哈希法吧。如果对哈希法不了解,可以看这篇:[关于哈希表,你该了解这些!](https://mp.weixin.qq.com/s/RSUANESA_tkhKhYe3ZR8Jg)。
+那我们还是哈希法吧。如果对哈希法不了解,可以看这篇:[关于哈希表,你该了解这些!](https://programmercarl.com/哈希表理论基础.html)。
-如果对用数组来做哈希法不了解的话,可以看这篇:[把数组当做哈希表来用,很巧妙!](https://mp.weixin.qq.com/s/ffS8jaVFNUWyfn_8T31IdA)。
+如果对用数组来做哈希法不了解的话,可以看这篇:[把数组当做哈希表来用,很巧妙!](https://programmercarl.com/0242.有效的字母异位词.html)。
了解了哈希法,理解了数组在哈希法中的应用之后,可以来看解题思路了。
@@ -233,41 +233,7 @@ var commonChars = function (words) {
return res
};
```
-GO
-```golang
-func commonChars(words []string) []string {
- length:=len(words)
- fre:=make([][]int,0)//统计每个字符串的词频
- res:=make([]string,0)
- //统计词频
- for i:=0;ib{
- return b
- }
- return a
-}
-```
+
-----------------------
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
* B站视频:[代码随想录](https://space.bilibili.com/525438321)
diff --git "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md"
index a689fbf7d5..8bdd0f4111 100644
--- "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md"
+++ "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md"
@@ -9,7 +9,7 @@
## 1005.K次取反后最大化的数组和
-题目地址:https://leetcode-cn.com/problems/maximize-sum-of-array-after-k-negations/
+[力扣题目链接](https://leetcode-cn.com/problems/maximize-sum-of-array-after-k-negations/)
给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。(我们可以多次选择同一个索引 i。)
diff --git "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md" "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md"
index 3172cfc719..b71a519902 100644
--- "a/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md"
+++ "b/problems/1035.\344\270\215\347\233\270\344\272\244\347\232\204\347\272\277.md"
@@ -8,7 +8,7 @@
## 1035.不相交的线
-题目链接: https://leetcode-cn.com/problems/uncrossed-lines/
+[力扣题目链接](https://leetcode-cn.com/problems/uncrossed-lines/)
我们在两条独立的水平线上按给定的顺序写下 A 和 B 中的整数。
@@ -35,13 +35,13 @@
这么分析完之后,大家可以发现:**本题说是求绘制的最大连线数,其实就是求两个字符串的最长公共子序列的长度!**
-那么本题就和我们刚刚讲过的这道题目[动态规划:1143.最长公共子序列](https://mp.weixin.qq.com/s/Qq0q4HaE4TyasCTj2WGFOg)就是一样一样的了。
+那么本题就和我们刚刚讲过的这道题目[动态规划:1143.最长公共子序列](https://programmercarl.com/1143.最长公共子序列.html)就是一样一样的了。
一样到什么程度呢? 把字符串名字改一下,其他代码都不用改,直接copy过来就行了。
-其实本题就是求最长公共子序列的长度,介于我们刚刚讲过[动态规划:1143.最长公共子序列](https://mp.weixin.qq.com/s/Qq0q4HaE4TyasCTj2WGFOg),所以本题我就不再做动规五部曲分析了。
+其实本题就是求最长公共子序列的长度,介于我们刚刚讲过[动态规划:1143.最长公共子序列](https://programmercarl.com/1143.最长公共子序列.html),所以本题我就不再做动规五部曲分析了。
-如果大家有点遗忘了最长公共子序列,就再看一下这篇:[动态规划:1143.最长公共子序列](https://mp.weixin.qq.com/s/Qq0q4HaE4TyasCTj2WGFOg)
+如果大家有点遗忘了最长公共子序列,就再看一下这篇:[动态规划:1143.最长公共子序列](https://programmercarl.com/1143.最长公共子序列.html)
本题代码如下:
@@ -66,9 +66,9 @@ public:
## 总结
-看到代码大家也可以发现其实就是求两个字符串的最长公共子序列,但如果没有做过[1143.最长公共子序列](https://mp.weixin.qq.com/s/Qq0q4HaE4TyasCTj2WGFOg),本题其实还有很有难度的。
+看到代码大家也可以发现其实就是求两个字符串的最长公共子序列,但如果没有做过[1143.最长公共子序列](https://programmercarl.com/1143.最长公共子序列.html),本题其实还有很有难度的。
-这是Carl为什么要先讲[1143.最长公共子序列](https://mp.weixin.qq.com/s/Qq0q4HaE4TyasCTj2WGFOg)再讲本题,大家会发现一个正确的刷题顺序对算法学习是非常重要的!
+这是Carl为什么要先讲[1143.最长公共子序列](https://programmercarl.com/1143.最长公共子序列.html)再讲本题,大家会发现一个正确的刷题顺序对算法学习是非常重要的!
这也是Carl做了很多题目(包括ACM和力扣)才总结出来的规律,大家仔细体会一下哈。
diff --git "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md"
index b60a8d1d9f..52d2bc95c0 100644
--- "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md"
+++ "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md"
@@ -13,7 +13,7 @@
# 1047. 删除字符串中的所有相邻重复项
-https://leetcode-cn.com/problems/remove-all-adjacent-duplicates-in-string/
+[力扣题目链接](https://leetcode-cn.com/problems/remove-all-adjacent-duplicates-in-string/)
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
@@ -26,7 +26,7 @@ https://leetcode-cn.com/problems/remove-all-adjacent-duplicates-in-string/
* 输入:"abbaca"
* 输出:"ca"
* 解释:例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。
-
+
提示:
* 1 <= S.length <= 20000
@@ -197,38 +197,15 @@ class Solution {
Python:
```python3
-# 方法一,使用栈,推荐!
-class Solution:
- def removeDuplicates(self, s: str) -> str:
- res = list()
- for item in s:
- if res and res[-1] == item:
- res.pop()
- else:
- res.append(item)
- return "".join(res) # 字符串拼接
-```
-
-```python3
-# 方法二,使用双指针模拟栈,如果不让用栈可以作为备选方法。
class Solution:
def removeDuplicates(self, s: str) -> str:
- res = list(s)
- slow = fast = 0
- length = len(res)
-
- while fast < length:
- # 如果一样直接换,不一样会把后面的填在slow的位置
- res[slow] = res[fast]
-
- # 如果发现和前一个一样,就退一格指针
- if slow > 0 and res[slow] == res[slow - 1]:
- slow -= 1
+ t = list()
+ for i in s:
+ if t and t[-1] == i:
+ t.pop(-1)
else:
- slow += 1
- fast += 1
-
- return ''.join(res[0: slow])
+ t.append(i)
+ return "".join(t) # 字符串拼接
```
Go:
diff --git "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md" "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md"
index 7b71eae449..25299f1433 100644
--- "a/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md"
+++ "b/problems/1049.\346\234\200\345\220\216\344\270\200\345\235\227\347\237\263\345\244\264\347\232\204\351\207\215\351\207\217II.md"
@@ -9,7 +9,7 @@
## 1049. 最后一块石头的重量 II
-题目链接:https://leetcode-cn.com/problems/last-stone-weight-ii/
+[力扣题目链接](https://leetcode-cn.com/problems/last-stone-weight-ii/)
题目难度:中等
@@ -29,7 +29,7 @@
组合 7 和 8,得到 1,所以数组转化为 [2,1,1,1],
组合 2 和 1,得到 1,所以数组转化为 [1,1,1],
组合 1 和 1,得到 0,所以数组转化为 [1],这就是最优值。
-
+
提示:
* 1 <= stones.length <= 30
@@ -39,12 +39,12 @@
如果对背包问题不都熟悉先看这两篇:
-* [动态规划:关于01背包问题,你该了解这些!](https://mp.weixin.qq.com/s/FwIiPPmR18_AJO5eiidT6w)
-* [动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://mp.weixin.qq.com/s/M4uHxNVKRKm5HPjkNZBnFA)
+* [动态规划:关于01背包问题,你该了解这些!](https://programmercarl.com/背包理论基础01背包-1.html)
+* [动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html)
本题其实就是尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,**这样就化解成01背包问题了**。
-是不是感觉和昨天讲解的[416. 分割等和子集](https://mp.weixin.qq.com/s/sYw3QtPPQ5HMZCJcT4EaLQ)非常像了。
+是不是感觉和昨天讲解的[416. 分割等和子集](https://programmercarl.com/0416.分割等和子集.html)非常像了。
本题物品的重量为store[i],物品的价值也为store[i]。
@@ -89,7 +89,7 @@ vector dp(15001, 0);
4. 确定遍历顺序
-在[动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://mp.weixin.qq.com/s/M4uHxNVKRKm5HPjkNZBnFA)中就已经说明:如果使用一维dp数组,物品遍历的for循环放在外层,遍历背包的for循环放在内层,且内层for循环倒叙遍历!
+在[动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html)中就已经说明:如果使用一维dp数组,物品遍历的for循环放在外层,遍历背包的for循环放在内层,且内层for循环倒叙遍历!
代码如下:
@@ -143,9 +143,9 @@ public:
## 总结
-本题其实和[416. 分割等和子集](https://mp.weixin.qq.com/s/sYw3QtPPQ5HMZCJcT4EaLQ)几乎是一样的,只是最后对dp[target]的处理方式不同。
+本题其实和[416. 分割等和子集](https://programmercarl.com/0416.分割等和子集.html)几乎是一样的,只是最后对dp[target]的处理方式不同。
-[416. 分割等和子集](https://mp.weixin.qq.com/s/sYw3QtPPQ5HMZCJcT4EaLQ)相当于是求背包是否正好装满,而本题是求背包最多能装多少。
+[416. 分割等和子集](https://programmercarl.com/0416.分割等和子集.html)相当于是求背包是否正好装满,而本题是求背包最多能装多少。
diff --git "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md" "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md"
index c0468d087f..b3b5e6c0d2 100644
--- "a/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md"
+++ "b/problems/1143.\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227.md"
@@ -8,7 +8,7 @@
## 1143.最长公共子序列
-题目链接: https://leetcode-cn.com/problems/longest-common-subsequence/
+[力扣题目链接](https://leetcode-cn.com/problems/longest-common-subsequence/)
给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。
@@ -41,7 +41,7 @@
## 思路
-本题和[动态规划:718. 最长重复子数组](https://mp.weixin.qq.com/s/U5WaWqBwdoxzQDotOdWqZg)区别在于这里不要求是连续的了,但要有相对顺序,即:"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。
+本题和[动态规划:718. 最长重复子数组](https://programmercarl.com/0718.最长重复子数组.html)区别在于这里不要求是连续的了,但要有相对顺序,即:"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。
继续动规五部曲分析如下:
diff --git "a/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md" "b/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md"
index 1c09ee8ad9..027c9f5a7f 100644
--- "a/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md"
+++ "b/problems/1207.\347\213\254\344\270\200\346\227\240\344\272\214\347\232\204\345\207\272\347\216\260\346\254\241\346\225\260.md"
@@ -8,7 +8,7 @@
# 1207.独一无二的出现次数
-链接:https://leetcode-cn.com/problems/unique-number-of-occurrences/
+[力扣题目链接](https://leetcode-cn.com/problems/unique-number-of-occurrences/)
给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。
@@ -35,9 +35,9 @@
# 思路
-这道题目数组在是哈希法中的经典应用,如果对数组在哈希法中的使用还不熟悉的同学可以看这两篇:[数组在哈希法中的应用](https://mp.weixin.qq.com/s/ffS8jaVFNUWyfn_8T31IdA)和[哈希法:383. 赎金信](https://mp.weixin.qq.com/s/qAXqv--UERmiJNNpuphOUQ)
+这道题目数组在是哈希法中的经典应用,如果对数组在哈希法中的使用还不熟悉的同学可以看这两篇:[数组在哈希法中的应用](https://programmercarl.com/0242.有效的字母异位词.html)和[哈希法:383. 赎金信](https://programmercarl.com/0383.赎金信.html)
-进而可以学习一下[set在哈希法中的应用](https://mp.weixin.qq.com/s/aMSA5zrp3jJcLjuSB0Es2Q),以及[map在哈希法中的应用](https://mp.weixin.qq.com/s/vaMsLnH-f7_9nEK4Cuu3KQ)
+进而可以学习一下[set在哈希法中的应用](https://programmercarl.com/0349.两个数组的交集.html),以及[map在哈希法中的应用](https://programmercarl.com/0001.两数之和.html)
回归本题,**本题强调了-1000 <= arr[i] <= 1000**,那么就可以用数组来做哈希,arr[i]作为哈希表(数组)的下标,那么arr[i]可以是负数,怎么办?负数不能做数组下标。
diff --git "a/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" "b/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md"
index 300aa0e256..3dc512fb01 100644
--- "a/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md"
+++ "b/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md"
@@ -9,7 +9,7 @@
# 1365.有多少小于当前数字的数字
-题目链接:https://leetcode-cn.com/problems/sort-integers-by-the-number-of-1-bits/
+[力扣题目链接](https://leetcode-cn.com/problems/sort-integers-by-the-number-of-1-bits/)
给你一个数组 nums,对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目。
diff --git "a/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md" "b/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md"
index 156efea66f..5cf6b2d850 100644
--- "a/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md"
+++ "b/problems/1365.\346\234\211\345\244\232\345\260\221\345\260\217\344\272\216\345\275\223\345\211\215\346\225\260\345\255\227\347\232\204\346\225\260\345\255\227.md"
@@ -10,14 +10,14 @@
# 1365.有多少小于当前数字的数字
-题目链接:https://leetcode-cn.com/problems/how-many-numbers-are-smaller-than-the-current-number/
+[力扣题目链接](https://leetcode-cn.com/problems/how-many-numbers-are-smaller-than-the-current-number/)
给你一个数组 nums,对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目。
换而言之,对于每个 nums[i] 你必须计算出有效的 j 的数量,其中 j 满足 j != i 且 nums[j] < nums[i] 。
以数组形式返回答案。
-
+
示例 1:
* 输入:nums = [8,1,2,2,3]
@@ -36,7 +36,7 @@
示例 3:
* 输入:nums = [7,7,7,7]
* 输出:[0,0,0,0]
-
+
提示:
* 2 <= nums.length <= 500
* 0 <= nums[i] <= 100
diff --git "a/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md" "b/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md"
index 758d5ad809..bce58c336a 100644
--- "a/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md"
+++ "b/problems/1382.\345\260\206\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\345\217\230\345\271\263\350\241\241.md"
@@ -9,7 +9,7 @@
# 1382.将二叉搜索树变平衡
-题目地址:https://leetcode-cn.com/problems/balance-a-binary-search-tree/
+[力扣题目链接](https://leetcode-cn.com/problems/balance-a-binary-search-tree/)
给你一棵二叉搜索树,请你返回一棵 平衡后 的二叉搜索树,新生成的树应该与原来的树有着相同的节点值。
@@ -35,8 +35,8 @@
这道题目,可以中序遍历把二叉树转变为有序数组,然后在根据有序数组构造平衡二叉搜索树。
建议做这道题之前,先看如下两篇题解:
-* [98.验证二叉搜索树](https://mp.weixin.qq.com/s/8odY9iUX5eSi0eRFSXFD4Q) 学习二叉搜索树的特性
-* [108.将有序数组转换为二叉搜索树](https://mp.weixin.qq.com/s/sy3ygnouaZVJs8lhFgl9mw) 学习如何通过有序数组构造二叉搜索树
+* [98.验证二叉搜索树](https://programmercarl.com/0098.验证二叉搜索树.html) 学习二叉搜索树的特性
+* [108.将有序数组转换为二叉搜索树](https://programmercarl.com/0108.将有序数组转换为二叉搜索树.html) 学习如何通过有序数组构造二叉搜索树
这两道题目做过之后,本题分分钟就可以做出来了。
From 21e4c0e93e11f7a2614a4dfbe4af8c201a3f03b6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9E=81=E5=AE=A2=E5=AD=A6=E4=BC=9F?=
Date: Tue, 24 Aug 2021 13:28:37 +0800
Subject: [PATCH 0071/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20142.=E7=8E=AF?=
=?UTF-8?q?=E5=BD=A2=E9=93=BE=E8=A1=A8II=20Swift=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...\345\275\242\351\223\276\350\241\250II.md" | 33 +++++++++++++++++++
1 file changed, 33 insertions(+)
diff --git "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md" "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md"
index 91e14e27a4..4a3f36b0fd 100644
--- "a/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md"
+++ "b/problems/0142.\347\216\257\345\275\242\351\223\276\350\241\250II.md"
@@ -296,6 +296,39 @@ var detectCycle = function(head) {
};
```
+Swift:
+```swift
+class Solution {
+ func detectCycle(_ head: ListNode?) -> ListNode? {
+ var slow: ListNode? = head
+ var fast: ListNode? = head
+ while fast != nil && fast?.next != nil {
+ slow = slow?.next
+ fast = fast?.next?.next
+ if slow == fast {
+ // 环内相遇
+ var list1: ListNode? = slow
+ var list2: ListNode? = head
+ while list1 != list2 {
+ list1 = list1?.next
+ list2 = list2?.next
+ }
+ return list2
+ }
+ }
+ return nil
+ }
+}
+extension ListNode: Equatable {
+ public func hash(into hasher: inout Hasher) {
+ hasher.combine(val)
+ hasher.combine(ObjectIdentifier(self))
+ }
+ public static func == (lhs: ListNode, rhs: ListNode) -> Bool {
+ return lhs === rhs
+ }
+}
+```
-----------------------
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
From 0ab400b0fc8c7864230c32d6f27b2efd8dc5c108 Mon Sep 17 00:00:00 2001
From: ironartisan
Date: Tue, 24 Aug 2021 14:43:28 +0800
Subject: [PATCH 0072/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0131.=E5=88=86?=
=?UTF-8?q?=E5=89=B2=E5=9B=9E=E6=96=87=E4=B8=B2python3=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...62\345\233\236\346\226\207\344\270\262.md" | 34 +++++++++++++++++--
1 file changed, 32 insertions(+), 2 deletions(-)
diff --git "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md" "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md"
index 6fe2758be0..afb8cbb74f 100644
--- "a/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md"
+++ "b/problems/0131.\345\210\206\345\211\262\345\233\236\346\226\207\344\270\262.md"
@@ -292,7 +292,8 @@ class Solution {
```
Python:
-```py
+```python
+# 版本一
class Solution:
def partition(self, s: str) -> List[List[str]]:
res = []
@@ -310,7 +311,36 @@ class Solution:
return res
```
-
+```python
+# 版本二
+class Solution:
+ def partition(self, s: str) -> List[List[str]]:
+ res = []
+ path = [] #放已经回文的子串
+ # 双指针法判断是否是回文串
+ def isPalindrome(s):
+ n = len(s)
+ i, j = 0, n - 1
+ while i < j:
+ if s[i] != s[j]:return False
+ i += 1
+ j -= 1
+ return True
+
+ def backtrack(s, startIndex):
+ if startIndex >= len(s): # 如果起始位置已经大于s的大小,说明已经找到了一组分割方案了
+ res.append(path[:])
+ return
+ for i in range(startIndex, len(s)):
+ p = s[startIndex:i+1] # 获取[startIndex,i+1]在s中的子串
+ if isPalindrome(p): # 是回文子串
+ path.append(p)
+ else: continue #不是回文,跳过
+ backtrack(s, i + 1)
+ path.pop() #回溯过程,弹出本次已经填在path的子串
+ backtrack(s, 0)
+ return res
+```
Go:
> 注意切片(go切片是披着值类型外衣的引用类型)
From b57023340989dd6070628ba09766e4ea6b305f59 Mon Sep 17 00:00:00 2001
From: ironartisan
Date: Tue, 24 Aug 2021 15:41:42 +0800
Subject: [PATCH 0073/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A00093.=E5=A4=8D?=
=?UTF-8?q?=E5=8E=9FIP=E5=9C=B0=E5=9D=80python3=E7=89=88=E6=9C=AC=EF=BC=8C?=
=?UTF-8?q?=E6=80=9D=E8=B7=AF=E6=B8=85=E6=99=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...\345\216\237IP\345\234\260\345\235\200.md" | 29 ++++++++++++++++++-
1 file changed, 28 insertions(+), 1 deletion(-)
diff --git "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md"
index 9a95af22ca..1d39df7531 100644
--- "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md"
+++ "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md"
@@ -309,7 +309,34 @@ class Solution {
```
python版本:
-
+```python
+class Solution:
+ def restoreIpAddresses(self, s: str) -> List[str]:
+ res = []
+ path = [] # 存放分割后的字符
+ # 判断数组中的数字是否合法
+ def isValid(p):
+ if p == '0': return True # 解决"0000"
+ if p[0] == '0': return False
+ if int(p) > 0 and int(p) <256: return True
+ return False
+
+ def backtrack(s, startIndex):
+ if len(s) > 12: return # 字符串长度最大为12
+ if len(path) == 4 and startIndex == len(s): # 确保切割完,且切割后的长度为4
+ res.append(".".join(path[:])) # 字符拼接
+ return
+
+ for i in range(startIndex, len(s)):
+ p = s[startIndex:i+1] # 分割字符
+ if isValid(p): # 判断字符是否有效
+ path.append(p)
+ else: continue
+ backtrack(s, i + 1) # 寻找i+1为起始位置的子串
+ path.pop()
+ backtrack(s, 0)
+ return res
+```
```python
class Solution(object):
def restoreIpAddresses(self, s):
From 80dc27742439b6d1529c1aaefaad052dcdeab7b4 Mon Sep 17 00:00:00 2001
From: youngyangyang04 <826123027@qq.com>
Date: Tue, 24 Aug 2021 15:56:18 +0800
Subject: [PATCH 0074/3468] 20210824
---
README.md | 6 +
.../0052.N\347\232\207\345\220\216II.md" | 97 ++++++++++
...47\347\232\204\347\237\251\345\275\242.md" | 33 ++++
...11\346\220\234\347\264\242\346\240\221.md" | 40 ++--
...02\345\272\217\351\201\215\345\216\206.md" | 29 +++
...40\344\272\214\345\217\211\346\240\221.md" | 39 ++--
...54\344\272\214\345\217\211\346\240\221.md" | 2 +-
...36\347\216\260\351\230\237\345\210\227.md" | 47 -----
...53\345\206\267\345\206\273\346\234\237.md" | 4 +-
...\345\255\227\347\254\246\344\270\262II.md" | 2 +-
...66\344\272\214\345\217\211\346\240\221.md" | 23 +--
...47\344\272\214\345\217\211\346\240\221.md" | 41 ++--
...55\347\232\204\346\220\234\347\264\242.md" | 51 ++---
...60\347\233\256\346\216\222\345\272\217.md" | 177 +++++++-----------
...16\346\234\254\351\241\271\347\233\256.md" | 7 +
15 files changed, 331 insertions(+), 267 deletions(-)
create mode 100644 "problems/0052.N\347\232\207\345\220\216II.md"
create mode 100644 "problems/\345\205\266\344\273\226/\345\217\202\344\270\216\346\234\254\351\241\271\347\233\256.md"
diff --git a/README.md b/README.md
index 022a45e846..267d794e26 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,5 @@
👉 推荐 [在线阅读](http://programmercarl.com/) (Github在国内访问经常不稳定)
+👉 推荐 [Gitee同步](https://gitee.com/programmercarl/leetcode-master)
> 1. **介绍**:本项目是一套完整的刷题计划,旨在帮助大家少走弯路,循序渐进学算法,[关注作者](#关于作者)
> 2. **PDF版本** : [「代码随想录」算法精讲 PDF 版本](https://mp.weixin.qq.com/s/RsdcQ9umo09R6cfnwXZlrQ) 。
@@ -477,6 +478,11 @@
* [100.相同的树](./problems/0100.相同的树.md) 同101.对称二叉树 一个思路
* [116.填充每个节点的下一个右侧节点指针](./problems/0116.填充每个节点的下一个右侧节点指针.md)
+## 回溯算法
+
+* [52.N皇后II](./problems/0052.N皇后II.md)
+
+
## 贪心
* [649.Dota2参议院](./problems/0649.Dota2参议院.md) 有难度
diff --git "a/problems/0052.N\347\232\207\345\220\216II.md" "b/problems/0052.N\347\232\207\345\220\216II.md"
new file mode 100644
index 0000000000..81f5c7ea71
--- /dev/null
+++ "b/problems/0052.N\347\232\207\345\220\216II.md"
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!
+
+
+# 52. N皇后II
+
+题目链接:https://leetcode-cn.com/problems/n-queens-ii/
+
+n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
+
+上图为 8 皇后问题的一种解法。
+
+
+给定一个整数 n,返回 n 皇后不同的解决方案的数量。
+
+示例:
+
+输入: 4
+输出: 2
+解释: 4 皇后问题存在如下两个不同的解法。
+[
+ [".Q..", // 解法 1
+ "...Q",
+ "Q...",
+ "..Q."],
+
+ ["..Q.", // 解法 2
+ "Q...",
+ "...Q",
+ ".Q.."]
+]
+
+# 思路
+
+
+想看:[51.N皇后](https://mp.weixin.qq.com/s/lU_QwCMj6g60nh8m98GAWg) ,基本没有区别
+
+# C++代码
+
+```CPP
+class Solution {
+private:
+int count = 0;
+void backtracking(int n, int row, vector& chessboard) {
+ if (row == n) {
+ count++;
+ return;
+ }
+ for (int col = 0; col < n; col++) {
+ if (isValid(row, col, chessboard, n)) {
+ chessboard[row][col] = 'Q'; // 放置皇后
+ backtracking(n, row + 1, chessboard);
+ chessboard[row][col] = '.'; // 回溯
+ }
+ }
+}
+bool isValid(int row, int col, vector& chessboard, int n) {
+ int count = 0;
+ // 检查列
+ for (int i = 0; i < row; i++) { // 这是一个剪枝
+ if (chessboard[i][col] == 'Q') {
+ return false;
+ }
+ }
+ // 检查 45度角是否有皇后
+ for (int i = row - 1, j = col - 1; i >=0 && j >= 0; i--, j--) {
+ if (chessboard[i][j] == 'Q') {
+ return false;
+ }
+ }
+ // 检查 135度角是否有皇后
+ for(int i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) {
+ if (chessboard[i][j] == 'Q') {
+ return false;
+ }
+ }
+ return true;
+}
+
+public:
+ int totalNQueens(int n) {
+ std::vector chessboard(n, std::string(n, '.'));
+ backtracking(n, 0, chessboard);
+ return count;
+
+ }
+};
+```
+
+# 其他语言补充
+
diff --git "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md"
index 941888dba3..61910abf5d 100644
--- "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md"
+++ "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md"
@@ -195,6 +195,39 @@ public:
Java:
+动态规划
+```java
+class Solution {
+ public int largestRectangleArea(int[] heights) {
+ int length = heights.length;
+ int[] minLeftIndex = new int [length];
+ int[] maxRigthIndex = new int [length];
+ // 记录左边第一个小于该柱子的下标
+ minLeftIndex[0] = -1 ;
+ for (int i = 1; i < length; i++) {
+ int t = i - 1;
+ // 这里不是用if,而是不断向右寻找的过程
+ while (t >= 0 && heights[t] >= heights[i]) t = minLeftIndex[t];
+ minLeftIndex[i] = t;
+ }
+ // 记录每个柱子 右边第一个小于该柱子的下标
+ maxRigthIndex[length - 1] = length;
+ for (int i = length - 2; i >= 0; i--) {
+ int t = i + 1;
+ while(t < length && heights[t] >= heights[i]) t = maxRigthIndex[t];
+ maxRigthIndex[i] = t;
+ }
+ // 求和
+ int result = 0;
+ for (int i = 0; i < length; i++) {
+ int sum = heights[i] * (maxRigthIndex[i] - minLeftIndex[i] - 1);
+ result = Math.max(sum, result);
+ }
+ return result;
+ }
+}
+```
+
Python:
动态规划
diff --git "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md"
index 6f7e5c1465..9e31bfd6bb 100644
--- "a/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md"
+++ "b/problems/0098.\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md"
@@ -7,7 +7,7 @@
欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!
-## 98.验证二叉搜索树
+# 98.验证二叉搜索树
题目地址:https://leetcode-cn.com/problems/validate-binary-search-tree/
@@ -22,7 +22,7 @@

-## 思路
+# 思路
要知道中序遍历下,输出的二叉搜索树节点的数值是有序序列。
@@ -121,7 +121,7 @@ if (root->val > root->left->val && root->val < root->right->val) {
要定义一个longlong的全局变量,用来比较遍历的节点是否有序,因为后台测试数据中有int最小值,所以定义为longlong的类型,初始化为longlong最小值。
-注意递归函数要有bool类型的返回值, 我们在[二叉树:递归函数究竟什么时候需要返回值,什么时候不要返回值?](https://mp.weixin.qq.com/s/6TWAVjxQ34kVqROWgcRFOg) 中讲了,只有寻找某一条边(或者一个节点)的时候,递归函数会有bool类型的返回值。
+注意递归函数要有bool类型的返回值, 我们在[二叉树:递归函数究竟什么时候需要返回值,什么时候不要返回值?](https://mp.weixin.qq.com/s/EJr_nZ31TnvZmptBjkDGqA) 中讲了,只有寻找某一条边(或者一个节点)的时候,递归函数会有bool类型的返回值。
其实本题是同样的道理,我们在寻找一个不符合条件的节点,如果没有找到这个节点就遍历了整个树,如果找到不符合的节点了,立刻返回。
@@ -210,7 +210,8 @@ public:
## 迭代法
-可以用迭代法模拟二叉树中序遍历,对前中后序迭代法生疏的同学可以看这两篇[二叉树:听说递归能做的,栈也能做!](https://mp.weixin.qq.com/s/c_zCrGHIVlBjUH_hJtghCg),[二叉树:前中后序迭代方式统一写法](https://mp.weixin.qq.com/s/WKg0Ty1_3SZkztpHubZPRg)
+
+可以用迭代法模拟二叉树中序遍历,对前中后序迭代法生疏的同学可以看这两篇[二叉树:听说递归能做的,栈也能做!](https://mp.weixin.qq.com/s/OH7aCVJ5-Gi32PkNCoZk4A),[二叉树:前中后序迭代方式统一写法](https://mp.weixin.qq.com/s/ATQMPCpBlaAgrqdLDMVPZA)
迭代法中序遍历稍加改动就可以了,代码如下:
@@ -240,9 +241,10 @@ public:
};
```
-在[二叉树:二叉搜索树登场!](https://mp.weixin.qq.com/s/vsKrWRlETxCVsiRr8v_hHg)中我们分明写出了痛哭流涕的简洁迭代法,怎么在这里不行了呢,因为本题是要验证二叉搜索树啊。
-## 总结
+在[二叉树:二叉搜索树登场!](https://mp.weixin.qq.com/s/muRjJulujBqZXW4apLkGpg)中我们分明写出了痛哭流涕的简洁迭代法,怎么在这里不行了呢,因为本题是要验证二叉搜索树啊。
+
+# 总结
这道题目是一个简单题,但对于没接触过的同学还是有难度的。
@@ -251,10 +253,10 @@ public:
只要把基本类型的题目都做过,总结过之后,思路自然就开阔了。
-## 其他语言版本
+# 其他语言版本
-Java:
+## Java
```Java
class Solution {
@@ -336,16 +338,10 @@ class Solution {
}
```
-Python:
+## Python
**递归** - 利用BST中序遍历特性,把树"压缩"成数组
```python
-# Definition for a binary tree node.
-# class TreeNode:
-# def __init__(self, val=0, left=None, right=None):
-# self.val = val
-# self.left = left
-# self.right = right
class Solution:
def isValidBST(self, root: TreeNode) -> bool:
# 思路: 利用BST中序遍历的特性.
@@ -395,8 +391,9 @@ class Solution:
return is_left_valid and is_right_valid
return __isValidBST(root)
```
-```
-# 迭代-中序遍历
+
+```python
+迭代-中序遍历
class Solution:
def isValidBST(self, root: TreeNode) -> bool:
stack = []
@@ -415,7 +412,8 @@ class Solution:
return True
```
-Go:
+## Go
+
```Go
import "math"
@@ -458,9 +456,9 @@ func isValidBST(root *TreeNode) bool {
}
```
-JavaScript版本
+## JavaScript
-> 辅助数组解决
+辅助数组解决
```javascript
/**
@@ -493,7 +491,7 @@ var isValidBST = function (root) {
};
```
-> 递归中解决
+递归中解决
```javascript
/**
diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
index 0f9b2df659..954a19cd26 100644
--- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
+++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
@@ -1573,6 +1573,35 @@ public:
Java:
+```java
+class Solution {
+ public int minDepth(TreeNode root){
+ if (root == null) {
+ return 0;
+ }
+ Queue queue = new LinkedList<>();
+ queue.offer(root);
+ int depth = 0;
+ while (!queue.isEmpty()){
+ int size = queue.size();
+ depth++;
+ TreeNode cur = null;
+ for (int i = 0; i < size; i++) {
+ cur = queue.poll();
+ //如果当前节点的左右孩子都为空,直接返回最小深度
+ if (cur.left == null && cur.right == null){
+ return depth;
+ }
+ if (cur.left != null) queue.offer(cur.left);
+ if (cur.right != null) queue.offer(cur.right);
+ }
+ }
+ return depth;
+ }
+}
+```
+
+
Python:
diff --git "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\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.md" "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\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.md"
index 4cfe28582a..b225807608 100644
--- "a/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\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.md"
+++ "b/problems/0106.\344\273\216\344\270\255\345\272\217\344\270\216\345\220\216\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.md"
@@ -12,7 +12,7 @@
* 106.从中序与后序遍历序列构造二叉树
* 105.从前序与中序遍历序列构造二叉树
-## 106.从中序与后序遍历序列构造二叉树
+# 106.从中序与后序遍历序列构造二叉树
题目地址:https://leetcode-cn.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/
@@ -29,7 +29,7 @@

-### 思路
+## 思路
首先回忆一下如何根据两个顺序构造一个唯一的二叉树,相信理论知识大家应该都清楚,就是以 后序数组的最后一个元素为切割点,先切中序数组,根据中序数组,反过来在切后序数组。一层一层切下去,每次后序数组最后一个元素就是节点元素。
@@ -95,7 +95,8 @@ TreeNode* traversal (vector& inorder, vector& postorder) {
**在切割的过程中会产生四个区间,把握不好不变量的话,一会左闭右开,一会左闭又闭,必然乱套!**
-我在[数组:每次遇到二分法,都是一看就会,一写就废](https://mp.weixin.qq.com/s/fCf5QbPDtE6SSlZ1yh_q8Q)和[数组:这个循环可以转懵很多人!](https://mp.weixin.qq.com/s/KTPhaeqxbMK9CxHUUgFDmg)中都强调过循环不变量的重要性,在二分查找以及螺旋矩阵的求解中,坚持循环不变量非常重要,本题也是。
+
+我在[704.二分查找](https://mp.weixin.qq.com/s/4X-8VRgnYRGd5LYGZ33m4w)和[59.螺旋矩阵II](https://mp.weixin.qq.com/s/Hn6-mlCPvKAdWbiFfQyaaw)中都强调过循环不变量的重要性,在二分查找以及螺旋矩阵的求解中,坚持循环不变量非常重要,本题也是。
首先要切割中序数组,为什么先切割中序数组呢?
@@ -105,7 +106,7 @@ TreeNode* traversal (vector& inorder, vector& postorder) {
中序数组相对比较好切,找到切割点(后序数组的最后一个元素)在中序数组的位置,然后切割,如下代码中我坚持左闭右开的原则:
-```
+```C++
// 找到中序遍历的切割点
int delimiterIndex;
for (delimiterIndex = 0; delimiterIndex < inorder.size(); delimiterIndex++) {
@@ -394,7 +395,7 @@ public:
};
```
-## 105.从前序与中序遍历序列构造二叉树
+# 105.从前序与中序遍历序列构造二叉树
题目地址:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/
@@ -411,7 +412,7 @@ public:

-### 思路
+## 思路
本题和106是一样的道理。
@@ -540,7 +541,7 @@ public:
};
```
-## 思考题
+# 思考题
前序和中序可以唯一确定一颗二叉树。
@@ -562,7 +563,7 @@ tree2 的前序遍历是[1 2 3], 后序遍历是[3 2 1]。
所以前序和后序不能唯一确定一颗二叉树!
-## 总结
+# 总结
之前我们讲的二叉树题目都是各种遍历二叉树,这次开始构造二叉树了,思路其实比较简单,但是真正代码实现出来并不容易。
@@ -578,9 +579,9 @@ tree2 的前序遍历是[1 2 3], 后序遍历是[3 2 1]。
-## 其他语言版本
+# 其他语言版本
-Java:
+## Java
106.从中序与后序遍历序列构造二叉树
@@ -653,7 +654,7 @@ class Solution {
}
```
-Python:
+## Python
105.从前序与中序遍历序列构造二叉树
@@ -685,7 +686,8 @@ class Solution:
root.right = self.buildTree(preorder_right, inorder_right)
return root
-```
+```
+
106.从中序与后序遍历序列构造二叉树
```python
@@ -716,9 +718,11 @@ class Solution:
root.right = self.buildTree(inorder_right, postorder_right)
return root
-```
-Go:
-> 106 从中序与后序遍历序列构造二叉树
+```
+
+## Go
+
+106 从中序与后序遍历序列构造二叉树
```go
/**
@@ -751,7 +755,7 @@ func findRootIndex(inorder []int,target int) (index int){
}
```
-> 105 从前序与中序遍历序列构造二叉树
+105 从前序与中序遍历序列构造二叉树
```go
/**
@@ -784,7 +788,8 @@ func findRootIndex(target int,inorder []int) int{
-JavaScript
+## JavaScript
+
```javascript
var buildTree = function(inorder, postorder) {
if (!postorder.length) return null
diff --git "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md" "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md"
index 6eb6f301f8..5bae8e3a94 100644
--- "a/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md"
+++ "b/problems/0226.\347\277\273\350\275\254\344\272\214\345\217\211\346\240\221.md"
@@ -43,7 +43,7 @@
**注意只要把每一个节点的左右孩子翻转一下,就可以达到整体翻转的效果**
-**这道题目使用前序遍历和后序遍历都可以,唯独中序遍历不行,因为中序遍历会把某些节点的左右孩子翻转了两次!建议拿纸画一画,就理解了**
+**这道题目使用前序遍历和后序遍历都可以,唯独中序遍历不方便,因为中序遍历会把某些节点的左右孩子翻转了两次!建议拿纸画一画,就理解了**
那么层序遍历可以不可以呢?**依然可以的!只要把每一个节点的左右孩子翻转一下的遍历方式都是可以的!**
diff --git "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md"
index 0df82d35b5..0da600fd54 100644
--- "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md"
+++ "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md"
@@ -176,53 +176,6 @@ class MyQueue {
}
```
-个人习惯写法,使用Deque通用api:
-```java
-class MyQueue {
- // java中的 Stack 有设计上的缺陷,官方推荐使用 Deque(双端队列) 代替 Stack
- // Deque 中的 addFirst、removeFirst、peekFirst 等方法等效于 Stack(堆栈) 中的 push、pop、peek
- Deque stIn;
- Deque stOut;
- /** Initialize your data structure here. */
- public MyQueue() {
- stIn = new ArrayDeque<>();
- stOut = new ArrayDeque<>();
- }
-
- /** Push element x to the back of queue. */
- public void push(int x) {
- stIn.addLast(x);
- }
-
- /** Removes the element from in front of queue and returns that element. */
- public int pop() {
- // 只要 stOut 为空,那么就应该将 stIn 中所有的元素倒腾到 stOut 中
- if (stOut.isEmpty()) {
- while (!stIn.isEmpty()) {
- stOut.addLast(stIn.pollLast());
- }
- }
- // 再返回 stOut 中的元素
- return stOut.pollLast();
- }
-
- /** Get the front element. */
- public int peek() {
- // 直接使用已有的pop函数
- int res = this.pop();
- // 因为pop函数弹出了元素res,所以再添加回去
- stOut.addLast(res);
- return res;
- }
-
- /** Returns whether the queue is empty. */
- public boolean empty() {
- // 当 stIn 栈为空时,说明没有元素可以倒腾到 stOut 栈了
- // 并且 stOut 栈也为空时,说明没有以前从 stIn 中倒腾到的元素了
- return stIn.isEmpty() && stOut.isEmpty();
- }
-}
-```
```java
class MyQueue {
diff --git "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md" "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md"
index 3b1b65003c..60f6ed8e57 100644
--- "a/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md"
+++ "b/problems/0309.\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.md"
@@ -10,7 +10,9 @@
题目链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/
-给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。
+[https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/](https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/)
+
+给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。
设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):
diff --git "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md"
index ab1ef16afa..386c2ed2c4 100644
--- "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md"
+++ "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md"
@@ -65,7 +65,7 @@ public:
};
```
-那么我们也可以实现自己的reverse函数,其实和题目[344. 反转字符串](https://mp.weixin.qq.com/s/_rNm66OJVl92gBDIbGpA3w)道理是一样的。
+那么我们也可以实现自己的reverse函数,其实和题目[344. 反转字符串](https://programmercarl.com/0541.反转字符串II.html)道理是一样的。
下面我实现的reverse函数区间是左闭右闭区间,代码如下:
diff --git "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md" "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md"
index b24a934b66..4714288def 100644
--- "a/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md"
+++ "b/problems/0617.\345\220\210\345\271\266\344\272\214\345\217\211\346\240\221.md"
@@ -7,7 +7,7 @@
欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!
-## 617.合并二叉树
+# 617.合并二叉树
题目地址:https://leetcode-cn.com/problems/merge-two-binary-trees/
@@ -21,7 +21,7 @@
注意: 合并必须从两个树的根节点开始。
-## 思路
+# 思路
相信这道题目很多同学疑惑的点是如何同时遍历两个二叉树呢?
@@ -165,7 +165,8 @@ public:
使用迭代法,如何同时处理两棵树呢?
-思路我们在[二叉树:我对称么?](https://mp.weixin.qq.com/s/Kgf0gjvlDlNDfKIH2b1Oxg)中的迭代法已经讲过一次了,求二叉树对称的时候就是把两个树的节点同时加入队列进行比较。
+
+思路我们在[二叉树:我对称么?](https://mp.weixin.qq.com/s/5voTWHFuB9szmXGcJUzOPQ)中的迭代法已经讲过一次了,求二叉树对称的时候就是把两个树的节点同时加入队列进行比较。
本题我们也使用队列,模拟的层序遍历,代码如下:
@@ -209,7 +210,7 @@ public:
};
```
-## 拓展
+# 拓展
当然也可以秀一波指针的操作,这是我写的野路子,大家就随便看看就行了,以防带跑遍了。
@@ -241,21 +242,21 @@ public:
};
```
-## 总结
+# 总结
合并二叉树,也是二叉树操作的经典题目,如果没有接触过的话,其实并不简单,因为我们习惯了操作一个二叉树,一起操作两个二叉树,还会有点懵懵的。
-这不是我们第一次操作两颗二叉树了,在[二叉树:我对称么?](https://mp.weixin.qq.com/s/Kgf0gjvlDlNDfKIH2b1Oxg)中也一起操作了两棵二叉树。
+这不是我们第一次操作两颗二叉树了,在[二叉树:我对称么?](https://mp.weixin.qq.com/s/5voTWHFuB9szmXGcJUzOPQ)中也一起操作了两棵二叉树。
迭代法中,一般一起操作两个树都是使用队列模拟类似层序遍历,同时处理两个树的节点,这种方式最好理解,如果用模拟递归的思路的话,要复杂一些。
最后拓展中,我给了一个操作指针的野路子,大家随便看看就行了,如果学习C++的话,可以在去研究研究。
-## 其他语言版本
+# 其他语言版本
-Java:
+## Java
```Java
class Solution {
@@ -311,7 +312,7 @@ class Solution {
}
```
-Python:
+## Python
**递归法 - 前序遍历**
```python
@@ -374,7 +375,7 @@ class Solution:
return root1
```
-Go:
+## Go
```go
/**
@@ -468,7 +469,7 @@ func mergeTrees(root1 *TreeNode, root2 *TreeNode) *TreeNode {
}
```
-JavaScript:
+## JavaScript
```javascript
/**
diff --git "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md"
index 8c310a21f3..8c89064e9d 100644
--- "a/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md"
+++ "b/problems/0654.\346\234\200\345\244\247\344\272\214\345\217\211\346\240\221.md"
@@ -7,7 +7,7 @@
欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!
-## 654.最大二叉树
+# 654.最大二叉树
题目地址:https://leetcode-cn.com/problems/maximum-binary-tree/
@@ -27,7 +27,7 @@
给定的数组的大小在 [1, 1000] 之间。
-## 思路
+# 思路
最大二叉树的构建过程如下:
@@ -41,7 +41,7 @@
代码如下:
-```
+```CPP
TreeNode* constructMaximumBinaryTree(vector& nums)
```
@@ -53,7 +53,7 @@ TreeNode* constructMaximumBinaryTree(vector& nums)
代码如下:
-```
+```CPP
TreeNode* node = new TreeNode(0);
if (nums.size() == 1) {
node->val = nums[0];
@@ -68,7 +68,7 @@ if (nums.size() == 1) {
1. 先要找到数组中最大的值和对应的下表, 最大的值构造根节点,下表用来下一步分割数组。
代码如下:
-```
+```CPP
int maxValue = 0;
int maxValueIndex = 0;
for (int i = 0; i < nums.size(); i++) {
@@ -86,7 +86,7 @@ node->val = maxValue;
这里要判断maxValueIndex > 0,因为要保证左区间至少有一个数值。
代码如下:
-```
+```CPP
if (maxValueIndex > 0) {
vector newVec(nums.begin(), nums.begin() + maxValueIndex);
node->left = constructMaximumBinaryTree(newVec);
@@ -99,7 +99,7 @@ if (maxValueIndex > 0) {
代码如下:
-```
+```CPP
if (maxValueIndex < (nums.size() - 1)) {
vector newVec(nums.begin() + maxValueIndex + 1, nums.end());
node->right = constructMaximumBinaryTree(newVec);
@@ -143,7 +143,7 @@ public:
以上代码比较冗余,效率也不高,每次还要切割的时候每次都要定义新的vector(也就是数组),但逻辑比较清晰。
-和文章[二叉树:构造二叉树登场!](https://mp.weixin.qq.com/s/7r66ap2s-shvVvlZxo59xg)中一样的优化思路,就是每次分隔不用定义新的数组,而是通过下表索引直接在原数组上操作。
+和文章[二叉树:构造二叉树登场!](https://mp.weixin.qq.com/s/Dza-fqjTyGrsRw4PWNKdxA)中一样的优化思路,就是每次分隔不用定义新的数组,而是通过下表索引直接在原数组上操作。
优化后代码如下:
@@ -177,7 +177,7 @@ public:
};
```
-## 拓展
+# 拓展
可以发现上面的代码看上去简洁一些,**主要是因为第二版其实是允许空节点进入递归,所以不用在递归的时候加判断节点是否为空**
@@ -209,10 +209,9 @@ root->right = traversal(nums, maxValueIndex + 1, right);
第二版相应的终止条件,是遇到空节点,也就是数组区间为0,就终止了。
+# 总结
-## 总结
-
-这道题目其实和 [二叉树:构造二叉树登场!](https://mp.weixin.qq.com/s/7r66ap2s-shvVvlZxo59xg) 是一个思路,比[二叉树:构造二叉树登场!](https://mp.weixin.qq.com/s/7r66ap2s-shvVvlZxo59xg) 还简单一些。
+这道题目其实和 [二叉树:构造二叉树登场!](https://mp.weixin.qq.com/s/Dza-fqjTyGrsRw4PWNKdxA) 是一个思路,比[二叉树:构造二叉树登场!](https://mp.weixin.qq.com/s/Dza-fqjTyGrsRw4PWNKdxA) 还简单一些。
**注意类似用数组构造二叉树的题目,每次分隔尽量不要定义新的数组,而是通过下表索引直接在原数组上操作,这样可以节约时间和空间上的开销。**
@@ -220,10 +219,10 @@ root->right = traversal(nums, maxValueIndex + 1, right);
其实就是不同代码风格的实现,**一般情况来说:如果让空节点(空指针)进入递归,就不加if,如果不让空节点进入递归,就加if限制一下, 终止条件也会相应的调整。**
-## 其他语言版本
+# 其他语言版本
-Java:
+## Java
```Java
class Solution {
@@ -255,14 +254,9 @@ class Solution {
}
```
-Python:
+## Python
+
```python
-# Definition for a binary tree node.
-# class TreeNode:
-# def __init__(self, val=0, left=None, right=None):
-# self.val = val
-# self.left = left
-# self.right = right
//递归法
class Solution:
def constructMaximumBinaryTree(self, nums: List[int]) -> TreeNode:
@@ -276,9 +270,8 @@ class Solution:
return root
```
-Go:
+## Go
-> 654. 最大二叉树
```go
/**
@@ -311,7 +304,7 @@ func findMax(nums []int) (index int){
}
```
-JavaScript版本
+## JavaScript
```javascript
/**
diff --git "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md" "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md"
index 68d30e3f85..ec050fefc7 100644
--- "a/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md"
+++ "b/problems/0700.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\346\220\234\347\264\242.md"
@@ -7,7 +7,7 @@
欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!
-## 700.二叉搜索树中的搜索
+# 700.二叉搜索树中的搜索
题目地址:https://leetcode-cn.com/problems/search-in-a-binary-search-tree/
@@ -19,11 +19,12 @@
在上述示例中,如果要找的值是 5,但因为没有节点值为 5,我们应该返回 NULL。
-## 思路
+# 思路
之前我们讲了都是普通二叉树,那么接下来看看二叉搜索树。
-在[关于二叉树,你该了解这些!](https://mp.weixin.qq.com/s/_ymfWYvTNd2GvWvC5HOE4A)中,我们已经讲过了二叉搜索树。
+
+在[关于二叉树,你该了解这些!](https://mp.weixin.qq.com/s/q_eKfL8vmSbSFcptZ3aeRA)中,我们已经讲过了二叉搜索树。
二叉搜索树是一个有序树:
@@ -73,7 +74,7 @@ return NULL;
这里可能会疑惑,在递归遍历的时候,什么时候直接return 递归函数的返回值,什么时候不用加这个 return呢。
-我们在[二叉树:递归函数究竟什么时候需要返回值,什么时候不要返回值?](https://mp.weixin.qq.com/s/6TWAVjxQ34kVqROWgcRFOg)中讲了,如果要搜索一条边,递归函数就要加返回值,这里也是一样的道理。
+我们在[二叉树:路径总和](https://mp.weixin.qq.com/s/EJr_nZ31TnvZmptBjkDGqA)中讲了,如果要搜索一条边,递归函数就要加返回值,这里也是一样的道理。
**因为搜索到目标节点了,就要立即return了,这样才是找到节点就返回(搜索某一条边),如果不加return,就是遍历整棵树了。**
@@ -125,7 +126,7 @@ public:
第一次看到了如此简单的迭代法,是不是感动的痛哭流涕,哭一会~
-## 总结
+# 总结
本篇我们介绍了二叉搜索树的遍历方式,因为二叉搜索树的有序性,遍历的时候要比普通二叉树简单很多。
@@ -138,9 +139,9 @@ public:
-## 其他语言版本
+# 其他语言版本
-Java:
+## Java
```Java
class Solution {
@@ -207,17 +208,11 @@ class Solution {
}
```
-Python:
+## Python
递归法:
```python
-# Definition for a binary tree node.
-# class TreeNode:
-# def __init__(self, val=0, left=None, right=None):
-# self.val = val
-# self.left = left
-# self.right = right
class Solution:
def searchBST(self, root: TreeNode, val: int) -> TreeNode:
# 为什么要有返回值:
@@ -248,19 +243,11 @@ class Solution:
```
-Go:
+## Go
-> 递归法
+递归法:
```go
-/**
- * Definition for a binary tree node.
- * type TreeNode struct {
- * Val int
- * Left *TreeNode
- * Right *TreeNode
- * }
- */
//递归法
func searchBST(root *TreeNode, val int) *TreeNode {
if root==nil||root.Val==val{
@@ -273,17 +260,9 @@ func searchBST(root *TreeNode, val int) *TreeNode {
}
```
-> 迭代法
+迭代法:
```go
-/**
- * Definition for a binary tree node.
- * type TreeNode struct {
- * Val int
- * Left *TreeNode
- * Right *TreeNode
- * }
- */
//迭代法
func searchBST(root *TreeNode, val int) *TreeNode {
for root!=nil{
@@ -299,9 +278,9 @@ func searchBST(root *TreeNode, val int) *TreeNode {
}
```
-JavaScript版本
+## JavaScript
-> 递归
+递归:
```javascript
/**
@@ -329,7 +308,7 @@ var searchBST = function (root, val) {
};
```
-> 迭代
+迭代:
```javascript
/**
diff --git "a/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md" "b/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md"
index 300aa0e256..e94a32d3f9 100644
--- "a/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md"
+++ "b/problems/1356.\346\240\271\346\215\256\346\225\260\345\255\227\344\272\214\350\277\233\345\210\266\344\270\2131\347\232\204\346\225\260\347\233\256\346\216\222\345\272\217.md"
@@ -7,112 +7,113 @@
欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!
-# 1365.有多少小于当前数字的数字
-题目链接:https://leetcode-cn.com/problems/sort-integers-by-the-number-of-1-bits/
+# 1356. 根据数字二进制下 1 的数目排序
-给你一个数组 nums,对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目。
+题目链接:https://leetcode-cn.com/problems/sort-integers-by-the-number-of-1-bits/
-换而言之,对于每个 nums[i] 你必须计算出有效的 j 的数量,其中 j 满足 j != i 且 nums[j] < nums[i] 。
+给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。
-以数组形式返回答案。
+如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。
+请你返回排序后的数组。
示例 1:
-输入:nums = [8,1,2,2,3]
-输出:[4,0,1,1,3]
-解释:
-对于 nums[0]=8 存在四个比它小的数字:(1,2,2 和 3)。
-对于 nums[1]=1 不存在比它小的数字。
-对于 nums[2]=2 存在一个比它小的数字:(1)。
-对于 nums[3]=2 存在一个比它小的数字:(1)。
-对于 nums[4]=3 存在三个比它小的数字:(1,2 和 2)。
+* 输入:arr = [0,1,2,3,4,5,6,7,8]
+* 输出:[0,1,2,4,8,3,5,6,7]
+* 解释:[0] 是唯一一个有 0 个 1 的数。
+[1,2,4,8] 都有 1 个 1 。
+[3,5,6] 有 2 个 1 。
+[7] 有 3 个 1 。按照 1 的个数排序得到的结果数组为 [0,1,2,4,8,3,5,6,7]
+
示例 2:
-输入:nums = [6,5,4,8]
-输出:[2,1,0,3]
+* 输入:arr = [1024,512,256,128,64,32,16,8,4,2,1]
+* 输出:[1,2,4,8,16,32,64,128,256,512,1024]
+* 解释:数组中所有整数二进制下都只有 1 个 1 ,所以你需要按照数值大小将它们排序。
示例 3:
-输入:nums = [7,7,7,7]
-输出:[0,0,0,0]
-
-提示:
-* 2 <= nums.length <= 500
-* 0 <= nums[i] <= 100
-
-# 思路
-
-两层for循环暴力查找,时间复杂度明显为O(n^2)。
-
-那么我们来看一下如何优化。
+* 输入:arr = [10000,10000]
+* 输出:[10000,10000]
-首先要找小于当前数字的数字,那么从小到大排序之后,该数字之前的数字就都是比它小的了。
+示例 4:
+* 输入:arr = [2,3,5,7,11,13,17,19]
+* 输出:[2,3,5,17,7,11,13,19]
-所以可以定义一个新数组,将数组排个序。
+示例 5:
+* 输入:arr = [10,100,1000,10000]
+* 输出:[10,100,10000,1000]
-**排序之后,其实每一个数值的下标就代表这前面有几个比它小的了**。
-代码如下:
-```
-vector vec = nums;
-sort(vec.begin(), vec.end()); // 从小到大排序之后,元素下标就是小于当前数字的数字
-```
+# 思路
-此时用一个哈希表hash(本题可以就用一个数组)来做数值和下标的映射。这样就可以通过数值快速知道下标(也就是前面有几个比它小的)。
+这道题其实是考察如何计算一个数的二进制中1的数量。
-此时有一个情况,就是数值相同怎么办?
+我提供两种方法:
-例如,数组:1 2 3 4 4 4 ,第一个数值4的下标是3,第二个数值4的下标是4了。
+* 方法一:
-这里就需要一个技巧了,**在构造数组hash的时候,从后向前遍历,这样hash里存放的就是相同元素最左面的数值和下标了**。
-代码如下:
+朴实无华挨个计算1的数量,最多就是循环n的二进制位数,32位。
-```CPP
-int hash[101];
-for (int i = vec.size() - 1; i >= 0; i--) { // 从后向前,记录 vec[i] 对应的下标
- hash[vec[i]] = i;
+```C++
+int bitCount(int n) {
+ int count = 0; // 计数器
+ while (n > 0) {
+ if((n & 1) == 1) count++; // 当前位是1,count++
+ n >>= 1 ; // n向右移位
+ }
+ return count;
}
```
-最后在遍历原数组nums,用hash快速找到每一个数值 对应的 小于这个数值的个数。存放在将结果存放在另一个数组中。
+* 方法二
-代码如下:
+这种方法,只循环n的二进制中1的个数次,比方法一高效的多
-```CPP
-// 此时hash里保存的每一个元素数值 对应的 小于这个数值的个数
-for (int i = 0; i < nums.size(); i++) {
- vec[i] = hash[nums[i]];
+```C++
+int bitCount(int n) {
+ int count = 0;
+ while (n) {
+ n &= (n - 1); // 清除最低位的1
+ count++;
+ }
+ return count;
}
```
+以计算12的二进制1的数量为例,如图所示:
-流程如图:
+
-
+下面我就使用方法二,来做这道题目:
-关键地方讲完了,整体C++代码如下:
+## C++代码
-```CPP
+```C++
class Solution {
-public:
- vector smallerNumbersThanCurrent(vector& nums) {
- vector vec = nums;
- sort(vec.begin(), vec.end()); // 从小到大排序之后,元素下标就是小于当前数字的数字
- int hash[101];
- for (int i = vec.size() - 1; i >= 0; i--) { // 从后向前,记录 vec[i] 对应的下标
- hash[vec[i]] = i;
- }
- // 此时hash里保存的每一个元素数值 对应的 小于这个数值的个数
- for (int i = 0; i < nums.size(); i++) {
- vec[i] = hash[nums[i]];
+private:
+ static int bitCount(int n) { // 计算n的二进制中1的数量
+ int count = 0;
+ while(n) {
+ n &= (n -1); // 清除最低位的1
+ count++;
}
- return vec;
+ return count;
+ }
+ static bool cmp(int a, int b) {
+ int bitA = bitCount(a);
+ int bitB = bitCount(b);
+ if (bitA == bitB) return a < b; // 如果bit中1数量相同,比较数值大小
+ return bitA < bitB; // 否则比较bit中1数量大小
+ }
+public:
+ vector sortByBits(vector& arr) {
+ sort(arr.begin(), arr.end(), cmp);
+ return arr;
}
};
```
-可以排序之后加哈希,时间复杂度为O(nlogn)
-
# 其他语言版本
@@ -120,48 +121,8 @@ public:
## Java
```java
-/**
-* 解法一:暴力
-* 时间复杂度:O(n^2)
-* 空间复杂度:O(n)
-*/
-class Solution {
- public int[] smallerNumbersThanCurrent(int[] nums) {
- int[] res = new int[nums.length];
- for (int i = 0; i < nums.length; i++) {
- for (int j = 0; j < nums.length; j++) {
- if (nums[j] < nums[i] && j != i) { // 注意 j 不能和 i 重合
- res[i]++;
- }
- }
- }
- return res;
- }
-}
```
-```java
-/**
-* 优化:排序 + 哈希表
-* 时间复杂度:O(nlogn)
-* 空间复杂度:O(n)
-*/
-class Solution {
- public int[] smallerNumbersThanCurrent(int[] nums) {
- int[] res = Arrays.copyOf(nums, nums.length);
- Arrays.sort(res); // 是对 res 排序,nums 中顺序还要保持
- int[] hash = new int[101]; // 使用哈希表,记录比当前元素小的元素个数
- for (int i = res.length - 1; i >= 0; i--) { // 注意:从后向前
- hash[res[i]] = i; // 排序后,当前下标即表示比当前元素小的元素个数
- }
- // 此时 hash中保存的每一个元素数值 便是 小于这个数值的个数
- for (int i = 0; i < res.length; i++) {
- res[i] = hash[nums[i]];
- }
- return res;
- }
-}
-```
diff --git "a/problems/\345\205\266\344\273\226/\345\217\202\344\270\216\346\234\254\351\241\271\347\233\256.md" "b/problems/\345\205\266\344\273\226/\345\217\202\344\270\216\346\234\254\351\241\271\347\233\256.md"
new file mode 100644
index 0000000000..69cb855532
--- /dev/null
+++ "b/problems/\345\205\266\344\273\226/\345\217\202\344\270\216\346\234\254\351\241\271\347\233\256.md"
@@ -0,0 +1,7 @@
+
+优化已有代码
+
+
+**push代码之前 一定要 先pull最新代码**,否则提交的pr可能会有删除其他录友代码的操作。
+
+一个pr 不要修改过多文件,因为一旦有一个 文件修改有问题,就不能合入,影响其他文件的合入了。
From 649fe7a202b348300853a059bb1426035c7f2563 Mon Sep 17 00:00:00 2001
From: ironartisan
Date: Tue, 24 Aug 2021 16:15:36 +0800
Subject: [PATCH 0075/3468] =?UTF-8?q?=E6=9B=B4=E6=96=B00093.=E5=A4=8D?=
=?UTF-8?q?=E5=8E=9FIP=E5=9C=B0=E5=9D=80python3=E7=89=88=E6=9C=AC=EF=BC=8C?=
=?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=89=AA=E6=9E=9D=E6=93=8D=E4=BD=9C?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...93.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md" "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md"
index 1d39df7531..74c6df7752 100644
--- "a/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md"
+++ "b/problems/0093.\345\244\215\345\216\237IP\345\234\260\345\235\200.md"
@@ -320,14 +320,15 @@ class Solution:
if p[0] == '0': return False
if int(p) > 0 and int(p) <256: return True
return False
-
+
def backtrack(s, startIndex):
if len(s) > 12: return # 字符串长度最大为12
if len(path) == 4 and startIndex == len(s): # 确保切割完,且切割后的长度为4
res.append(".".join(path[:])) # 字符拼接
- return
+ return
for i in range(startIndex, len(s)):
+ if len(s) - startIndex > 3*(4 - len(path)): continue # 剪枝,剩下的字符串大于允许的最大长度则跳过
p = s[startIndex:i+1] # 分割字符
if isValid(p): # 判断字符是否有效
path.append(p)
From 8cfce4eefa9df796bf936698d58a7add88dd49ca Mon Sep 17 00:00:00 2001
From: koevas1226 <3130104027@stmail.ujs.edu.cn>
Date: Tue, 24 Aug 2021 20:10:20 +0800
Subject: [PATCH 0076/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A00189.=E6=97=8B?=
=?UTF-8?q?=E8=BD=AC=E6=95=B0=E7=BB=84=20js=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...7\213\350\275\254\346\225\260\347\273\204.md" | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git "a/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md" "b/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md"
index be46bf4c1b..a2b2b206c5 100644
--- "a/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md"
+++ "b/problems/0189.\346\227\213\350\275\254\346\225\260\347\273\204.md"
@@ -131,6 +131,22 @@ class Solution:
## JavaScript
```js
+var rotate = function (nums, k) {
+ function reverse(nums, i, j) {
+ while (i < j) {
+ [nums[i],nums[j]] = [nums[j],nums[i]]; // 解构赋值
+ i++;
+ j--;
+ }
+ }
+ let n = nums.length;
+ k %= n;
+ if (k) {
+ reverse(nums, 0, n - 1);
+ reverse(nums, 0, k - 1);
+ reverse(nums, k, n - 1);
+ }
+};
```
-----------------------
From f0873ddabbc6a06f3c8059841a201e9785e33a95 Mon Sep 17 00:00:00 2001
From: youngyangyang04 <826123027@qq.com>
Date: Wed, 25 Aug 2021 00:55:25 +0800
Subject: [PATCH 0077/3468] =?UTF-8?q?=E6=9B=B4=E6=96=B00530.=E4=BA=8C?=
=?UTF-8?q?=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E7=9A=84=E6=9C=80=E5=B0=8F?=
=?UTF-8?q?=E7=BB=9D=E5=AF=B9=E5=B7=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...17\347\273\235\345\257\271\345\267\256.md" | 73 +++++--------------
1 file changed, 19 insertions(+), 54 deletions(-)
diff --git "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md"
index 04c03b3f48..fdd0afd5f4 100644
--- "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md"
+++ "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md"
@@ -9,7 +9,7 @@
> 利用二叉搜索树的特性搞起!
-## 530.二叉搜索树的最小绝对差
+# 530.二叉搜索树的最小绝对差
题目地址:https://leetcode-cn.com/problems/minimum-absolute-difference-in-bst/
@@ -21,7 +21,7 @@
提示:树中至少有 2 个节点。
-## 思路
+# 思路
题目中要求在二叉搜索树上任意两节点的差的绝对值的最小值。
@@ -101,7 +101,7 @@ public:
## 迭代
-看过这两篇[二叉树:听说递归能做的,栈也能做!](https://mp.weixin.qq.com/s/c_zCrGHIVlBjUH_hJtghCg),[二叉树:前中后序迭代方式的写法就不能统一一下么?](https://mp.weixin.qq.com/s/WKg0Ty1_3SZkztpHubZPRg)文章之后,不难写出两种中序遍历的迭代法。
+看过这两篇[二叉树:听说递归能做的,栈也能做!](https://mp.weixin.qq.com/s/OH7aCVJ5-Gi32PkNCoZk4A),[二叉树:前中后序迭代方式统一写法](https://mp.weixin.qq.com/s/ATQMPCpBlaAgrqdLDMVPZA)文章之后,不难写出两种中序遍历的迭代法。
下面我给出其中的一种中序遍历的迭代法,代码如下:
@@ -132,7 +132,7 @@ public:
};
```
-## 总结
+# 总结
**遇到在二叉搜索树上求什么最值,求差值之类的,都要思考一下二叉搜索树可是有序的,要利用好这一特点。**
@@ -142,15 +142,11 @@ public:
+# 其他语言版本
+## Java
-
-
-## 其他语言版本
-
-
-Java:
递归
```java
class Solution {
@@ -175,38 +171,11 @@ class Solution {
}
}
```
-```Java
-class Solution {
- TreeNode pre;// 记录上一个遍历的结点
- int result = Integer.MAX_VALUE;
- public int getMinimumDifference(TreeNode root) {
- if (root == null) {
- return result;
- }
- // 左
- int left = getMinimumDifference(root.left);
-
- // 中
- if (pre != null) {
- result = Math.min(left, root.val - pre.val);
- }
- pre = root;
- // 右
- int right = getMinimumDifference(root.right);
- result = Math.min(right, result);
- return result;
- }
-}
-```
-Python:
+## Python
+
+递归
```python
-# Definition for a binary tree node.
-# class TreeNode:
-# def __init__(self, val=0, left=None, right=None):
-# self.val = val
-# self.left = left
-# self.right = right
class Solution:
def getMinimumDifference(self, root: TreeNode) -> int:
res = []
@@ -222,8 +191,10 @@ class Solution:
for i in range(len(res)-1): // 统计有序数组的最小差值
r = min(abs(res[i]-res[i+1]),r)
return r
-
-# 迭代法-中序遍历
+```
+
+迭代法-中序遍历
+```python
class Solution:
def getMinimumDifference(self, root: TreeNode) -> int:
stack = []
@@ -242,19 +213,13 @@ class Solution:
cur = cur.right
return result
-```
-Go:
-> 中序遍历,然后计算最小差值
+```
+
+## Go:
+
+中序遍历,然后计算最小差值
```go
-/**
- * Definition for a binary tree node.
- * type TreeNode struct {
- * Val int
- * Left *TreeNode
- * Right *TreeNode
- * }
- */
func getMinimumDifference(root *TreeNode) int {
var res []int
findMIn(root,&res)
@@ -299,7 +264,7 @@ func getMinimumDifference(root *TreeNode) int {
}
```
-JavaScript版本
+## JavaScript
```javascript
/**
From 0628f856fca682dcd4e0fd4f18668d3881d942fc Mon Sep 17 00:00:00 2001
From: XuDaHaoRen <1547794387@qq.com>
Date: Wed, 25 Aug 2021 09:31:52 +0800
Subject: [PATCH 0078/3468] =?UTF-8?q?=E8=83=8C=E5=8C=85=E6=80=BB=E7=BB=93?=
=?UTF-8?q?=E5=8F=8A=E5=85=B6=E5=89=8D5=E4=B8=AA=E6=96=87=E4=BB=B6?=
=?UTF-8?q?=E8=BF=9E=E6=8E=A5=E6=9B=B4=E6=96=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...05\346\200\273\347\273\223\347\257\207.md" | 32 +++++++++----------
...47\241\20001\350\203\214\345\214\205-2.md" | 4 +--
...32\351\207\215\350\203\214\345\214\205.md" | 6 ++--
...14\345\205\250\350\203\214\345\214\205.md" | 10 +++---
4 files changed, 26 insertions(+), 26 deletions(-)
diff --git "a/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md" "b/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md"
index 7ec2d6bf7f..f3732c8dcc 100644
--- "a/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md"
+++ "b/problems/\350\203\214\345\214\205\346\200\273\347\273\223\347\257\207.md"
@@ -30,30 +30,30 @@
## 背包递推公式
问能否能装满背包(或者最多装多少):dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]); ,对应题目如下:
-* [动态规划:416.分割等和子集](https://mp.weixin.qq.com/s/sYw3QtPPQ5HMZCJcT4EaLQ)
-* [动态规划:1049.最后一块石头的重量 II](https://mp.weixin.qq.com/s/WbwAo3jaUaNJjvhHgq0BGg)
+* [动态规划:416.分割等和子集](https://programmercarl.com/0416.分割等和子集.html)
+* [动态规划:1049.最后一块石头的重量 II](https://programmercarl.com/1049.最后一块石头的重量II.html)
问装满背包有几种方法:dp[j] += dp[j - nums[i]] ,对应题目如下:
-* [动态规划:494.目标和](https://mp.weixin.qq.com/s/2pWmaohX75gwxvBENS-NCw)
-* [动态规划:518. 零钱兑换 II](https://mp.weixin.qq.com/s/PlowDsI4WMBOzf3q80AksQ)
-* [动态规划:377.组合总和Ⅳ](https://mp.weixin.qq.com/s/Iixw0nahJWQgbqVNk8k6gA)
-* [动态规划:70. 爬楼梯进阶版(完全背包)](https://mp.weixin.qq.com/s/e_wacnELo-2PG76EjrUakA)
+* [动态规划:494.目标和](https://programmercarl.com/0494.目标和.html)
+* [动态规划:518. 零钱兑换 II](https://programmercarl.com/0518.零钱兑换II.html)
+* [动态规划:377.组合总和Ⅳ](https://programmercarl.com/0377.组合总和Ⅳ.html)
+* [动态规划:70. 爬楼梯进阶版(完全背包)](https://programmercarl.com/0070.爬楼梯完全背包版本.html)
问背包装满最大价值:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]); ,对应题目如下:
-* [动态规划:474.一和零](https://mp.weixin.qq.com/s/x-u3Dsp76DlYqtCe0xEKJw)
+* [动态规划:474.一和零](https://programmercarl.com/0474.一和零.html)
问装满背包所有物品的最小个数:dp[j] = min(dp[j - coins[i]] + 1, dp[j]); ,对应题目如下:
-* [动态规划:322.零钱兑换](https://mp.weixin.qq.com/s/dyk-xNilHzNtVdPPLObSeQ)
-* [动态规划:279.完全平方数](https://mp.weixin.qq.com/s/VfJT78p7UGpDZsapKF_QJQ)
+* [动态规划:322.零钱兑换](https://programmercarl.com/0322.零钱兑换.html)
+* [动态规划:279.完全平方数](https://programmercarl.com/0279.完全平方数.html)
## 遍历顺序
### 01背包
-在[动态规划:关于01背包问题,你该了解这些!](https://mp.weixin.qq.com/s/FwIiPPmR18_AJO5eiidT6w)中我们讲解二维dp数组01背包先遍历物品还是先遍历背包都是可以的,且第二层for循环是从小到大遍历。
+在[动态规划:关于01背包问题,你该了解这些!](https://programmercarl.com/背包理论基础01背包-1.html)中我们讲解二维dp数组01背包先遍历物品还是先遍历背包都是可以的,且第二层for循环是从小到大遍历。
-和[动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://mp.weixin.qq.com/s/M4uHxNVKRKm5HPjkNZBnFA)中,我们讲解一维dp数组01背包只能先遍历物品再遍历背包容量,且第二层for循环是从大到小遍历。
+和[动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html)中,我们讲解一维dp数组01背包只能先遍历物品再遍历背包容量,且第二层for循环是从大到小遍历。
**一维dp数组的背包在遍历顺序上和二维dp数组实现的01背包其实是有很大差异的,大家需要注意!**
@@ -61,7 +61,7 @@
说完01背包,再看看完全背包。
-在[动态规划:关于完全背包,你该了解这些!](https://mp.weixin.qq.com/s/akwyxlJ4TLvKcw26KB9uJw)中,讲解了纯完全背包的一维dp数组实现,先遍历物品还是先遍历背包都是可以的,且第二层for循环是从小到大遍历。
+在[动态规划:关于完全背包,你该了解这些!](https://programmercarl.com/背包问题理论基础完全背包.html)中,讲解了纯完全背包的一维dp数组实现,先遍历物品还是先遍历背包都是可以的,且第二层for循环是从小到大遍历。
但是仅仅是纯完全背包的遍历顺序是这样的,题目稍有变化,两个for循环的先后顺序就不一样了。
@@ -71,12 +71,12 @@
相关题目如下:
-* 求组合数:[动态规划:518.零钱兑换II](https://mp.weixin.qq.com/s/PlowDsI4WMBOzf3q80AksQ)
-* 求排列数:[动态规划:377. 组合总和 Ⅳ](https://mp.weixin.qq.com/s/Iixw0nahJWQgbqVNk8k6gA)、[动态规划:70. 爬楼梯进阶版(完全背包)](https://mp.weixin.qq.com/s/e_wacnELo-2PG76EjrUakA)
+* 求组合数:[动态规划:518.零钱兑换II](https://programmercarl.com/0518.零钱兑换II.html)
+* 求排列数:[动态规划:377. 组合总和 Ⅳ](https://mp.weixin.qq.com/s/Iixw0nahJWQgbqVNk8k6gA)、[动态规划:70. 爬楼梯进阶版(完全背包)](https://programmercarl.com/0070.爬楼梯完全背包版本.html)
如果求最小数,那么两层for循环的先后顺序就无所谓了,相关题目如下:
-* 求最小数:[动态规划:322. 零钱兑换](https://mp.weixin.qq.com/s/dyk-xNilHzNtVdPPLObSeQ)、[动态规划:279.完全平方数](https://mp.weixin.qq.com/s/VfJT78p7UGpDZsapKF_QJQ)
+* 求最小数:[动态规划:322. 零钱兑换](https://programmercarl.com/0322.零钱兑换.html)、[动态规划:279.完全平方数](https://programmercarl.com/0279.完全平方数.html)
**对于背包问题,其实递推公式算是容易的,难是难在遍历顺序上,如果把遍历顺序搞透,才算是真正理解了**。
@@ -88,7 +88,7 @@
**而且每一个点,我都给出了对应的力扣题目**。
-最后如果你想了解多重背包,可以看这篇[动态规划:关于多重背包,你该了解这些!](https://mp.weixin.qq.com/s/b-UUUmbvG7URWyCjQkiuuQ),力扣上还没有多重背包的题目,也不是面试考察的重点。
+最后如果你想了解多重背包,可以看这篇[动态规划:关于多重背包,你该了解这些!](https://programmercarl.com/背包问题理论基础多重背包.html),力扣上还没有多重背包的题目,也不是面试考察的重点。
如果把我本篇总结出来的内容都掌握的话,可以说对背包问题理解的就很深刻了,用来对付面试中的背包问题绰绰有余!
diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md"
index 4f1455e976..07f74186d2 100644
--- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md"
+++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-2.md"
@@ -8,7 +8,7 @@
# 动态规划:关于01背包问题,你该了解这些!(滚动数组)
-昨天[动态规划:关于01背包问题,你该了解这些!](https://mp.weixin.qq.com/s/FwIiPPmR18_AJO5eiidT6w)中是用二维dp数组来讲解01背包。
+昨天[动态规划:关于01背包问题,你该了解这些!](https://programmercarl.com/背包理论基础01背包-1.html)中是用二维dp数组来讲解01背包。
今天我们就来说一说滚动数组,其实在前面的题目中我们已经用到过滚动数组了,就是把二维dp降为一维dp,一些录友当时还表示比较困惑。
@@ -199,7 +199,7 @@ int main() {
大家可以发现其实信息量还是挺大的。
-如果把[动态规划:关于01背包问题,你该了解这些!](https://mp.weixin.qq.com/s/FwIiPPmR18_AJO5eiidT6w)和本篇的内容都理解了,后面我们在做01背包的题目,就会发现非常简单了。
+如果把[动态规划:关于01背包问题,你该了解这些!](https://programmercarl.com/背包理论基础01背包-1.html)和本篇的内容都理解了,后面我们在做01背包的题目,就会发现非常简单了。
不用再凭感觉或者记忆去写背包,而是有自己的思考,了解其本质,代码的方方面面都在自己的掌控之中。
diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md"
index 85cbf4ded7..f1dfed26d5 100644
--- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md"
+++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\244\232\351\207\215\350\203\214\345\214\205.md"
@@ -9,9 +9,9 @@
之前我们已经体统的讲解了01背包和完全背包,如果没有看过的录友,建议先把如下三篇文章仔细阅读一波。
-* [动态规划:关于01背包问题,你该了解这些!](https://mp.weixin.qq.com/s/FwIiPPmR18_AJO5eiidT6w)
-* [动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://mp.weixin.qq.com/s/M4uHxNVKRKm5HPjkNZBnFA)
-* [动态规划:关于完全背包,你该了解这些!](https://mp.weixin.qq.com/s/akwyxlJ4TLvKcw26KB9uJw)
+* [动态规划:关于01背包问题,你该了解这些!](https://programmercarl.com/背包理论基础01背包-1.html)
+* [动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html)
+* [动态规划:关于完全背包,你该了解这些!](https://programmercarl.com/背包问题理论基础完全背包.html)
这次我们再来说一说多重背包
diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md"
index dc4f06f953..f4abc535e0 100644
--- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md"
+++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md"
@@ -35,8 +35,8 @@
关于01背包我如下两篇已经进行深入分析了:
-* [动态规划:关于01背包问题,你该了解这些!](https://mp.weixin.qq.com/s/FwIiPPmR18_AJO5eiidT6w)
-* [动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://mp.weixin.qq.com/s/M4uHxNVKRKm5HPjkNZBnFA)
+* [动态规划:关于01背包问题,你该了解这些!](https://programmercarl.com/背包理论基础01背包-1.html)
+* [动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html)
首先在回顾一下01背包的核心代码
```
@@ -61,7 +61,7 @@ for(int i = 0; i < weight.size(); i++) { // 遍历物品
}
```
-至于为什么,我在[动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://mp.weixin.qq.com/s/M4uHxNVKRKm5HPjkNZBnFA)中也做了讲解。
+至于为什么,我在[动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html)中也做了讲解。
dp状态图如下:
@@ -77,8 +77,8 @@ dp状态图如下:
看过这两篇的话:
-* [动态规划:关于01背包问题,你该了解这些!](https://mp.weixin.qq.com/s/FwIiPPmR18_AJO5eiidT6w)
-* [动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://mp.weixin.qq.com/s/M4uHxNVKRKm5HPjkNZBnFA)
+* [动态规划:关于01背包问题,你该了解这些!](https://programmercarl.com/背包理论基础01背包-1.html)
+* [动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html)
就知道了,01背包中二维dp数组的两个for遍历的先后循序是可以颠倒了,一位dp数组的两个for循环先后循序一定是先遍历物品,再遍历背包容量。
From 45aa719cf0bc90f86e8b408f4b898772f84b5549 Mon Sep 17 00:00:00 2001
From: youngyangyang04 <826123027@qq.com>
Date: Wed, 25 Aug 2021 09:42:27 +0800
Subject: [PATCH 0079/3468] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=2047~541=E8=BF=9E?=
=?UTF-8?q?=E6=8E=A5=E6=9B=B4=E6=96=B0=20=E4=BB=A3=E7=A0=81=E4=B8=A2?=
=?UTF-8?q?=E5=A4=B1?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...76\345\274\217\346\261\202\345\200\274.md" | 48 +++----
...27\345\256\236\347\216\260\346\240\210.md" | 69 ++++++----
...36\347\216\260\351\230\237\345\210\227.md" | 106 +++++----------
...50\345\271\263\346\226\271\346\225\260.md" | 53 +++++++-
...07\345\255\220\345\272\217\345\210\227.md" | 122 +-----------------
...54\345\255\227\347\254\246\344\270\262.md" | 23 ++--
...04\347\232\204\344\272\244\351\233\206.md" | 24 +++-
...\345\255\227\347\254\246\344\270\262II.md" | 39 +++---
...70\347\224\250\345\255\227\347\254\246.md" | 44 ++++++-
...73\351\207\215\345\244\215\351\241\271.md" | 39 ++++--
10 files changed, 267 insertions(+), 300 deletions(-)
diff --git "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md"
index 7eb5bc008c..bcde7d5ba4 100644
--- "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md"
+++ "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md"
@@ -13,7 +13,7 @@
# 150. 逆波兰表达式求值
-[力扣题目链接](https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/)
+https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/
根据 逆波兰表示法,求表达式的值。
@@ -23,7 +23,7 @@
整数除法只保留整数部分。
给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
-
+
示例 1:
* 输入: ["2", "1", "+", "3", " * "]
@@ -40,13 +40,13 @@
* 输出: 22
* 解释:该算式转化为常见的中缀算术表达式为:
((10 * (6 / ((9 + 3) * -11))) + 17) + 5
- = ((10 * (6 / (12 * -11))) + 17) + 5
- = ((10 * (6 / -132)) + 17) + 5
- = ((10 * 0) + 17) + 5
- = (0 + 17) + 5
- = 17 + 5
- = 22
-
+= ((10 * (6 / (12 * -11))) + 17) + 5
+= ((10 * (6 / -132)) + 17) + 5
+= ((10 * 0) + 17) + 5
+= (0 + 17) + 5
+= 17 + 5
+= 22
+
逆波兰表达式:是一种后缀表达式,所谓后缀就是指算符写在后面。
@@ -62,7 +62,7 @@
# 思路
-在上一篇文章中[1047.删除字符串中的所有相邻重复项](https://programmercarl.com/1047.删除字符串中的所有相邻重复项.html)提到了 递归就是用栈来实现的。
+在上一篇文章中[1047.删除字符串中的所有相邻重复项](https://mp.weixin.qq.com/s/1-x6r1wGA9mqIHW5LrMvBg)提到了 递归就是用栈来实现的。
所以**栈与递归之间在某种程度上是可以转换的!** 这一点我们在后续讲解二叉树的时候,会更详细的讲解到。
@@ -70,12 +70,12 @@
但我们没有必要从二叉树的角度去解决这个问题,只要知道逆波兰表达式是用后续遍历的方式把二叉树序列化了,就可以了。
-在进一步看,本题中每一个子表达式要得出一个结果,然后拿这个结果再进行运算,那么**这岂不就是一个相邻字符串消除的过程,和[1047.删除字符串中的所有相邻重复项](https://programmercarl.com/1047.删除字符串中的所有相邻重复项.html)中的对对碰游戏是不是就非常像了。**
+在进一步看,本题中每一个子表达式要得出一个结果,然后拿这个结果再进行运算,那么**这岂不就是一个相邻字符串消除的过程,和[1047.删除字符串中的所有相邻重复项](https://mp.weixin.qq.com/s/1-x6r1wGA9mqIHW5LrMvBg)中的对对碰游戏是不是就非常像了。**
如动画所示:

-相信看完动画大家应该知道,这和[1047. 删除字符串中的所有相邻重复项](https://programmercarl.com/1047.删除字符串中的所有相邻重复项.html)是差不错的,只不过本题不要相邻元素做消除了,而是做运算!
+相信看完动画大家应该知道,这和[1047. 删除字符串中的所有相邻重复项](https://mp.weixin.qq.com/s/1-x6r1wGA9mqIHW5LrMvBg)是差不错的,只不过本题不要相邻元素做消除了,而是做运算!
C++代码如下:
@@ -223,17 +223,19 @@ var evalRPN = function(tokens) {
python3
```python
-def evalRPN(tokens) -> int:
- stack = list()
- for i in range(len(tokens)):
- if tokens[i] not in ["+", "-", "*", "/"]:
- stack.append(tokens[i])
- else:
- tmp1 = stack.pop()
- tmp2 = stack.pop()
- res = eval(tmp2+tokens[i]+tmp1)
- stack.append(str(int(res)))
- return stack[-1]
+class Solution:
+ def evalRPN(self, tokens: List[str]) -> int:
+ stack = []
+ for item in tokens:
+ if item not in {"+", "-", "*", "/"}:
+ stack.append(item)
+ else:
+ first_num, second_num = stack.pop(), stack.pop()
+ stack.append(
+ int(eval(f'{second_num} {item} {first_num}')) # 第一个出来的在运算符后面
+ )
+ return int(stack.pop()) # 如果一开始只有一个数,那么会是字符串形式的
+
```
diff --git "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md"
index d6386cee96..ccf93f1fbd 100644
--- "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md"
+++ "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md"
@@ -12,7 +12,7 @@
# 225. 用队列实现栈
-[力扣题目链接](https://leetcode-cn.com/problems/implement-stack-using-queues/)
+https://leetcode-cn.com/problems/implement-stack-using-queues/
使用队列实现栈的下列操作:
@@ -34,7 +34,7 @@
有的同学可能疑惑这种题目有什么实际工程意义,**其实很多算法题目主要是对知识点的考察和教学意义远大于其工程实践的意义,所以面试题也是这样!**
-刚刚做过[栈与队列:我用栈来实现队列怎么样?](https://programmercarl.com/0232.用栈实现队列.html)的同学可能依然想着用一个输入队列,一个输出队列,就可以模拟栈的功能,仔细想一下还真不行!
+刚刚做过[栈与队列:我用栈来实现队列怎么样?](https://mp.weixin.qq.com/s/Cj6R0qu8rFA7Et9V_ZMjCA)的同学可能依然想着用一个输入队列,一个输出队列,就可以模拟栈的功能,仔细想一下还真不行!
**队列模拟栈,其实一个队列就够了**,那么我们先说一说两个队列来实现栈的思路。
@@ -294,53 +294,66 @@ Python:
```python
from collections import deque
+
class MyStack:
+
def __init__(self):
"""
- Initialize your data structure here.
+ Python普通的Queue或SimpleQueue没有类似于peek的功能
+ 也无法用索引访问,在实现top的时候较为困难。
+
+ 用list可以,但是在使用pop(0)的时候时间复杂度为O(n)
+ 因此这里使用双向队列,我们保证只执行popleft()和append(),因为deque可以用索引访问,可以实现和peek相似的功能
+
+ in - 存所有数据
+ out - 仅在pop的时候会用到
"""
- #使用两个队列来实现
- self.que1 = deque()
- self.que2 = deque()
+ self.queue_in = deque()
+ self.queue_out = deque()
def push(self, x: int) -> None:
"""
- Push element x onto stack.
+ 直接append即可
"""
- self.que1.append(x)
+ self.queue_in.append(x)
+
def pop(self) -> int:
"""
- Removes the element on top of the stack and returns that element.
+ 1. 首先确认不空
+ 2. 因为队列的特殊性,FIFO,所以我们只有在pop()的时候才会使用queue_out
+ 3. 先把queue_in中的所有元素(除了最后一个),依次出列放进queue_out
+ 4. 交换in和out,此时out里只有一个元素
+ 5. 把out中的pop出来,即是原队列的最后一个
+
+ tip:这不能像栈实现队列一样,因为另一个queue也是FIFO,如果执行pop()它不能像
+ stack一样从另一个pop(),所以干脆in只用来存数据,pop()的时候两个进行交换
"""
- size = len(self.que1)
- size -= 1#这里先减一是为了保证最后面的元素
- while size > 0:
- size -= 1
- self.que2.append(self.que1.popleft())
-
+ if self.empty():
+ return None
- result = self.que1.popleft()
- self.que1, self.que2= self.que2, self.que1#将que2和que1交换 que1经过之前的操作应该是空了
- #一定注意不能直接使用que1 = que2 这样que2的改变会影响que1 可以用浅拷贝
- return result
+ for i in range(len(self.queue_in) - 1):
+ self.queue_out.append(self.queue_in.popleft())
+
+ self.queue_in, self.queue_out = self.queue_out, self.queue_in # 交换in和out,这也是为啥in只用来存
+ return self.queue_out.popleft()
def top(self) -> int:
"""
- Get the top element.
+ 1. 首先确认不空
+ 2. 我们仅有in会存放数据,所以返回第一个即可
"""
- return self.que1[-1]
+ if self.empty():
+ return None
+
+ return self.queue_in[-1]
+
def empty(self) -> bool:
"""
- Returns whether the stack is empty.
+ 因为只有in存了数据,只要判断in是不是有数即可
"""
- #print(self.que1)
- if len(self.que1) == 0:
- return True
- else:
- return False
-
+ return len(self.queue_in) == 0
```
diff --git "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md"
index 0afbac6be6..e8bb877e20 100644
--- "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md"
+++ "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md"
@@ -11,7 +11,7 @@
# 232.用栈实现队列
-[力扣题目链接](https://leetcode-cn.com/problems/implement-queue-using-stacks/)
+https://leetcode-cn.com/problems/implement-queue-using-stacks/
使用栈实现队列的下列操作:
@@ -129,54 +129,6 @@ public:
Java:
-使用Stack(堆栈)同名方法:
-```java
-class MyQueue {
- // java中的 Stack 有设计上的缺陷,官方推荐使用 Deque(双端队列) 代替 Stack
- Deque stIn;
- Deque stOut;
- /** Initialize your data structure here. */
- public MyQueue() {
- stIn = new ArrayDeque<>();
- stOut = new ArrayDeque<>();
- }
-
- /** Push element x to the back of queue. */
- public void push(int x) {
- stIn.push(x);
- }
-
- /** Removes the element from in front of queue and returns that element. */
- public int pop() {
- // 只要 stOut 为空,那么就应该将 stIn 中所有的元素倒腾到 stOut 中
- if (stOut.isEmpty()) {
- while (!stIn.isEmpty()) {
- stOut.push(stIn.pop());
- }
- }
- // 再返回 stOut 中的元素
- return stOut.pop();
- }
-
- /** Get the front element. */
- public int peek() {
- // 直接使用已有的pop函数
- int res = this.pop();
- // 因为pop函数弹出了元素res,所以再添加回去
- stOut.push(res);
- return res;
- }
-
- /** Returns whether the queue is empty. */
- public boolean empty() {
- // 当 stIn 栈为空时,说明没有元素可以倒腾到 stOut 栈了
- // 并且 stOut 栈也为空时,说明没有以前从 stIn 中倒腾到的元素了
- return stIn.isEmpty() && stOut.isEmpty();
- }
-}
-```
-
-
```java
class MyQueue {
@@ -234,48 +186,60 @@ class MyQueue {
Python:
```python
-# 使用两个栈实现先进先出的队列
class MyQueue:
+
def __init__(self):
"""
- Initialize your data structure here.
+ in主要负责push,out主要负责pop
"""
- self.stack1 = list()
- self.stack2 = list()
+ self.stack_in = []
+ self.stack_out = []
+
def push(self, x: int) -> None:
"""
- Push element x to the back of queue.
+ 有新元素进来,就往in里面push
"""
- # self.stack1用于接受元素
- self.stack1.append(x)
+ self.stack_in.append(x)
+
def pop(self) -> int:
"""
- Removes the element from in front of queue and returns that element.
+ 1. 检查如果out里面元素,则直接pop
+ 2. 如果out没有元素,就把in里面的元素(除了第一个)依次pop后装进out里面
+ 3. 直接把in剩下的元素pop出来,就是queue头部的
"""
- # self.stack2用于弹出元素,如果self.stack2为[],则将self.stack1中元素全部弹出给self.stack2
- if self.stack2 == []:
- while self.stack1:
- tmp = self.stack1.pop()
- self.stack2.append(tmp)
- return self.stack2.pop()
+ if self.empty:
+ return None
+
+ if self.stack_out:
+ return self.stack_out.pop()
+ else:
+ for i in range(1, len(self.stack_in)):
+ self.stack_out.append(self.stack_in.pop())
+ return self.stack_in.pop()
+
def peek(self) -> int:
"""
- Get the front element.
+ 1. 查out有没有元素,有就把最上面的返回
+ 2. 如果out没有元素,就把in最下面的返回
"""
- if self.stack2 == []:
- while self.stack1:
- tmp = self.stack1.pop()
- self.stack2.append(tmp)
- return self.stack2[-1]
+ if self.empty:
+ return None
+
+ if self.stack_out:
+ return self.stack_out[-1]
+ else:
+ return self.stack_in[0]
+
def empty(self) -> bool:
"""
- Returns whether the queue is empty.
+ 只要in或者out有元素,说明队列不为空
"""
- return self.stack1 == [] and self.stack2 == []
+ return not (self.stack_in or self.stack_out)
+
```
diff --git "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md"
index 8a9c291ecb..3c0f0414e0 100644
--- "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md"
+++ "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md"
@@ -9,7 +9,7 @@
## 279.完全平方数
-[力扣题目链接](https://leetcode-cn.com/problems/perfect-squares/)
+题目地址:https://leetcode-cn.com/problems/perfect-squares/
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
@@ -36,7 +36,7 @@
**我来把题目翻译一下:完全平方数就是物品(可以无限件使用),凑个正整数n就是背包,问凑满这个背包最少有多少物品?**
-感受出来了没,这么浓厚的完全背包氛围,而且和昨天的题目[动态规划:322. 零钱兑换](https://programmercarl.com/0322.零钱兑换.html)就是一样一样的!
+感受出来了没,这么浓厚的完全背包氛围,而且和昨天的题目[动态规划:322. 零钱兑换](https://mp.weixin.qq.com/s/dyk-xNilHzNtVdPPLObSeQ)就是一样一样的!
动规五部曲分析如下:
@@ -70,7 +70,7 @@ dp[0]表示 和为0的完全平方数的最小数量,那么dp[0]一定是0。
如果求排列数就是外层for遍历背包,内层for循环遍历物品。
-在[动态规划:322. 零钱兑换](https://programmercarl.com/0322.零钱兑换.html)中我们就深入探讨了这个问题,本题也是一样的,是求最小数!
+在[动态规划:322. 零钱兑换](https://mp.weixin.qq.com/s/dyk-xNilHzNtVdPPLObSeQ)中我们就深入探讨了这个问题,本题也是一样的,是求最小数!
**所以本题外层for遍历背包,里层for遍历物品,还是外层for遍历物品,内层for遍历背包,都是可以的!**
@@ -146,7 +146,7 @@ public:
## 总结
-如果大家认真做了昨天的题目[动态规划:322. 零钱兑换](https://programmercarl.com/0322.零钱兑换.html),今天这道就非常简单了,一样的套路一样的味道。
+如果大家认真做了昨天的题目[动态规划:322. 零钱兑换](https://mp.weixin.qq.com/s/dyk-xNilHzNtVdPPLObSeQ),今天这道就非常简单了,一样的套路一样的味道。
但如果没有按照「代码随想录」的题目顺序来做的话,做动态规划或者做背包问题,上来就做这道题,那还是挺难的!
@@ -161,6 +161,7 @@ public:
Java:
```Java
class Solution {
+ // 版本一,先遍历物品, 再遍历背包
public int numSquares(int n) {
int max = Integer.MAX_VALUE;
int[] dp = new int[n + 1];
@@ -170,7 +171,9 @@ class Solution {
}
//当和为0时,组合的个数为0
dp[0] = 0;
+ // 遍历物品
for (int i = 1; i * i <= n; i++) {
+ // 遍历背包
for (int j = i * i; j <= n; j++) {
if (dp[j - i * i] != max) {
dp[j] = Math.min(dp[j], dp[j - i * i] + 1);
@@ -180,6 +183,28 @@ class Solution {
return dp[n];
}
}
+
+class Solution {
+ // 版本二, 先遍历背包, 再遍历物品
+ public int numSquares(int n) {
+ int max = Integer.MAX_VALUE;
+ int[] dp = new int[n + 1];
+ // 初始化
+ for (int j = 0; j <= n; j++) {
+ dp[j] = max;
+ }
+ // 当和为0时,组合的个数为0
+ dp[0] = 0;
+ // 遍历背包
+ for (int j = 1; j <= n; j++) {
+ // 遍历物品
+ for (int i = 1; i * i <= j; i++) {
+ dp[j] = Math.min(dp[j], dp[j - i * i] + 1);
+ }
+ }
+ return dp[n];
+ }
+}
```
Python:
@@ -187,7 +212,7 @@ Python:
```python3
class Solution:
def numSquares(self, n: int) -> int:
- '''版本一'''
+ '''版本一,先遍历背包, 再遍历物品'''
# 初始化
nums = [i**2 for i in range(1, n + 1) if i**2 <= n]
dp = [10**4]*(n + 1)
@@ -201,7 +226,7 @@ class Solution:
return dp[n]
def numSquares1(self, n: int) -> int:
- '''版本二'''
+ '''版本二, 先遍历物品, 再遍历背包'''
# 初始化
nums = [i**2 for i in range(1, n + 1) if i**2 <= n]
dp = [10**4]*(n + 1)
@@ -217,6 +242,22 @@ class Solution:
Python3:
```python
class Solution:
+ '''版本一,先遍历背包, 再遍历物品'''
+ def numSquares(self, n: int) -> int:
+ dp = [n] * (n + 1)
+ dp[0] = 0
+ # 遍历背包
+ for j in range(1, n+1):
+ for i in range(1, n):
+ num = i ** 2
+ if num > j: break
+ # 遍历物品
+ if j - num >= 0:
+ dp[j] = min(dp[j], dp[j - num] + 1)
+ return dp[n]
+
+class Solution:
+ '''版本二, 先遍历物品, 再遍历背包'''
def numSquares(self, n: int) -> int:
# 初始化
# 组成和的完全平方数的最多个数,就是只用1构成
diff --git "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md"
index b2e942eda3..0ac6e78440 100644
--- "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md"
+++ "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md"
@@ -8,13 +8,13 @@
## 300.最长递增子序列
-[力扣题目链接](https://leetcode-cn.com/problems/longest-increasing-subsequence/)
+题目链接:https://leetcode-cn.com/problems/longest-increasing-subsequence/
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
-
+
示例 1:
输入:nums = [10,9,2,5,3,7,101,18]
输出:4
@@ -27,13 +27,12 @@
示例 3:
输入:nums = [7,7,7,7,7,7,7]
输出:1
-
+
提示:
* 1 <= nums.length <= 2500
* -10^4 <= nums[i] <= 104
-## 方法一 动态规划
## 思路
最长上升子序列是动规的经典题目,这里dp[i]是可以根据dp[j] (j < i)推导出来的,那么依然用动规五部曲来分析详细一波:
@@ -189,121 +188,6 @@ const lengthOfLIS = (nums) => {
return result;
};
```
-*复杂度分析*
-- 时间复杂度:O(n^2)。数组 nums 的长度为 n,我们依次用数组中的元素去遍历 dp 数组,而遍历 dp 数组时需要进行 O(n) 次搜索,所以总时间复杂度为 O(n^2)。
-- 空间复杂度:O(n),需要额外使用长度为 n 的 dp 数组。
-
-
-## 方法二 贪心策略+二分搜索
-
-使用贪心策略和二分搜索可以进一步将算法时间复杂度将为O(nlogn)。
-
-## 思路
-
-为了使得到的子序列尽可能长,我们需要使序列上升得尽可能慢。
-
-对于长度为n的数组 nums,我们从0到n-1依次遍历数组中的每个元素nums[i],更新在0到i范围内最长上升子序列的长度len,以及 在0到i范围内,上升子序列的长度为1到len时,对应长度子序列最右端的最小值,将结果保存在list中。实际编码过程中,list长度即为len。
-
-## 可行性
-当我们遍历完数组nums中第n-1个元素时,list中保存的是0到n-1范围内最长上升子序列的长度,即为所求。
-
-## 算法复杂度分析
-1. list中的元素是单调递增的。可以用反证法来证明:假设对于0<=i=list[j],那么我们可以在list[j]对应的子序列中删除最后j-i个元素得到长度与list[i]相同的子序列,其最右端的值maxlist[len-1],此时,list中子序列长度为1到len的对应的最右端最小值不变,并新增长度为len+1的子序列,最右端的最小值为nums[i],时间复杂度O(1);
-
- 2. if(nums[i]<=list[len-1]),此时,我们可以在0到len-1范围内找到k,list[k]为>=nums[i]的最小值,由于list单调递增,所以我们可以使用二分搜索在O(logn)的时间复杂度内找到k。
- 1. 对于0<=jnums[i];
-
-3. 综上,算法时间复杂度为O(nlogn),空间复杂度为O(n),需要O(n)的空间保存list。
-
-代码如下
-
-Java
-```java
-class Solution {
- public int lengthOfLIS(int[] nums) {
- int n = nums.length;
- if(n==0){return 0;}
-
- List list=new ArrayList<>();
- list.add(nums[0]);
- for (int i = 1; i < n; ++i) {
- if (nums[i] > list.get(list.size()-1)) {
- list.add(nums[i]);
- } else {
- int k=binarySearch(list,nums[i]);
- list.set(k,nums[i]);
- }
- }
- return list.size();
- }
-
- int binarySearch(Listlist, int num){
- int len=list.size();
- int l=0,r=len-1,ans=len-1;
- while(l<=r){
- int mid=l+(r-l)/2;
- if(list.get(mid) list[len-1]) {
- list[len++]=nums[i];
- } else {
- int k=binarySearch(list,len,nums[i]);
- list[k]=nums[i];
- }
- }
- return len;
- }
-
- int binarySearch(int[] list,int len, int num){
-
- int l=0,r=len-1,ans=len-1;
- while(l<=r){
- int mid=l+(r-l)/2;
- if(list[mid] None:
-# """
-# Do not return anything, modify s in-place instead.
-# """
- # 不需要判别是偶数个还是奇数个序列,因为奇数个的时候,中间那个不需要交换就可
-# for i in range(len(s)//2):
-# s[i], s[len(s)-1-i] = s[len(s)-1-i], s[i]
-# return s
+
```
Go:
diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md"
index 49fe926b2a..62abf6399f 100644
--- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md"
+++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md"
@@ -14,7 +14,7 @@
## 349. 两个数组的交集
-[力扣题目链接](https://leetcode-cn.com/problems/intersection-of-two-arrays/)
+https://leetcode-cn.com/problems/intersection-of-two-arrays/
题意:给定两个数组,编写一个函数来计算它们的交集。
@@ -32,7 +32,7 @@
这道题用暴力的解法时间复杂度是O(n^2),那来看看使用哈希法进一步优化。
-那么用数组来做哈希表也是不错的选择,例如[242. 有效的字母异位词](https://programmercarl.com/0242.有效的字母异位词.html)
+那么用数组来做哈希表也是不错的选择,例如[242. 有效的字母异位词](https://mp.weixin.qq.com/s/ffS8jaVFNUWyfn_8T31IdA)
但是要注意,**使用数组来做哈希的题目,是因为题目都限制了数值的大小。**
@@ -143,6 +143,26 @@ func intersection(nums1 []int, nums2 []int) []int {
return res
}
```
+```golang
+//优化版,利用set,减少count统计
+func intersection(nums1 []int, nums2 []int) []int {
+ set:=make(map[int]struct{},0)
+ res:=make([]int,0)
+ for _,v:=range nums1{
+ if _,ok:=set[v];!ok{
+ set[v]=struct{}{}
+ }
+ }
+ for _,v:=range nums2{
+ //如果存在于上一个数组中,则加入结果集,并清空该set值
+ if _,ok:=set[v];ok{
+ res=append(res,v)
+ delete(set, v)
+ }
+ }
+ return res
+}
+```
javaScript:
diff --git "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md"
index 469b568576..02713c65a4 100644
--- "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md"
+++ "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md"
@@ -12,7 +12,7 @@
# 541. 反转字符串II
-[力扣题目链接](https://leetcode-cn.com/problems/reverse-string-ii/)
+https://leetcode-cn.com/problems/reverse-string-ii/
给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。
@@ -65,7 +65,7 @@ public:
};
```
-那么我们也可以实现自己的reverse函数,其实和题目[344. 反转字符串](https://programmercarl.com/0344.反转字符串.html)道理是一样的。
+那么我们也可以实现自己的reverse函数,其实和题目[344. 反转字符串](https://mp.weixin.qq.com/s/_rNm66OJVl92gBDIbGpA3w)道理是一样的。
下面我实现的reverse函数区间是左闭右闭区间,代码如下:
@@ -155,34 +155,27 @@ class Solution {
Python:
```python
-
-class Solution(object):
- def reverseStr(self, s, k):
+class Solution:
+ def reverseStr(self, s: str, k: int) -> str:
"""
- :type s: str
- :type k: int
- :rtype: str
+ 1. 使用range(start, end, step)来确定需要调换的初始位置
+ 2. 对于字符串s = 'abc',如果使用s[0:999] ===> 'abc'。字符串末尾如果超过最大长度,则会返回至字符串最后一个值,这个特性可以避免一些边界条件的处理。
+ 3. 用切片整体替换,而不是一个个替换.
"""
- from functools import reduce
- # turn s into a list
- s = list(s)
-
- # another way to simply use a[::-1], but i feel this is easier to understand
- def reverse(s):
- left, right = 0, len(s) - 1
+ def reverse_substring(text):
+ left, right = 0, len(text) - 1
while left < right:
- s[left], s[right] = s[right], s[left]
+ text[left], text[right] = text[right], text[left]
left += 1
right -= 1
- return s
+ return text
- # make sure we reverse each 2k elements
- for i in range(0, len(s), 2*k):
- s[i:(i+k)] = reverse(s[i:(i+k)])
-
- # combine list into str.
- return reduce(lambda a, b: a+b, s)
+ res = list(s)
+
+ for cur in range(0, len(s), 2 * k):
+ res[cur: cur + k] = reverse_substring(res[cur: cur + k])
+ return ''.join(res)
```
diff --git "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md"
index 391511853c..a789373b7c 100644
--- "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md"
+++ "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md"
@@ -10,7 +10,7 @@
# 1002. 查找常用字符
-[力扣题目链接](https://leetcode-cn.com/problems/find-common-characters/)
+https://leetcode-cn.com/problems/find-common-characters/
给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。
@@ -23,7 +23,7 @@
【示例二】
输入:["cool","lock","cook"]
输出:["c","o"]
-
+
# 思路
@@ -40,9 +40,9 @@
可以看出这是指数级别的时间复杂度,非常高,而且代码实现也不容易,因为要统计 重复的字符,还要适当的替换或者去重。
-那我们还是哈希法吧。如果对哈希法不了解,可以看这篇:[关于哈希表,你该了解这些!](https://programmercarl.com/哈希表理论基础.html)。
+那我们还是哈希法吧。如果对哈希法不了解,可以看这篇:[关于哈希表,你该了解这些!](https://mp.weixin.qq.com/s/RSUANESA_tkhKhYe3ZR8Jg)。
-如果对用数组来做哈希法不了解的话,可以看这篇:[把数组当做哈希表来用,很巧妙!](https://programmercarl.com/0242.有效的字母异位词.html)。
+如果对用数组来做哈希法不了解的话,可以看这篇:[把数组当做哈希表来用,很巧妙!](https://mp.weixin.qq.com/s/ffS8jaVFNUWyfn_8T31IdA)。
了解了哈希法,理解了数组在哈希法中的应用之后,可以来看解题思路了。
@@ -233,7 +233,41 @@ var commonChars = function (words) {
return res
};
```
-
+GO
+```golang
+func commonChars(words []string) []string {
+ length:=len(words)
+ fre:=make([][]int,0)//统计每个字符串的词频
+ res:=make([]string,0)
+ //统计词频
+ for i:=0;ib{
+ return b
+ }
+ return a
+}
+```
-----------------------
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
* B站视频:[代码随想录](https://space.bilibili.com/525438321)
diff --git "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md"
index 52d2bc95c0..b60a8d1d9f 100644
--- "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md"
+++ "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md"
@@ -13,7 +13,7 @@
# 1047. 删除字符串中的所有相邻重复项
-[力扣题目链接](https://leetcode-cn.com/problems/remove-all-adjacent-duplicates-in-string/)
+https://leetcode-cn.com/problems/remove-all-adjacent-duplicates-in-string/
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
@@ -26,7 +26,7 @@
* 输入:"abbaca"
* 输出:"ca"
* 解释:例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。
-
+
提示:
* 1 <= S.length <= 20000
@@ -197,15 +197,38 @@ class Solution {
Python:
```python3
+# 方法一,使用栈,推荐!
+class Solution:
+ def removeDuplicates(self, s: str) -> str:
+ res = list()
+ for item in s:
+ if res and res[-1] == item:
+ res.pop()
+ else:
+ res.append(item)
+ return "".join(res) # 字符串拼接
+```
+
+```python3
+# 方法二,使用双指针模拟栈,如果不让用栈可以作为备选方法。
class Solution:
def removeDuplicates(self, s: str) -> str:
- t = list()
- for i in s:
- if t and t[-1] == i:
- t.pop(-1)
+ res = list(s)
+ slow = fast = 0
+ length = len(res)
+
+ while fast < length:
+ # 如果一样直接换,不一样会把后面的填在slow的位置
+ res[slow] = res[fast]
+
+ # 如果发现和前一个一样,就退一格指针
+ if slow > 0 and res[slow] == res[slow - 1]:
+ slow -= 1
else:
- t.append(i)
- return "".join(t) # 字符串拼接
+ slow += 1
+ fast += 1
+
+ return ''.join(res[0: slow])
```
Go:
From a7e929b1d4db15cdf6852109ecc535cf8130c537 Mon Sep 17 00:00:00 2001
From: XuDaHaoRen <1547794387@qq.com>
Date: Wed, 25 Aug 2021 10:04:57 +0800
Subject: [PATCH 0080/3468] =?UTF-8?q?=E8=83=8C=E5=8C=85=E6=80=BB=E7=BB=93~?=
=?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E6=80=BB=E7=BB=93=E8=BF=9E=E6=8E=A5?=
=?UTF-8?q?=E6=9B=B4=E6=96=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...46\347\235\200\345\233\236\346\272\257.md" | 12 +--
...21\346\200\273\347\273\223\347\257\207.md" | 75 ++++++-------
...00\350\277\255\344\273\243\346\263\225.md" | 6 +-
...55\344\273\243\351\201\215\345\216\206.md" | 2 +-
...30\346\200\273\347\273\223\347\257\207.md" | 36 +++----
...22\346\200\273\347\273\223\347\257\207.md" | 100 +++++++++---------
...06\350\256\272\345\237\272\347\241\200.md" | 2 +-
7 files changed, 117 insertions(+), 116 deletions(-)
diff --git "a/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md" "b/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md"
index 0f768e0fea..7b0ccad77b 100644
--- "a/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md"
+++ "b/problems/\344\272\214\345\217\211\346\240\221\344\270\255\351\200\222\345\275\222\345\270\246\347\235\200\345\233\236\346\272\257.md"
@@ -11,11 +11,11 @@
> 补充一波
-昨天的总结篇中[还在玩耍的你,该总结啦!(本周小结之二叉树)](https://mp.weixin.qq.com/s/QMBUTYnoaNfsVHlUADEzKg),有两处问题需要说明一波。
+昨天的总结篇中[还在玩耍的你,该总结啦!(本周小结之二叉树)](https://programmercarl.com/周总结/20201003二叉树周末总结.html),有两处问题需要说明一波。
## 求相同的树
-[还在玩耍的你,该总结啦!(本周小结之二叉树)](https://mp.weixin.qq.com/s/QMBUTYnoaNfsVHlUADEzKg)中求100.相同的树的代码中,我笔误贴出了 求对称树的代码了,细心的同学应该都发现了。
+[还在玩耍的你,该总结啦!(本周小结之二叉树)](https://programmercarl.com/周总结/20201003二叉树周末总结.html)中求100.相同的树的代码中,我笔误贴出了 求对称树的代码了,细心的同学应该都发现了。
那么如下我再给出求100. 相同的树 的代码,如下:
@@ -42,13 +42,13 @@ public:
};
```
-以上的代码相对于:[二叉树:我对称么?](https://mp.weixin.qq.com/s/Kgf0gjvlDlNDfKIH2b1Oxg) 仅仅修改了变量的名字(为了符合判断相同树的语境)和 遍历的顺序。
+以上的代码相对于:[二叉树:我对称么?](https://programmercarl.com/0101.对称二叉树.html) 仅仅修改了变量的名字(为了符合判断相同树的语境)和 遍历的顺序。
-大家应该会体会到:**认清[判断对称树](https://mp.weixin.qq.com/s/Kgf0gjvlDlNDfKIH2b1Oxg)本质之后, 对称树的代码 稍作修改 就可以直接用来AC 100.相同的树。**
+大家应该会体会到:**认清[判断对称树](https://programmercarl.com/0101.对称二叉树.html)本质之后, 对称树的代码 稍作修改 就可以直接用来AC 100.相同的树。**
## 递归中隐藏着回溯
-在[二叉树:找我的所有路径?](https://mp.weixin.qq.com/s/Osw4LQD2xVUnCJ-9jrYxJA)中我强调了本题其实是用到了回溯的,并且给出了第一个版本的代码,把回溯的过程充分的提现了出来。
+在[二叉树:找我的所有路径?](https://programmercarl.com/0257.二叉树的所有路径.html)中我强调了本题其实是用到了回溯的,并且给出了第一个版本的代码,把回溯的过程充分的提现了出来。
如下的代码充分的体现出回溯:(257. 二叉树的所有路径)
@@ -166,7 +166,7 @@ if (cur->right) {
**大家应该可以感受出来,如果把 `path + "->"`作为函数参数就是可以的,因为并有没有改变path的数值,执行完递归函数之后,path依然是之前的数值(相当于回溯了)**
-如果有点遗忘了,建议把这篇[二叉树:找我的所有路径?](https://mp.weixin.qq.com/s/Osw4LQD2xVUnCJ-9jrYxJA)在仔细看一下,然后再看这里的总结,相信会豁然开朗。
+如果有点遗忘了,建议把这篇[二叉树:找我的所有路径?](https://programmercarl.com/0257.二叉树的所有路径.html)在仔细看一下,然后再看这里的总结,相信会豁然开朗。
这里我尽量把逻辑的每一个细节都抠出来展现了,希望对大家有所帮助!
diff --git "a/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md" "b/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md"
index 43276ec9d7..ee046366ec 100644
--- "a/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md"
+++ "b/problems/\344\272\214\345\217\211\346\240\221\346\200\273\347\273\223\347\257\207.md"
@@ -22,105 +22,106 @@
## 二叉树的理论基础
-* [关于二叉树,你该了解这些!](https://mp.weixin.qq.com/s/_ymfWYvTNd2GvWvC5HOE4A):二叉树的种类、存储方式、遍历方式、定义方式
+* [关于二叉树,你该了解这些!](https://programmercarl.com/二叉树理论基础.html):二叉树的种类、存储方式、遍历方式、定义方式
## 二叉树的遍历方式
* 深度优先遍历
- * [二叉树:前中后序递归法](https://mp.weixin.qq.com/s/PwVIfxDlT3kRgMASWAMGhA):递归三部曲初次亮相
- * [二叉树:前中后序迭代法(一)](https://mp.weixin.qq.com/s/c_zCrGHIVlBjUH_hJtghCg):通过栈模拟递归
- * [二叉树:前中后序迭代法(二)统一风格](https://mp.weixin.qq.com/s/WKg0Ty1_3SZkztpHubZPRg)
+ * [二叉树:前中后序递归法](https://programmercarl.com/二叉树的递归遍历.html):递归三部曲初次亮相
+ * [二叉树:前中后序迭代法(一)](https://programmercarl.com/二叉树的迭代遍历.html):通过栈模拟递归
+ * [二叉树:前中后序迭代法(二)统一风格](https://programmercarl.com/二叉树的统一迭代法.html)
* 广度优先遍历
- * [二叉树的层序遍历](https://mp.weixin.qq.com/s/Gb3BjakIKGNpup2jYtTzog):通过队列模拟
+ * [二叉树的层序遍历](https://programmercarl.com/0102.二叉树的层序遍历.html):通过队列模拟
## 求二叉树的属性
-* [二叉树:是否对称](https://mp.weixin.qq.com/s/Kgf0gjvlDlNDfKIH2b1Oxg)
+* [二叉树:是否对称](https://programmercarl.com/0101.对称二叉树.html)
* 递归:后序,比较的是根节点的左子树与右子树是不是相互翻转
* 迭代:使用队列/栈将两个节点顺序放入容器中进行比较
-* [二叉树:求最大深度](https://mp.weixin.qq.com/s/guKwV-gSNbA1CcbvkMtHBg)
+* [二叉树:求最大深度](https://programmercarl.com/0104.二叉树的最大深度.html)
* 递归:后序,求根节点最大高度就是最大深度,通过递归函数的返回值做计算树的高度
* 迭代:层序遍历
-* [二叉树:求最小深度](https://mp.weixin.qq.com/s/BH8-gPC3_QlqICDg7rGSGA)
+* [二叉树:求最小深度](https://programmercarl.com/0111.二叉树的最小深度.html)
* 递归:后序,求根节点最小高度就是最小深度,注意最小深度的定义
* 迭代:层序遍历
-* [二叉树:求有多少个节点](https://mp.weixin.qq.com/s/2_eAjzw-D0va9y4RJgSmXw)
+* [二叉树:求有多少个节点](https://programmercarl.com/0222.完全二叉树的节点个数.html)
* 递归:后序,通过递归函数的返回值计算节点数量
* 迭代:层序遍历
-* [二叉树:是否平衡](https://mp.weixin.qq.com/s/isUS-0HDYknmC0Rr4R8mww)
+* [二叉树:是否平衡](https://programmercarl.com/0110.平衡二叉树.html)
* 递归:后序,注意后序求高度和前序求深度,递归过程判断高度差
* 迭代:效率很低,不推荐
-* [二叉树:找所有路径](https://mp.weixin.qq.com/s/Osw4LQD2xVUnCJ-9jrYxJA)
+* [二叉树:找所有路径](https://programmercarl.com/0257.二叉树的所有路径.html)
* 递归:前序,方便让父节点指向子节点,涉及回溯处理根节点到叶子的所有路径
* 迭代:一个栈模拟递归,一个栈来存放对应的遍历路径
-* [二叉树:递归中如何隐藏着回溯](https://mp.weixin.qq.com/s/ivLkHzWdhjQQD1rQWe6zWA)
- * 详解[二叉树:找所有路径](https://mp.weixin.qq.com/s/Osw4LQD2xVUnCJ-9jrYxJA)中递归如何隐藏着回溯
-* [二叉树:求左叶子之和](https://mp.weixin.qq.com/s/gBAgmmFielojU5Wx3wqFTA)
+* [二叉树:递归中如何隐藏着回溯](https://programmercarl.com/二叉树中递归带着回溯.html)
+ * 详解[二叉树:找所有路径](https://programmercarl.com/0257.二叉树的所有路径.html)中递归如何隐藏着回溯
+* [二叉树:求左叶子之和](https://programmercarl.com/0404.左叶子之和.html)
* 递归:后序,必须三层约束条件,才能判断是否是左叶子。
* 迭代:直接模拟后序遍历
-* [二叉树:求左下角的值](https://mp.weixin.qq.com/s/MH2gbLvzQ91jHPKqiub0Nw)
+* [二叉树:求左下角的值](https://programmercarl.com/0513.找树左下角的值.html)
* 递归:顺序无所谓,优先左孩子搜索,同时找深度最大的叶子节点。
* 迭代:层序遍历找最后一行最左边
-* [二叉树:求路径总和](https://mp.weixin.qq.com/s/6TWAVjxQ34kVqROWgcRFOg)
+* [二叉树:求路径总和](https://programmercarl.com/0112.路径总和.html)
* 递归:顺序无所谓,递归函数返回值为bool类型是为了搜索一条边,没有返回值是搜索整棵树。
* 迭代:栈里元素不仅要记录节点指针,还要记录从头结点到该节点的路径数值总和
## 二叉树的修改与构造
-* [翻转二叉树](https://mp.weixin.qq.com/s/6gY1MiXrnm-khAAJiIb5Bg)
+* [翻转二叉树](https://programmercarl.com/0226.翻转二叉树.html)
* 递归:前序,交换左右孩子
* 迭代:直接模拟前序遍历
-* [构造二叉树](https://mp.weixin.qq.com/s/7r66ap2s-shvVvlZxo59xg)
+* [构造二叉树](https://programmercarl.com/0106.从中序与后序遍历序列构造二叉树.html)
* 递归:前序,重点在于找分割点,分左右区间构造
* 迭代:比较复杂,意义不大
-* [构造最大的二叉树](https://mp.weixin.qq.com/s/1iWJV6Aov23A7xCF4nV88w)
+* [构造最大的二叉树](https://programmercarl.com/0654.最大二叉树.html)
* 递归:前序,分割点为数组最大值,分左右区间构造
* 迭代:比较复杂,意义不大
-* [合并两个二叉树](https://mp.weixin.qq.com/s/3f5fbjOFaOX_4MXzZ97LsQ)
+* [合并两个二叉树](https://programmercarl.com/0617.合并二叉树.html)
* 递归:前序,同时操作两个树的节点,注意合并的规则
* 迭代:使用队列,类似层序遍历
## 求二叉搜索树的属性
-* [二叉搜索树中的搜索](https://mp.weixin.qq.com/s/vsKrWRlETxCVsiRr8v_hHg)
+* [二叉搜索树中的搜索](https://programmercarl.com/0700.二叉搜索树中的搜索.html)
* 递归:二叉搜索树的递归是有方向的
* 迭代:因为有方向,所以迭代法很简单
-* [是不是二叉搜索树](https://mp.weixin.qq.com/s/8odY9iUX5eSi0eRFSXFD4Q)
+* [是不是二叉搜索树](https://programmercarl.com/0098.验证二叉搜索树.html)
* 递归:中序,相当于变成了判断一个序列是不是递增的
* 迭代:模拟中序,逻辑相同
-* [求二叉搜索树的最小绝对差](https://mp.weixin.qq.com/s/Hwzml6698uP3qQCC1ctUQQ)
+* [求二叉搜索树的最小绝对差](https://programmercarl.com/0530.二叉搜索树的最小绝对差.html)
* 递归:中序,双指针操作
* 迭代:模拟中序,逻辑相同
-* [求二叉搜索树的众数](https://mp.weixin.qq.com/s/KSAr6OVQIMC-uZ8MEAnGHg)
+* [求二叉搜索树的众数](https://programmercarl.com/0501.二叉搜索树中的众数.html)
+
* 递归:中序,清空结果集的技巧,遍历一遍便可求众数集合
- * 迭代:模拟中序,逻辑相同
-* [二叉搜索树转成累加树](https://mp.weixin.qq.com/s/hZtJh4T5lIGBarY-lZJf6Q)
+ * [二叉搜索树转成累加树](https://programmercarl.com/0538.把二叉搜索树转换为累加树.html)
+
* 递归:中序,双指针操作累加
* 迭代:模拟中序,逻辑相同
## 二叉树公共祖先问题
-* [二叉树的公共祖先问题](https://mp.weixin.qq.com/s/n6Rk3nc_X3TSkhXHrVmBTQ)
+* [二叉树的公共祖先问题](https://programmercarl.com/0236.二叉树的最近公共祖先.html)
* 递归:后序,回溯,找到左子树出现目标值,右子树节点目标值的节点。
* 迭代:不适合模拟回溯
-* [二叉搜索树的公共祖先问题](https://mp.weixin.qq.com/s/Ja9dVw2QhBcg_vV-1fkiCg)
+* [二叉搜索树的公共祖先问题](https://programmercarl.com/0235.二叉搜索树的最近公共祖先.html)
* 递归:顺序无所谓,如果节点的数值在目标区间就是最近公共祖先
* 迭代:按序遍历
## 二叉搜索树的修改与构造
-* [二叉搜索树中的插入操作](https://mp.weixin.qq.com/s/lwKkLQcfbCNX2W-5SOeZEA)
+* [二叉搜索树中的插入操作](https://programmercarl.com/0701.二叉搜索树中的插入操作.html)
* 递归:顺序无所谓,通过递归函数返回值添加节点
* 迭代:按序遍历,需要记录插入父节点,这样才能做插入操作
-* [二叉搜索树中的删除操作](https://mp.weixin.qq.com/s/-p-Txvch1FFk3ygKLjPAKw)
+* [二叉搜索树中的删除操作](https://programmercarl.com/0450.删除二叉搜索树中的节点.html)
* 递归:前序,想清楚删除非叶子节点的情况
* 迭代:有序遍历,较复杂
-* [修剪二叉搜索树](https://mp.weixin.qq.com/s/QzmGfYUMUWGkbRj7-ozHoQ)
+* [修剪二叉搜索树](https://programmercarl.com/0669.修剪二叉搜索树.html)
* 递归:前序,通过递归函数返回值删除节点
* 迭代:有序遍历,较复杂
-* [构造二叉搜索树](https://mp.weixin.qq.com/s/sy3ygnouaZVJs8lhFgl9mw)
+* [构造二叉搜索树](https://programmercarl.com/0108.将有序数组转换为二叉搜索树.html)
* 递归:前序,数组中间节点分割
* 迭代:较复杂,通过三个队列来模拟
@@ -130,10 +131,10 @@
**每周小结都会对大家的疑问做统一解答,并且对每周的内容进行拓展和补充,所以一定要看,将细碎知识点一网打尽!**
-* [本周小结!(二叉树系列一)](https://mp.weixin.qq.com/s/JWmTeC7aKbBfGx4TY6uwuQ)
-* [本周小结!(二叉树系列二)](https://mp.weixin.qq.com/s/QMBUTYnoaNfsVHlUADEzKg)
-* [本周小结!(二叉树系列三)](https://mp.weixin.qq.com/s/JLLpx3a_8jurXcz6ovgxtg)
-* [本周小结!(二叉树系列四)](https://mp.weixin.qq.com/s/CbdtOTP0N-HIP7DR203tSg)
+* [本周小结!(二叉树系列一)](https://programmercarl.com/周总结/20200927二叉树周末总结.html)
+* [本周小结!(二叉树系列二)](https://programmercarl.com/周总结/20201003二叉树周末总结.html)
+* [本周小结!(二叉树系列三)](https://programmercarl.com/周总结/20201010二叉树周末总结.html)
+* [本周小结!(二叉树系列四)](https://programmercarl.com/周总结/20201017二叉树周末总结.html)
## 最后总结
@@ -145,7 +146,7 @@
* 求二叉搜索树的属性,一定是中序了,要不白瞎了有序性了。
-注意在普通二叉树的属性中,我用的是一般为后序,例如单纯求深度就用前序, [二叉树:找所有路径](https://mp.weixin.qq.com/s/Osw4LQD2xVUnCJ-9jrYxJA)也用了前序,这是为了方便让父节点指向子节点。
+注意在普通二叉树的属性中,我用的是一般为后序,例如单纯求深度就用前序,[二叉树:找所有路径](https://programmercarl.com/0257.二叉树的所有路径.html)也用了前序,这是为了方便让父节点指向子节点。
所以求普通二叉树的属性还是要具体问题具体分析。
diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md"
index d105f4b80d..d8299e10a2 100644
--- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md"
+++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\347\273\237\344\270\200\350\277\255\344\273\243\346\263\225.md"
@@ -12,9 +12,9 @@
> 统一写法是一种什么感觉
-此时我们在[二叉树:一入递归深似海,从此offer是路人](https://mp.weixin.qq.com/s/Ww60X5mIKWdMQV4cN3ejOA)中用递归的方式,实现了二叉树前中后序的遍历。
+此时我们在[二叉树:一入递归深似海,从此offer是路人](https://programmercarl.com/二叉树的递归遍历.html)中用递归的方式,实现了二叉树前中后序的遍历。
-在[二叉树:听说递归能做的,栈也能做!](https://mp.weixin.qq.com/s/OH7aCVJ5-Gi32PkNCoZk4A)中用栈实现了二叉树前后中序的迭代遍历(非递归)。
+在[二叉树:听说递归能做的,栈也能做!](https://programmercarl.com/二叉树的迭代遍历.html)中用栈实现了二叉树前后中序的迭代遍历(非递归)。
之后我们发现**迭代法实现的先中后序,其实风格也不是那么统一,除了先序和后序,有关联,中序完全就是另一个风格了,一会用栈遍历,一会又用指针来遍历。**
@@ -24,7 +24,7 @@
**重头戏来了,接下来介绍一下统一写法。**
-我们以中序遍历为例,在[二叉树:听说递归能做的,栈也能做!](https://mp.weixin.qq.com/s/OH7aCVJ5-Gi32PkNCoZk4A)中提到说使用栈的话,**无法同时解决访问节点(遍历节点)和处理节点(将元素放进结果集)不一致的情况**。
+我们以中序遍历为例,在[二叉树:听说递归能做的,栈也能做!](https://programmercarl.com/二叉树的迭代遍历.html)中提到说使用栈的话,**无法同时解决访问节点(遍历节点)和处理节点(将元素放进结果集)不一致的情况**。
**那我们就将访问的节点放入栈中,把要处理的节点也放入栈中但是要做标记。**
diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md"
index faa580e09e..a1d65070f4 100644
--- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md"
+++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md"
@@ -19,7 +19,7 @@
为什么可以用迭代法(非递归的方式)来实现二叉树的前后中序遍历呢?
-我们在[栈与队列:匹配问题都是栈的强项](https://mp.weixin.qq.com/s/1-x6r1wGA9mqIHW5LrMvBg)中提到了,**递归的实现就是:每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中**,然后递归返回的时候,从栈顶弹出上一次递归的各项参数,所以这就是递归为什么可以返回上一层位置的原因。
+我们在[栈与队列:匹配问题都是栈的强项](https://programmercarl.com/1047.删除字符串中的所有相邻重复项.html)中提到了,**递归的实现就是:每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中**,然后递归返回的时候,从栈顶弹出上一次递归的各项参数,所以这就是递归为什么可以返回上一层位置的原因。
此时大家应该知道我们用栈也可以是实现二叉树的前后中序遍历了。
diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md"
index d186aaf950..a3443ecb55 100644
--- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md"
+++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222-\350\202\241\347\245\250\351\227\256\351\242\230\346\200\273\347\273\223\347\257\207.md"
@@ -10,16 +10,16 @@

-* [动态规划:121.买卖股票的最佳时机](https://mp.weixin.qq.com/s/keWo5qYJY4zmHn3amfXdfQ)
-* [动态规划:122.买卖股票的最佳时机II](https://mp.weixin.qq.com/s/d4TRWFuhaY83HPa6t5ZL-w)
-* [动态规划:123.买卖股票的最佳时机III](https://mp.weixin.qq.com/s/Sbs157mlVDtAR0gbLpdKzg)
-* [动态规划:188.买卖股票的最佳时机IV](https://mp.weixin.qq.com/s/jtxZJWAo2y5sUsW647Z5cw)
-* [动态规划:309.最佳买卖股票时机含冷冻期](https://mp.weixin.qq.com/s/TczJGFAPnkjH9ET8kwH1OA)
-* [动态规划:714.买卖股票的最佳时机含手续费](https://mp.weixin.qq.com/s/2Cd_uINjerZ25VHH0K2IBQ)
+* [动态规划:121.买卖股票的最佳时机](https://programmercarl.com/0121.买卖股票的最佳时机.html)
+* [动态规划:122.买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II(动态规划).html)
+* [动态规划:123.买卖股票的最佳时机III](https://programmercarl.com/0123.买卖股票的最佳时机III.html)
+* [动态规划:188.买卖股票的最佳时机IV](https://programmercarl.com/0188.买卖股票的最佳时机IV.html)
+* [动态规划:309.最佳买卖股票时机含冷冻期](https://programmercarl.com/0309.最佳买卖股票时机含冷冻期.html)
+* [动态规划:714.买卖股票的最佳时机含手续费](https://programmercarl.com/0714.买卖股票的最佳时机含手续费(动态规划).html)
## 卖股票的最佳时机
-[动态规划:121.买卖股票的最佳时机](https://mp.weixin.qq.com/s/keWo5qYJY4zmHn3amfXdfQ),**股票只能买卖一次,问最大利润**。
+[动态规划:121.买卖股票的最佳时机](https://programmercarl.com/0121.买卖股票的最佳时机.html),**股票只能买卖一次,问最大利润**。
【贪心解法】
@@ -103,7 +103,7 @@ public:
## 买卖股票的最佳时机II
-[动态规划:122.买卖股票的最佳时机II](https://mp.weixin.qq.com/s/d4TRWFuhaY83HPa6t5ZL-w)可以多次买卖股票,问最大收益。
+[动态规划:122.买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II(动态规划).html)可以多次买卖股票,问最大收益。
【贪心解法】
@@ -138,9 +138,9 @@ dp数组定义:
* 第i-1天就持有股票,那么就保持现状,所得现金就是昨天持有股票的所得现金 即:dp[i - 1][0]
* 第i天买入股票,所得现金就是昨天不持有股票的所得现金减去 今天的股票价格 即:dp[i - 1][1] - prices[i]
-**注意这里和[121. 买卖股票的最佳时机](https://mp.weixin.qq.com/s/keWo5qYJY4zmHn3amfXdfQ)唯一不同的地方,就是推导dp[i][0]的时候,第i天买入股票的情况**。
+**注意这里和[121. 买卖股票的最佳时机](https://programmercarl.com/0121.买卖股票的最佳时机.html)唯一不同的地方,就是推导dp[i][0]的时候,第i天买入股票的情况**。
-在[121. 买卖股票的最佳时机](https://mp.weixin.qq.com/s/keWo5qYJY4zmHn3amfXdfQ)中,因为股票全程只能买卖一次,所以如果买入股票,那么第i天持有股票即dp[i][0]一定就是 -prices[i]。
+在[121. 买卖股票的最佳时机](https://programmercarl.com/0121.买卖股票的最佳时机.html)中,因为股票全程只能买卖一次,所以如果买入股票,那么第i天持有股票即dp[i][0]一定就是 -prices[i]。
而本题,因为一只股票可以买卖多次,所以当第i天买入股票的时候,所持有的现金可能有之前买卖过的利润。
@@ -169,7 +169,7 @@ public:
## 买卖股票的最佳时机III
-[动态规划:123.买卖股票的最佳时机III](https://mp.weixin.qq.com/s/Sbs157mlVDtAR0gbLpdKzg)最多买卖两次,问最大收益。
+[动态规划:123.买卖股票的最佳时机III](https://programmercarl.com/0123.买卖股票的最佳时机III.html)最多买卖两次,问最大收益。
【动态规划】
@@ -257,7 +257,7 @@ public:
## 买卖股票的最佳时机IV
-[动态规划:188.买卖股票的最佳时机IV](https://mp.weixin.qq.com/s/jtxZJWAo2y5sUsW647Z5cw) 最多买卖k笔交易,问最大收益。
+[动态规划:188.买卖股票的最佳时机IV](https://programmercarl.com/0188.买卖股票的最佳时机IV.html) 最多买卖k笔交易,问最大收益。
使用二维数组 dp[i][j] :第i天的状态为j,所剩下的最大现金是dp[i][j]
@@ -325,12 +325,12 @@ public:
## 最佳买卖股票时机含冷冻期
-[动态规划:309.最佳买卖股票时机含冷冻期](https://mp.weixin.qq.com/s/TczJGFAPnkjH9ET8kwH1OA) 可以多次买卖但每次卖出有冷冻期1天。
+[动态规划:309.最佳买卖股票时机含冷冻期](https://programmercarl.com/0309.最佳买卖股票时机含冷冻期.html)可以多次买卖但每次卖出有冷冻期1天。
-相对于[动态规划:122.买卖股票的最佳时机II](https://mp.weixin.qq.com/s/d4TRWFuhaY83HPa6t5ZL-w),本题加上了一个冷冻期。
+相对于[动态规划:122.买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II(动态规划).html),本题加上了一个冷冻期。
-在[动态规划:122.买卖股票的最佳时机II](https://mp.weixin.qq.com/s/d4TRWFuhaY83HPa6t5ZL-w) 中有两个状态,持有股票后的最多现金,和不持有股票的最多现金。本题则可以花费为四个状态
+在[动态规划:122.买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II(动态规划).html) 中有两个状态,持有股票后的最多现金,和不持有股票的最多现金。本题则可以花费为四个状态
dp[i][j]:第i天状态为j,所剩的最多现金为dp[i][j]。
@@ -408,10 +408,10 @@ public:
## 买卖股票的最佳时机含手续费
-[动态规划:714.买卖股票的最佳时机含手续费](https://mp.weixin.qq.com/s/2Cd_uINjerZ25VHH0K2IBQ) 可以多次买卖,但每次有手续费。
+[动态规划:714.买卖股票的最佳时机含手续费](https://programmercarl.com/0714.买卖股票的最佳时机含手续费(动态规划).html) 可以多次买卖,但每次有手续费。
-相对于[动态规划:122.买卖股票的最佳时机II](https://mp.weixin.qq.com/s/d4TRWFuhaY83HPa6t5ZL-w),本题只需要在计算卖出操作的时候减去手续费就可以了,代码几乎是一样的。
+相对于[动态规划:122.买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II(动态规划).html),本题只需要在计算卖出操作的时候减去手续费就可以了,代码几乎是一样的。
唯一差别在于递推公式部分,所以本篇也就不按照动规五部曲详细讲解了,主要讲解一下递推公式部分。
@@ -435,7 +435,7 @@ dp[i][1] 表示第i天不持有股票所得最多现金
所以:dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i] - fee);
-**本题和[动态规划:122.买卖股票的最佳时机II](https://mp.weixin.qq.com/s/d4TRWFuhaY83HPa6t5ZL-w)的区别就是这里需要多一个减去手续费的操作**。
+**本题和[动态规划:122.买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II(动态规划).html)的区别就是这里需要多一个减去手续费的操作**。
以上分析完毕,代码如下:
diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md"
index d1c5200593..e7e57351e0 100644
--- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md"
+++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\346\200\273\347\273\223\347\257\207.md"
@@ -10,7 +10,7 @@
如今动态规划已经讲解了42道经典题目,共50篇文章,是时候做一篇总结了。
-关于动态规划,在专题第一篇[关于动态规划,你该了解这些!](https://mp.weixin.qq.com/s/ocZwfPlCWrJtVGACqFNAag)就说了动规五部曲,**而且强调了五部对解动规题目至关重要!**
+关于动态规划,在专题第一篇[关于动态规划,你该了解这些!](https://programmercarl.com/动态规划理论基础.html)就说了动规五部曲,**而且强调了五部对解动规题目至关重要!**
这是Carl做过一百多道动规题目总结出来的经验结晶啊,如果大家跟着「代码随想哦」刷过动规专题,一定会对这动规五部曲的作用感受极其深刻。
@@ -35,7 +35,7 @@
动规五部曲里,哪一部没想清楚,这道题目基本就做不出来,即使做出来了也没有想清楚,而是朦朦胧胧的就把题目过了。
* 如果想不清楚dp数组的具体含义,递归公式从何谈起,甚至初始化的时候就写错了。
-* 例如[动态规划:不同路径还不够,要有障碍!](https://mp.weixin.qq.com/s/lhqF0O4le9-wvalptOVOww) 在这道题目中,初始化才是重头戏
+* 例如[动态规划:不同路径还不够,要有障碍!](https://programmercarl.com/0063.不同路径II.html) 在这道题目中,初始化才是重头戏
* 如果看过背包系列,特别是完全背包,那么两层for循环先后顺序绝对可以搞懵很多人,反而递归公式是简单的。
* 至于推导dp数组的重要性,动规专题里几乎每篇Carl都反复强调,当程序结果不对的时候,一定要自己推导公式,看看和程序打印的日志是否一样。
@@ -43,72 +43,72 @@
## 动划基础
-* [关于动态规划,你该了解这些!](https://mp.weixin.qq.com/s/ocZwfPlCWrJtVGACqFNAag)
-* [动态规划:斐波那契数](https://mp.weixin.qq.com/s/ko0zLJplF7n_4TysnPOa_w)
-* [动态规划:爬楼梯](https://mp.weixin.qq.com/s/Ohop0jApSII9xxOMiFhGIw)
-* [动态规划:使用最小花费爬楼梯](https://mp.weixin.qq.com/s/djZB9gkyLFAKcQcSvKDorA)
-* [动态规划:不同路径](https://mp.weixin.qq.com/s/MGgGIt4QCpFMROE9X9he_A)
-* [动态规划:不同路径还不够,要有障碍!](https://mp.weixin.qq.com/s/lhqF0O4le9-wvalptOVOww)
-* [动态规划:整数拆分,你要怎么拆?](https://mp.weixin.qq.com/s/cVbyHrsWH_Rfzlj-ESr01A)
-* [动态规划:不同的二叉搜索树](https://mp.weixin.qq.com/s/8VE8pDrGxTf8NEVYBDwONw)
+* [关于动态规划,你该了解这些!](https://programmercarl.com/动态规划理论基础.html)
+* [动态规划:斐波那契数](https://programmercarl.com/0509.斐波那契数.html)
+* [动态规划:爬楼梯](https://programmercarl.com/0070.爬楼梯.html)
+* [动态规划:使用最小花费爬楼梯](https://programmercarl.com/0746.使用最小花费爬楼梯.html)
+* [动态规划:不同路径](https://programmercarl.com/0062.不同路径.html)
+* [动态规划:不同路径还不够,要有障碍!](https://programmercarl.com/0063.不同路径II.html)
+* [动态规划:整数拆分,你要怎么拆?](https://programmercarl.com/0343.整数拆分.html)
+* [动态规划:不同的二叉搜索树](https://programmercarl.com/0096.不同的二叉搜索树.html)
## 背包问题系列
-* [动态规划:关于01背包问题,你该了解这些!](https://mp.weixin.qq.com/s/FwIiPPmR18_AJO5eiidT6w)
-* [动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://mp.weixin.qq.com/s/M4uHxNVKRKm5HPjkNZBnFA)
-* [动态规划:分割等和子集可以用01背包!](https://mp.weixin.qq.com/s/sYw3QtPPQ5HMZCJcT4EaLQ)
-* [动态规划:最后一块石头的重量 II](https://mp.weixin.qq.com/s/WbwAo3jaUaNJjvhHgq0BGg)
-* [动态规划:目标和!](https://mp.weixin.qq.com/s/2pWmaohX75gwxvBENS-NCw)
-* [动态规划:一和零!](https://mp.weixin.qq.com/s/x-u3Dsp76DlYqtCe0xEKJw)
-* [动态规划:关于完全背包,你该了解这些!](https://mp.weixin.qq.com/s/akwyxlJ4TLvKcw26KB9uJw)
-* [动态规划:给你一些零钱,你要怎么凑?](https://mp.weixin.qq.com/s/PlowDsI4WMBOzf3q80AksQ)
-* [动态规划:Carl称它为排列总和!](https://mp.weixin.qq.com/s/Iixw0nahJWQgbqVNk8k6gA)
-* [动态规划:以前我没得选,现在我选择再爬一次!](https://mp.weixin.qq.com/s/e_wacnELo-2PG76EjrUakA)
-* [动态规划: 给我个机会,我再兑换一次零钱](https://mp.weixin.qq.com/s/dyk-xNilHzNtVdPPLObSeQ)
-* [动态规划:一样的套路,再求一次完全平方数](https://mp.weixin.qq.com/s/VfJT78p7UGpDZsapKF_QJQ)
-* [动态规划:单词拆分](https://mp.weixin.qq.com/s/3Spx1B6MbIYjS8YkVbByzA)
-* [动态规划:关于多重背包,你该了解这些!](https://mp.weixin.qq.com/s/b-UUUmbvG7URWyCjQkiuuQ)
-* [听说背包问题很难? 这篇总结篇来拯救你了](https://mp.weixin.qq.com/s/ZOehl3U1mDiyOQjFG1wNJA)
+* [动态规划:关于01背包问题,你该了解这些!](https://programmercarl.com/背包理论基础01背包-1.html)
+* [动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html)
+* [动态规划:分割等和子集可以用01背包!](https://programmercarl.com/0416.分割等和子集.html)
+* [动态规划:最后一块石头的重量 II](https://programmercarl.com/1049.最后一块石头的重量II.html)
+* [动态规划:目标和!](https://programmercarl.com/0494.目标和.html)
+* [动态规划:一和零!](https://programmercarl.com/0474.一和零.html)
+* [动态规划:关于完全背包,你该了解这些!](https://programmercarl.com/背包问题理论基础完全背包.html)
+* [动态规划:给你一些零钱,你要怎么凑?](https://programmercarl.com/0518.零钱兑换II.html)
+* [动态规划:Carl称它为排列总和!](https://programmercarl.com/0377.组合总和Ⅳ.html)
+* [动态规划:以前我没得选,现在我选择再爬一次!](https://programmercarl.com/0070.爬楼梯完全背包版本.html)
+* [动态规划: 给我个机会,我再兑换一次零钱](https://programmercarl.com/0322.零钱兑换.html)
+* [动态规划:一样的套路,再求一次完全平方数](https://programmercarl.com/0279.完全平方数.html)
+* [动态规划:单词拆分](https://programmercarl.com/0139.单词拆分.html)
+* [动态规划:关于多重背包,你该了解这些!](https://programmercarl.com/背包问题理论基础多重背包.html)
+* [听说背包问题很难? 这篇总结篇来拯救你了](https://programmercarl.com/背包总结篇.html)
## 打家劫舍系列
-* [动态规划:开始打家劫舍!](https://mp.weixin.qq.com/s/UZ31WdLEEFmBegdgLkJ8Dw)
-* [动态规划:继续打家劫舍!](https://mp.weixin.qq.com/s/kKPx4HpH3RArbRcxAVHbeQ)
-* [动态规划:还要打家劫舍!](https://mp.weixin.qq.com/s/BOJ1lHsxbQxUZffXlgglEQ)
+* [动态规划:开始打家劫舍!](https://programmercarl.com/0198.打家劫舍.html)
+* [动态规划:继续打家劫舍!](https://programmercarl.com/0213.打家劫舍II.html)
+* [动态规划:还要打家劫舍!](https://programmercarl.com/0337.打家劫舍III.html)
## 股票系列
-* [动态规划:买卖股票的最佳时机](https://mp.weixin.qq.com/s/keWo5qYJY4zmHn3amfXdfQ)
-* [动态规划:本周我们都讲了这些(系列六)](https://mp.weixin.qq.com/s/GVu-6eF0iNkpVDKRXTPOTA)
-* [动态规划:买卖股票的最佳时机II](https://mp.weixin.qq.com/s/d4TRWFuhaY83HPa6t5ZL-w)
-* [动态规划:买卖股票的最佳时机III](https://mp.weixin.qq.com/s/Sbs157mlVDtAR0gbLpdKzg)
-* [动态规划:买卖股票的最佳时机IV](https://mp.weixin.qq.com/s/jtxZJWAo2y5sUsW647Z5cw)
-* [动态规划:最佳买卖股票时机含冷冻期](https://mp.weixin.qq.com/s/TczJGFAPnkjH9ET8kwH1OA)
-* [动态规划:本周我们都讲了这些(系列七)](https://mp.weixin.qq.com/s/vdzDlrEvhXWRzblTnOnzKg)
-* [动态规划:买卖股票的最佳时机含手续费](https://mp.weixin.qq.com/s/2Cd_uINjerZ25VHH0K2IBQ)
-* [动态规划:股票系列总结篇](https://mp.weixin.qq.com/s/sC5XyEtDQWkonKnbCvZhDw)
+* [动态规划:买卖股票的最佳时机](https://programmercarl.com/0121.买卖股票的最佳时机.html)
+* [动态规划:本周我们都讲了这些(系列六)](https://programmercarl.com/周总结/20210225动规周末总结.html)
+* [动态规划:买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II(动态规划).html)
+* [动态规划:买卖股票的最佳时机III](https://programmercarl.com/0123.买卖股票的最佳时机III.html)
+* [动态规划:买卖股票的最佳时机IV](https://programmercarl.com/0188.买卖股票的最佳时机IV.html)
+* [动态规划:最佳买卖股票时机含冷冻期](https://programmercarl.com/0309.最佳买卖股票时机含冷冻期.html)
+* [动态规划:本周我们都讲了这些(系列七)](https://programmercarl.com/周总结/20210304动规周末总结.html)
+* [动态规划:买卖股票的最佳时机含手续费](https://programmercarl.com/0714.买卖股票的最佳时机含手续费(动态规划).html)
+* [动态规划:股票系列总结篇](https://programmercarl.com/动态规划-股票问题总结篇.html)
## 子序列系列
-* [动态规划:最长递增子序列](https://mp.weixin.qq.com/s/f8nLO3JGfgriXep_gJQpqQ)
-* [动态规划:最长连续递增序列](https://mp.weixin.qq.com/s/c0Nn0TtjkTISVdqRsyMmyA)
-* [动态规划:最长重复子数组](https://mp.weixin.qq.com/s/U5WaWqBwdoxzQDotOdWqZg)
-* [动态规划:最长公共子序列](https://mp.weixin.qq.com/s/Qq0q4HaE4TyasCTj2WGFOg)
-* [动态规划:不相交的线](https://mp.weixin.qq.com/s/krfYzSYEO8jIoVfyHzR0rw)
-* [动态规划:最大子序和](https://mp.weixin.qq.com/s/2Xtyi2L4r8sM-BcxgUKmcA)
-* [动态规划:判断子序列](https://mp.weixin.qq.com/s/2pjT4B4fjfOx5iB6N6xyng)
-* [动态规划:不同的子序列](https://mp.weixin.qq.com/s/1SULY2XVSROtk_hsoVLu8A)
-* [动态规划:两个字符串的删除操作](https://mp.weixin.qq.com/s/a8BerpqSf76DCqkPDJrpYg)
-* [动态规划:编辑距离](https://mp.weixin.qq.com/s/8aG71XjSgZG6kZbiAdkJnQ)
-* [为了绝杀编辑距离,我做了三步铺垫,你都知道么?](https://mp.weixin.qq.com/s/kbs4kCUzg8gPFttF9H3Yyw)
-* [动态规划:回文子串](https://mp.weixin.qq.com/s/2WetyP6IYQ6VotegepVpEw)
-* [动态规划:最长回文子序列](https://mp.weixin.qq.com/s/jbd3p4QPm5Kh1s2smTzWag)
+* [动态规划:最长递增子序列](https://programmercarl.com/0300.最长上升子序列.html)
+* [动态规划:最长连续递增序列](https://programmercarl.com/0674.最长连续递增序列.html)
+* [动态规划:最长重复子数组](https://programmercarl.com/0718.最长重复子数组.html)
+* [动态规划:最长公共子序列](https://programmercarl.com/1143.最长公共子序列.html)
+* [动态规划:不相交的线](https://programmercarl.com/1035.不相交的线.html)
+* [动态规划:最大子序和](https://programmercarl.com/0053.最大子序和(动态规划).html)
+* [动态规划:判断子序列](https://programmercarl.com/0392.判断子序列.html)
+* [动态规划:不同的子序列](https://programmercarl.com/0115.不同的子序列.html)
+* [动态规划:两个字符串的删除操作](https://programmercarl.com/0583.两个字符串的删除操作.html)
+* [动态规划:编辑距离](https://programmercarl.com/0072.编辑距离.html)
+* [为了绝杀编辑距离,我做了三步铺垫,你都知道么?](https://programmercarl.com/为了绝杀编辑距离,卡尔做了三步铺垫.html)
+* [动态规划:回文子串](https://programmercarl.com/0647.回文子串.html)
+* [动态规划:最长回文子序列](https://programmercarl.com/0516.最长回文子序列.html)
## 动规结束语
diff --git "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md"
index c9491da1eb..fd7977a670 100644
--- "a/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md"
+++ "b/problems/\345\212\250\346\200\201\350\247\204\345\210\222\347\220\206\350\256\272\345\237\272\347\241\200.md"
@@ -12,7 +12,7 @@
所以动态规划中每一个状态一定是由上一个状态推导出来的,**这一点就区分于贪心**,贪心没有状态推导,而是从局部直接选最优的,
-在[关于贪心算法,你该了解这些!](https://mp.weixin.qq.com/s/O935TaoHE9Eexwe_vSbRAg)中我举了一个背包问题的例子。
+在[关于贪心算法,你该了解这些!](https://programmercarl.com/贪心算法理论基础.html)中我举了一个背包问题的例子。
例如:有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。**每件物品只能用一次**,求解将哪些物品装入背包里物品价值总和最大。
From 0a348b8c0ac67e9eef048c498a2f9d2782663bb9 Mon Sep 17 00:00:00 2001
From: Zhengtian CHU <40222298+lakerschampions@users.noreply.github.com>
Date: Wed, 25 Aug 2021 14:48:52 +0800
Subject: [PATCH 0081/3468] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86104.=20?=
=?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E6=9C=80=E5=A4=A7=E6=B7=B1?=
=?UTF-8?q?=E5=BA=A6=20JAVA=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...02\345\272\217\351\201\215\345\216\206.md" | 23 +++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
index e62a3e6604..a57a92aaef 100644
--- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
+++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
@@ -1528,6 +1528,29 @@ public:
```
Java:
+```Java
+class Solution {
+ public int maxDepth(TreeNode root) {
+ if (root == null) return 0;
+ Queue que = new LinkedList<>();
+ que.offer(root);
+ int depth = 0;
+ while (!que.isEmpty())
+ {
+ int len = que.size();
+ while (len > 0)
+ {
+ TreeNode node = que.poll();
+ if (node.left != null) que.offer(node.left);
+ if (node.right != null) que.offer(node.right);
+ len--;
+ }
+ depth++;
+ }
+ return depth;
+ }
+}
+```
Python:
From 816e8afacadfd6b61b10fb02edeeb6dc657d436e Mon Sep 17 00:00:00 2001
From: ironartisan
Date: Wed, 25 Aug 2021 16:51:59 +0800
Subject: [PATCH 0082/3468] =?UTF-8?q?=E6=9B=B4=E6=AD=A30491.=E9=80=92?=
=?UTF-8?q?=E5=A2=9E=E5=AD=90=E5=BA=8F=E5=88=97=E9=94=99=E5=88=AB=E5=AD=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md" "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md"
index 8eeb434d0a..ea113f4b46 100644
--- "a/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md"
+++ "b/problems/0491.\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227.md"
@@ -184,7 +184,7 @@ public:
这份代码在leetcode上提交,要比版本一耗时要好的多。
-**所以正如在[哈希表:总结篇!(每逢总结必经典)](https://programmercarl.com/哈希表总结.html)中说的那样,数组,set,map都可以做哈希表,而且数组干的活,map和set都能干,但如何数值范围小的话能用数组尽量用数组**。
+**所以正如在[哈希表:总结篇!(每逢总结必经典)](https://programmercarl.com/哈希表总结.html)中说的那样,数组,set,map都可以做哈希表,而且数组干的活,map和set都能干,但如果数值范围小的话能用数组尽量用数组**。
From 624ced7d3e5c574e1dc0541fd1c894098946dc4f Mon Sep 17 00:00:00 2001
From: XuDaHaoRen <1547794387@qq.com>
Date: Wed, 25 Aug 2021 18:37:14 +0800
Subject: [PATCH 0083/3468] =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E8=BA=AB=E9=AB=98?=
=?UTF-8?q?=E9=87=8D=E5=BB=BA=E9=98=9F=E5=88=97~=E5=9B=9E=E6=BA=AF?=
=?UTF-8?q?=E6=80=BB=E7=BB=93=E6=9B=B4=E6=8D=A2=E8=BF=9E=E6=8E=A5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...14\350\241\250\346\200\273\347\273\223.md" | 30 ++++-----
...36\346\272\257\346\200\273\347\273\223.md" | 66 +++++++++----------
...00\347\247\215\345\206\231\346\263\225.md" | 20 +++---
...06\350\256\272\345\237\272\347\241\200.md" | 6 +-
...06\350\256\262\350\247\243\357\274\211.md" | 8 +--
5 files changed, 65 insertions(+), 65 deletions(-)
diff --git "a/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md" "b/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md"
index 28865920f7..58e386bc26 100644
--- "a/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md"
+++ "b/problems/\345\223\210\345\270\214\350\241\250\346\200\273\347\273\223.md"
@@ -12,7 +12,7 @@
# 哈希表理论基础
-在[关于哈希表,你该了解这些!](https://mp.weixin.qq.com/s/RSUANESA_tkhKhYe3ZR8Jg)中,我们介绍了哈希表的基础理论知识,不同于枯燥的讲解,这里介绍了都是对刷题有帮助的理论知识点。
+在[关于哈希表,你该了解这些!](https://programmercarl.com/哈希表理论基础.html)中,我们介绍了哈希表的基础理论知识,不同于枯燥的讲解,这里介绍了都是对刷题有帮助的理论知识点。
**一般来说哈希表都是用来快速判断一个元素是否出现集合里**。
@@ -28,7 +28,7 @@
* set(集合)
* map(映射)
-在C++语言中,set 和 map 都分别提供了三种数据结构,每种数据结构的底层实现和用途都有所不同,在[关于哈希表,你该了解这些!](https://mp.weixin.qq.com/s/RSUANESA_tkhKhYe3ZR8Jg)中我给出了详细分析,这一知识点很重要!
+在C++语言中,set 和 map 都分别提供了三种数据结构,每种数据结构的底层实现和用途都有所不同,在[关于哈希表,你该了解这些!](https://programmercarl.com/哈希表理论基础.html)中我给出了详细分析,这一知识点很重要!
例如什么时候用std::set,什么时候用std::multiset,什么时候用std::unordered_set,都是很有考究的。
@@ -40,13 +40,13 @@
一些应用场景就是为数组量身定做的。
-在[242.有效的字母异位词](https://mp.weixin.qq.com/s/ffS8jaVFNUWyfn_8T31IdA)中,我们提到了数组就是简单的哈希表,但是数组的大小是受限的!
+在[242.有效的字母异位词](https://programmercarl.com/0242.有效的字母异位词.html)中,我们提到了数组就是简单的哈希表,但是数组的大小是受限的!
这道题目包含小写字母,那么使用数组来做哈希最合适不过。
-在[383.赎金信](https://mp.weixin.qq.com/s/qAXqv--UERmiJNNpuphOUQ)中同样要求只有小写字母,那么就给我们浓浓的暗示,用数组!
+在[383.赎金信](https://programmercarl.com/0383.赎金信.html)中同样要求只有小写字母,那么就给我们浓浓的暗示,用数组!
-本题和[242.有效的字母异位词](https://mp.weixin.qq.com/s/ffS8jaVFNUWyfn_8T31IdA)很像,[242.有效的字母异位词](https://mp.weixin.qq.com/s/ffS8jaVFNUWyfn_8T31IdA)是求 字符串a 和 字符串b 是否可以相互组成,在[383.赎金信](https://mp.weixin.qq.com/s/qAXqv--UERmiJNNpuphOUQ)中是求字符串a能否组成字符串b,而不用管字符串b 能不能组成字符串a。
+本题和[242.有效的字母异位词](https://programmercarl.com/0242.有效的字母异位词.html)很像,[242.有效的字母异位词](https://programmercarl.com/0242.有效的字母异位词.html)是求 字符串a 和 字符串b 是否可以相互组成,在[383.赎金信](https://programmercarl.com/0383.赎金信.html)中是求字符串a能否组成字符串b,而不用管字符串b 能不能组成字符串a。
一些同学可能想,用数组干啥,都用map不就完事了。
@@ -55,7 +55,7 @@
## set作为哈希表
-在[349. 两个数组的交集](https://mp.weixin.qq.com/s/aMSA5zrp3jJcLjuSB0Es2Q)中我们给出了什么时候用数组就不行了,需要用set。
+在[349. 两个数组的交集](https://programmercarl.com/0349.两个数组的交集.html)中我们给出了什么时候用数组就不行了,需要用set。
这道题目没有限制数值的大小,就无法使用数组来做哈希表了。
@@ -66,7 +66,7 @@
所以此时一样的做映射的话,就可以使用set了。
-关于set,C++ 给提供了如下三种可用的数据结构:(详情请看[关于哈希表,你该了解这些!](https://mp.weixin.qq.com/s/RSUANESA_tkhKhYe3ZR8Jg))
+关于set,C++ 给提供了如下三种可用的数据结构:(详情请看[关于哈希表,你该了解这些!](https://programmercarl.com/哈希表理论基础.html))
* std::set
* std::multiset
@@ -74,12 +74,12 @@
std::set和std::multiset底层实现都是红黑树,std::unordered_set的底层实现是哈希, 使用unordered_set 读写效率是最高的,本题并不需要对数据进行排序,而且还不要让数据重复,所以选择unordered_set。
-在[202.快乐数](https://mp.weixin.qq.com/s/n5q0ujxxrjQS3xuh3dgqBQ)中,我们再次使用了unordered_set来判断一个数是否重复出现过。
+在[202.快乐数](https://programmercarl.com/0202.快乐数.html)中,我们再次使用了unordered_set来判断一个数是否重复出现过。
## map作为哈希表
-在[1.两数之和](https://mp.weixin.qq.com/s/vaMsLnH-f7_9nEK4Cuu3KQ)中map正式登场。
+在[1.两数之和](https://programmercarl.com/0001.两数之和.html)中map正式登场。
来说一说:使用数组和set来做哈希法的局限。
@@ -88,7 +88,7 @@ std::set和std::multiset底层实现都是红黑树,std::unordered_set的底
map是一种``的结构,本题可以用key保存数值,用value在保存数值所在的下表。所以使用map最为合适。
-C++提供如下三种map::(详情请看[关于哈希表,你该了解这些!](https://mp.weixin.qq.com/s/RSUANESA_tkhKhYe3ZR8Jg))
+C++提供如下三种map::(详情请看[关于哈希表,你该了解这些!](https://programmercarl.com/哈希表理论基础.html))
* std::map
* std::multimap
@@ -96,19 +96,19 @@ C++提供如下三种map::(详情请看[关于哈希表,你该了解这
std::unordered_map 底层实现为哈希,std::map 和std::multimap 的底层实现是红黑树。
-同理,std::map 和std::multimap 的key也是有序的(这个问题也经常作为面试题,考察对语言容器底层的理解),[1.两数之和](https://mp.weixin.qq.com/s/vaMsLnH-f7_9nEK4Cuu3KQ)中并不需要key有序,选择std::unordered_map 效率更高!
+同理,std::map 和std::multimap 的key也是有序的(这个问题也经常作为面试题,考察对语言容器底层的理解),[1.两数之和](https://programmercarl.com/0001.两数之和.html)中并不需要key有序,选择std::unordered_map 效率更高!
-在[454.四数相加](https://mp.weixin.qq.com/s/12g_w6RzHuEpFts1pT6BWw)中我们提到了其实需要哈希的地方都能找到map的身影。
+在[454.四数相加](https://programmercarl.com/0454.四数相加II.html)中我们提到了其实需要哈希的地方都能找到map的身影。
-本题咋眼一看好像和[18. 四数之和](https://mp.weixin.qq.com/s/SBU3THi1Kv6Sar7htqCB2Q),[15.三数之和](https://mp.weixin.qq.com/s/QfTNEByq1YlNSXRKEumwHg)差不多,其实差很多!
+本题咋眼一看好像和[18. 四数之和](https://programmercarl.com/0018.四数之和.html),[15.三数之和](https://programmercarl.com/0015.三数之和.html)差不多,其实差很多!
-**关键差别是本题为四个独立的数组,只要找到A[i] + B[j] + C[k] + D[l] = 0就可以,不用考虑重复问题,而[18. 四数之和](https://mp.weixin.qq.com/s/SBU3THi1Kv6Sar7htqCB2Q),[15.三数之和](https://mp.weixin.qq.com/s/QfTNEByq1YlNSXRKEumwHg)是一个数组(集合)里找到和为0的组合,可就难很多了!**
+**关键差别是本题为四个独立的数组,只要找到A[i] + B[j] + C[k] + D[l] = 0就可以,不用考虑重复问题,而[18. 四数之和](https://programmercarl.com/0018.四数之和.html),[15.三数之和](https://programmercarl.com/0015.三数之和.html)是一个数组(集合)里找到和为0的组合,可就难很多了!**
用哈希法解决了两数之和,很多同学会感觉用哈希法也可以解决三数之和,四数之和。
其实是可以解决,但是非常麻烦,需要去重导致代码效率很低。
-在[15.三数之和](https://mp.weixin.qq.com/s/QfTNEByq1YlNSXRKEumwHg)中我给出了哈希法和双指针两个解法,大家就可以体会到,使用哈希法还是比较麻烦的。
+在[15.三数之和](https://programmercarl.com/0015.三数之和.html)中我给出了哈希法和双指针两个解法,大家就可以体会到,使用哈希法还是比较麻烦的。
所以18. 四数之和,15.三数之和都推荐使用双指针法!
diff --git "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md" "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md"
index 474db74a3a..f4578c8303 100644
--- "a/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md"
+++ "b/problems/\345\233\236\346\272\257\346\200\273\347\273\223.md"
@@ -14,7 +14,7 @@
关于回溯算法理论基础,我录了一期B站视频[带你学透回溯算法(理论篇)](https://www.bilibili.com/video/BV1cy4y167mM)如果对回溯算法还不了解的话,可以看一下。
-在[关于回溯算法,你该了解这些!](https://mp.weixin.qq.com/s/gjSgJbNbd1eAA5WkA-HeWw)中我们详细的介绍了回溯算法的理论知识,不同于教科书般的讲解,这里介绍的回溯法的效率,解决的问题以及模板都是在刷题的过程中非常实用!
+在[关于回溯算法,你该了解这些!](https://programmercarl.com/回溯算法理论基础.html)中我们详细的介绍了回溯算法的理论知识,不同于教科书般的讲解,这里介绍的回溯法的效率,解决的问题以及模板都是在刷题的过程中非常实用!
**回溯是递归的副产品,只要有递归就会有回溯**,所以回溯法也经常和二叉树遍历,深度优先搜索混在一起,因为这两种方式都是用了递归。
@@ -32,7 +32,7 @@
回溯法确实不好理解,所以需要把回溯法抽象为一个图形来理解就容易多了,**在后面的每一道回溯法的题目我都将遍历过程抽象为树形结构方便大家的理解**。
-在[关于回溯算法,你该了解这些!](https://mp.weixin.qq.com/s/gjSgJbNbd1eAA5WkA-HeWw)还用了回溯三部曲来分析回溯算法,并给出了回溯法的模板:
+在[关于回溯算法,你该了解这些!](https://programmercarl.com/回溯算法理论基础.html)还用了回溯三部曲来分析回溯算法,并给出了回溯法的模板:
```
void backtracking(参数) {
@@ -55,7 +55,7 @@ void backtracking(参数) {
## 组合问题
-在[回溯算法:求组合问题!](https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ)中,我们开始用回溯法解决第一道题目:组合问题。
+在[回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)中,我们开始用回溯法解决第一道题目:组合问题。
我在文中开始的时候给大家列举k层for循环例子,进而得出都是同样是暴利解法,为什么要用回溯法!
@@ -71,13 +71,13 @@ void backtracking(参数) {
**所以,录友们刚开始学回溯法,起跑姿势就很标准了!**
-优化回溯算法只有剪枝一种方法,在[回溯算法:组合问题再剪剪枝](https://mp.weixin.qq.com/s/Ri7spcJMUmph4c6XjPWXQA)中把回溯法代码做了剪枝优化,树形结构如图:
+优化回溯算法只有剪枝一种方法,在[回溯算法:组合问题再剪剪枝](https://programmercarl.com/0077.组合优化.html)中把回溯法代码做了剪枝优化,树形结构如图:

大家可以一目了然剪的究竟是哪里。
-**[回溯算法:求组合问题!](https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ)剪枝精髓是:for循环在寻找起点的时候要有一个范围,如果这个起点到集合终止之间的元素已经不够题目要求的k个元素了,就没有必要搜索了**。
+**[回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)剪枝精髓是:for循环在寻找起点的时候要有一个范围,如果这个起点到集合终止之间的元素已经不够题目要求的k个元素了,就没有必要搜索了**。
**在for循环上做剪枝操作是回溯法剪枝的常见套路!** 后面的题目还会经常用到。
@@ -86,7 +86,7 @@ void backtracking(参数) {
### 组合总和(一)
-在[回溯算法:求组合总和!](https://mp.weixin.qq.com/s/HX7WW6ixbFZJASkRnCTC3w)中,相当于 [回溯算法:求组合问题!](https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ)加了一个元素总和的限制。
+在[回溯算法:求组合总和!](https://programmercarl.com/0216.组合总和III.html)中,相当于 [回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)加了一个元素总和的限制。
树形结构如图:

@@ -95,21 +95,21 @@ void backtracking(参数) {

-在本题中,依然还可以有一个剪枝,就是[回溯算法:组合问题再剪剪枝](https://mp.weixin.qq.com/s/Ri7spcJMUmph4c6XjPWXQA)中提到的,对for循环选择的起始范围的剪枝。
+在本题中,依然还可以有一个剪枝,就是[回溯算法:组合问题再剪剪枝](https://programmercarl.com/0077.组合优化.html)中提到的,对for循环选择的起始范围的剪枝。
所以剪枝的代码可以在for循环加上 `i <= 9 - (k - path.size()) + 1` 的限制!
### 组合总和(二)
-在[回溯算法:求组合总和(二)](https://mp.weixin.qq.com/s/FLg8G6EjVcxBjwCbzpACPw)中讲解的组合总和问题,和[回溯算法:求组合问题!](https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ),[回溯算法:求组合总和!](https://mp.weixin.qq.com/s/HX7WW6ixbFZJASkRnCTC3w)和区别是:本题没有数量要求,可以无限重复,但是有总和的限制,所以间接的也是有个数的限制。
+在[回溯算法:求组合总和(二)](https://programmercarl.com/0039.组合总和.html)中讲解的组合总和问题,和[回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html),[回溯算法:求组合总和!](https://programmercarl.com/0216.组合总和III.html)和区别是:本题没有数量要求,可以无限重复,但是有总和的限制,所以间接的也是有个数的限制。
不少同学都是看到可以重复选择,就义无反顾的把startIndex去掉了。
**本题还需要startIndex来控制for循环的起始位置,对于组合问题,什么时候需要startIndex呢?**
-我举过例子,如果是一个集合来求组合的话,就需要startIndex,例如:[回溯算法:求组合问题!](https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ),[回溯算法:求组合总和!](https://mp.weixin.qq.com/s/HX7WW6ixbFZJASkRnCTC3w)。
+我举过例子,如果是一个集合来求组合的话,就需要startIndex,例如:[回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html),[回溯算法:求组合总和!](https://programmercarl.com/0216.组合总和III.html)。
-如果是多个集合取组合,各个集合之间相互不影响,那么就不用startIndex,例如:[回溯算法:电话号码的字母组合](https://mp.weixin.qq.com/s/e2ua2cmkE_vpYjM3j6HY0A)
+如果是多个集合取组合,各个集合之间相互不影响,那么就不用startIndex,例如:[回溯算法:电话号码的字母组合](https://programmercarl.com/0017.电话号码的字母组合.html)
**注意以上我只是说求组合的情况,如果是排列问题,又是另一套分析的套路**。
@@ -130,7 +130,7 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target;
### 组合总和(三)
-在[回溯算法:求组合总和(三)](https://mp.weixin.qq.com/s/_1zPYk70NvHsdY8UWVGXmQ)中集合元素会有重复,但要求解集不能包含重复的组合。
+在[回溯算法:求组合总和(三)](https://programmercarl.com/0040.组合总和II.html)中集合元素会有重复,但要求解集不能包含重复的组合。
**所以难就难在去重问题上了**。
@@ -153,11 +153,11 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target;
## 多个集合求组合
-在[回溯算法:电话号码的字母组合](https://mp.weixin.qq.com/s/e2ua2cmkE_vpYjM3j6HY0A)中,开始用多个集合来求组合,还是熟悉的模板题目,但是有一些细节。
+在[回溯算法:电话号码的字母组合](https://programmercarl.com/0017.电话号码的字母组合.html)中,开始用多个集合来求组合,还是熟悉的模板题目,但是有一些细节。
-例如这里for循环,可不像是在 [回溯算法:求组合问题!](https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ)和[回溯算法:求组合总和!](https://mp.weixin.qq.com/s/HX7WW6ixbFZJASkRnCTC3w)中从startIndex开始遍历的。
+例如这里for循环,可不像是在 [回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)和[回溯算法:求组合总和!](https://programmercarl.com/0216.组合总和III.html)中从startIndex开始遍历的。
-**因为本题每一个数字代表的是不同集合,也就是求不同集合之间的组合,而[回溯算法:求组合问题!](https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ)和[回溯算法:求组合总和!](https://mp.weixin.qq.com/s/HX7WW6ixbFZJASkRnCTC3w)都是是求同一个集合中的组合!**
+**因为本题每一个数字代表的是不同集合,也就是求不同集合之间的组合,而[回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)和[回溯算法:求组合总和!](https://programmercarl.com/0216.组合总和III.html)都是是求同一个集合中的组合!**
树形结构如下:
@@ -169,7 +169,7 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target;
# 切割问题
-在[回溯算法:分割回文串](https://mp.weixin.qq.com/s/Pb1epUTbU8fHIht-g_MS5Q)中,我们开始讲解切割问题,虽然最后代码看起来好像是一道模板题,但是从分析到学会套用这个模板,是比较难的。
+在[回溯算法:分割回文串](https://programmercarl.com/0131.分割回文串.html)中,我们开始讲解切割问题,虽然最后代码看起来好像是一道模板题,但是从分析到学会套用这个模板,是比较难的。
我列出如下几个难点:
@@ -196,7 +196,7 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target;
## 子集问题(一)
-在[回溯算法:求子集问题!](https://mp.weixin.qq.com/s/NNRzX-vJ_pjK4qxohd_LtA)中讲解了子集问题,**在树形结构中子集问题是要收集所有节点的结果,而组合问题是收集叶子节点的结果**。
+在[回溯算法:求子集问题!](https://programmercarl.com/0078.子集.html)中讲解了子集问题,**在树形结构中子集问题是要收集所有节点的结果,而组合问题是收集叶子节点的结果**。
如图:
@@ -221,9 +221,9 @@ if (startIndex >= nums.size()) { // 终止条件可以不加
## 子集问题(二)
-在[回溯算法:求子集问题(二)](https://mp.weixin.qq.com/s/WJ4JNDRJgsW3eUN72Hh3uQ)中,开始针对子集问题进行去重。
+在[回溯算法:求子集问题(二)](https://programmercarl.com/0090.子集II.html)中,开始针对子集问题进行去重。
-本题就是[回溯算法:求子集问题!](https://mp.weixin.qq.com/s/NNRzX-vJ_pjK4qxohd_LtA)的基础上加上了去重,去重我们在[回溯算法:求组合总和(三)](https://mp.weixin.qq.com/s/_1zPYk70NvHsdY8UWVGXmQ)也讲过了,一样的套路。
+本题就是[回溯算法:求子集问题!](https://programmercarl.com/0078.子集.html)的基础上加上了去重,去重我们在[回溯算法:求组合总和(三)](https://programmercarl.com/0040.组合总和II.html)也讲过了,一样的套路。
树形结构如下:
@@ -231,15 +231,15 @@ if (startIndex >= nums.size()) { // 终止条件可以不加
## 递增子序列
-在[回溯算法:递增子序列](https://mp.weixin.qq.com/s/ePxOtX1ATRYJb2Jq7urzHQ)中,处处都能看到子集的身影,但处处是陷阱,值得好好琢磨琢磨!
+在[回溯算法:递增子序列](https://programmercarl.com/0491.递增子序列.html)中,处处都能看到子集的身影,但处处是陷阱,值得好好琢磨琢磨!
树形结构如下:

-很多同学都会把这道题目和[回溯算法:求子集问题(二)](https://mp.weixin.qq.com/s/WJ4JNDRJgsW3eUN72Hh3uQ)混在一起。
+很多同学都会把这道题目和[回溯算法:求子集问题(二)](https://programmercarl.com/0090.子集II.html)混在一起。
-**[回溯算法:求子集问题(二)](https://mp.weixin.qq.com/s/WJ4JNDRJgsW3eUN72Hh3uQ)也可以使用set针对同一父节点本层去重,但子集问题一定要排序,为什么呢?**
+**[回溯算法:求子集问题(二)](https://programmercarl.com/0090.子集II.html)也可以使用set针对同一父节点本层去重,但子集问题一定要排序,为什么呢?**
我用没有排序的集合{2,1,2,2}来举个例子画一个图,如下:
@@ -251,7 +251,7 @@ if (startIndex >= nums.size()) { // 终止条件可以不加
## 排列问题(一)
-[回溯算法:排列问题!](https://mp.weixin.qq.com/s/SCOjeMX1t41wcvJq49GhMw) 又不一样了。
+[回溯算法:排列问题!](https://programmercarl.com/0046.全排列.html) 又不一样了。
排列是有序的,也就是说[1,2] 和[2,1] 是两个集合,这和之前分析的子集以及组合所不同的地方。
@@ -268,7 +268,7 @@ if (startIndex >= nums.size()) { // 终止条件可以不加
## 排列问题(二)
-排列问题也要去重了,在[回溯算法:排列问题(二)](https://mp.weixin.qq.com/s/9L8h3WqRP_h8LLWNT34YlA)中又一次强调了“树层去重”和“树枝去重”。
+排列问题也要去重了,在[回溯算法:排列问题(二)](https://programmercarl.com/0047.全排列II.html)中又一次强调了“树层去重”和“树枝去重”。
树形结构如下:
@@ -294,17 +294,17 @@ if (startIndex >= nums.size()) { // 终止条件可以不加
以上我都是统一使用used数组来去重的,其实使用set也可以用来去重!
-在[本周小结!(回溯算法系列三)续集](https://mp.weixin.qq.com/s/kSMGHc_YpsqL2j-jb_E_Ag)中给出了子集、组合、排列问题使用set来去重的解法以及具体代码,并纠正一些同学的常见错误写法。
+在[本周小结!(回溯算法系列三)续集](https://programmercarl.com/回溯算法去重问题的另一种写法.html)中给出了子集、组合、排列问题使用set来去重的解法以及具体代码,并纠正一些同学的常见错误写法。
同时详细分析了 使用used数组去重 和 使用set去重 两种写法的性能差异:
**使用set去重的版本相对于used数组的版本效率都要低很多**,大家在leetcode上提交,能明显发现。
-原因在[回溯算法:递增子序列](https://mp.weixin.qq.com/s/ePxOtX1ATRYJb2Jq7urzHQ)中也分析过,主要是因为程序运行的时候对unordered_set 频繁的insert,unordered_set需要做哈希映射(也就是把key通过hash function映射为唯一的哈希值)相对费时间,而且insert的时候其底层的符号表也要做相应的扩充,也是费时的。
+原因在[回溯算法:递增子序列](https://programmercarl.com/0491.递增子序列.html)中也分析过,主要是因为程序运行的时候对unordered_set 频繁的insert,unordered_set需要做哈希映射(也就是把key通过hash function映射为唯一的哈希值)相对费时间,而且insert的时候其底层的符号表也要做相应的扩充,也是费时的。
**而使用used数组在时间复杂度上几乎没有额外负担!**
-**使用set去重,不仅时间复杂度高了,空间复杂度也高了**,在[本周小结!(回溯算法系列三)](https://mp.weixin.qq.com/s/tLkt9PSo42X60w8i94ViiA)中分析过,组合,子集,排列问题的空间复杂度都是O(n),但如果使用set去重,空间复杂度就变成了O(n^2),因为每一层递归都有一个set集合,系统栈空间是n,每一个空间都有set集合。
+**使用set去重,不仅时间复杂度高了,空间复杂度也高了**,在[本周小结!(回溯算法系列三)](https://programmercarl.com/周总结/20201112回溯周末总结.html)中分析过,组合,子集,排列问题的空间复杂度都是O(n),但如果使用set去重,空间复杂度就变成了O(n^2),因为每一层递归都有一个set集合,系统栈空间是n,每一个空间都有set集合。
那有同学可能疑惑 用used数组也是占用O(n)的空间啊?
@@ -314,7 +314,7 @@ used数组可是全局变量,每层与每层之间公用一个used数组,所
之前说过,有递归的地方就有回溯,深度优先搜索也是用递归来实现的,所以往往伴随着回溯。
-在[回溯算法:重新安排行程](https://mp.weixin.qq.com/s/3kmbS4qDsa6bkyxR92XCTA)其实也算是图论里深搜的题目,但是我用回溯法的套路来讲解这道题目,算是给大家拓展一下思路,原来回溯法还可以这么玩!
+在[回溯算法:重新安排行程](https://programmercarl.com/0332.重新安排行程.html)其实也算是图论里深搜的题目,但是我用回溯法的套路来讲解这道题目,算是给大家拓展一下思路,原来回溯法还可以这么玩!
以输入:[["JFK", "KUL"], ["JFK", "NRT"], ["NRT", "JFK"]为例,抽象为树形结构如下:
@@ -331,7 +331,7 @@ used数组可是全局变量,每层与每层之间公用一个used数组,所
## N皇后问题
-在[回溯算法:N皇后问题](https://mp.weixin.qq.com/s/lU_QwCMj6g60nh8m98GAWg)中终于迎来了传说中的N皇后。
+在[回溯算法:N皇后问题](https://programmercarl.com/0051.N皇后.html)中终于迎来了传说中的N皇后。
下面我用一个3 * 3 的棋牌,将搜索过程抽象为一颗树,如图:
@@ -345,19 +345,19 @@ used数组可是全局变量,每层与每层之间公用一个used数组,所
**这里我明确给出了棋盘的宽度就是for循环的长度,递归的深度就是棋盘的高度,这样就可以套进回溯法的模板里了**。
-相信看完本篇[回溯算法:N皇后问题](https://mp.weixin.qq.com/s/lU_QwCMj6g60nh8m98GAWg)也没那么难了,传说已经不是传说了,哈哈。
+相信看完本篇[回溯算法:N皇后问题](https://programmercarl.com/0051.N皇后.html)也没那么难了,传说已经不是传说了,哈哈。
## 解数独问题
-在[回溯算法:解数独](https://mp.weixin.qq.com/s/eWE9TapVwm77yW9Q81xSZQ)中要征服回溯法的最后一道山峰。
+在[回溯算法:解数独](https://programmercarl.com/0037.解数独.html)中要征服回溯法的最后一道山峰。
解数独应该是棋盘很难的题目了,比N皇后还要复杂一些,但只要理解 “二维递归”这个过程,其实发现就没那么难了。
-大家已经跟着「代码随想录」刷过了如下回溯法题目,例如:[77.组合(组合问题)](https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ),[131.分割回文串(分割问题)](https://mp.weixin.qq.com/s/Pb1epUTbU8fHIht-g_MS5Q),[78.子集(子集问题)](https://mp.weixin.qq.com/s/NNRzX-vJ_pjK4qxohd_LtA),[46.全排列(排列问题)](https://mp.weixin.qq.com/s/SCOjeMX1t41wcvJq49GhMw),以及[51.N皇后(N皇后问题)](https://mp.weixin.qq.com/s/lU_QwCMj6g60nh8m98GAWg),其实这些题目都是一维递归。
+大家已经跟着「代码随想录」刷过了如下回溯法题目,例如:[77.组合(组合问题)](https://programmercarl.com/0077.组合.html),[131.分割回文串(分割问题)](https://programmercarl.com/0131.分割回文串.html),[78.子集(子集问题)](https://programmercarl.com/0078.子集.html),[46.全排列(排列问题)](https://programmercarl.com/0046.全排列.html),以及[51.N皇后(N皇后问题)](https://programmercarl.com/0051.N皇后.html),其实这些题目都是一维递归。
-其中[N皇后问题](https://mp.weixin.qq.com/s/lU_QwCMj6g60nh8m98GAWg)是因为每一行每一列只放一个皇后,只需要一层for循环遍历一行,递归来遍历列,然后一行一列确定皇后的唯一位置。
+其中[N皇后问题](https://programmercarl.com/0051.N皇后.html)是因为每一行每一列只放一个皇后,只需要一层for循环遍历一行,递归来遍历列,然后一行一列确定皇后的唯一位置。
本题就不一样了,**本题中棋盘的每一个位置都要放一个数字,并检查数字是否合法,解数独的树形结构要比N皇后更宽更深**。
@@ -367,7 +367,7 @@ used数组可是全局变量,每层与每层之间公用一个used数组,所
解数独可以说是非常难的题目了,如果还一直停留在一维递归的逻辑中,这道题目可以让大家瞬间崩溃。
-**所以我在[回溯算法:解数独](https://mp.weixin.qq.com/s/eWE9TapVwm77yW9Q81xSZQ)中开篇就提到了二维递归,这也是我自创词汇**,希望可以帮助大家理解解数独的搜索过程。
+**所以我在[回溯算法:解数独](https://programmercarl.com/0037.解数独.html)中开篇就提到了二维递归,这也是我自创词汇**,希望可以帮助大家理解解数独的搜索过程。
一波分析之后,在看代码会发现其实也不难,唯一难点就是理解**二维递归**的思维逻辑。
diff --git "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md" "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md"
index cc563fb1a2..d267d23c30 100644
--- "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md"
+++ "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\345\216\273\351\207\215\351\227\256\351\242\230\347\232\204\345\217\246\344\270\200\347\247\215\345\206\231\346\263\225.md"
@@ -8,13 +8,13 @@
# 回溯算法去重问题的另一种写法
-> 在 [本周小结!(回溯算法系列三)](https://mp.weixin.qq.com/s/tLkt9PSo42X60w8i94ViiA) 中一位录友对 整颗树的本层和同一节点的本层有疑问,也让我重新思考了一下,发现这里确实有问题,所以专门写一篇来纠正,感谢录友们的积极交流哈!
+> 在 [本周小结!(回溯算法系列三)](https://programmercarl.com/周总结/20201112回溯周末总结.html) 中一位录友对 整颗树的本层和同一节点的本层有疑问,也让我重新思考了一下,发现这里确实有问题,所以专门写一篇来纠正,感谢录友们的积极交流哈!
接下来我再把这块再讲一下。
-在[回溯算法:求子集问题(二)](https://mp.weixin.qq.com/s/WJ4JNDRJgsW3eUN72Hh3uQ)中的去重和 [回溯算法:递增子序列](https://mp.weixin.qq.com/s/ePxOtX1ATRYJb2Jq7urzHQ)中的去重 都是 同一父节点下本层的去重。
+在[回溯算法:求子集问题(二)](https://programmercarl.com/0090.子集II.html)中的去重和 [回溯算法:递增子序列](https://programmercarl.com/0491.递增子序列.html)中的去重 都是 同一父节点下本层的去重。
-[回溯算法:求子集问题(二)](https://mp.weixin.qq.com/s/WJ4JNDRJgsW3eUN72Hh3uQ)也可以使用set针对同一父节点本层去重,但子集问题一定要排序,为什么呢?
+[回溯算法:求子集问题(二)](https://programmercarl.com/0090.子集II.html)也可以使用set针对同一父节点本层去重,但子集问题一定要排序,为什么呢?
我用没有排序的集合{2,1,2,2}来举例子画一个图,如图:
@@ -22,11 +22,11 @@
图中,大家就很明显的看到,子集重复了。
-那么下面我针对[回溯算法:求子集问题(二)](https://mp.weixin.qq.com/s/WJ4JNDRJgsW3eUN72Hh3uQ) 给出使用set来对本层去重的代码实现。
+那么下面我针对[回溯算法:求子集问题(二)](https://programmercarl.com/0090.子集II.html) 给出使用set来对本层去重的代码实现。
## 90.子集II
-used数组去重版本: [回溯算法:求子集问题(二)](https://mp.weixin.qq.com/s/WJ4JNDRJgsW3eUN72Hh3uQ)
+used数组去重版本: [回溯算法:求子集问题(二)](https://programmercarl.com/0090.子集II.html)
使用set去重的版本如下:
@@ -138,7 +138,7 @@ uset已经是全局变量,本层的uset记录了一个元素,然后进入下
## 40. 组合总和 II
-使用used数组去重版本:[回溯算法:求组合总和(三)](https://mp.weixin.qq.com/s/_1zPYk70NvHsdY8UWVGXmQ)
+使用used数组去重版本:[回溯算法:求组合总和(三)](https://programmercarl.com/0040.组合总和II.html)
使用set去重的版本如下:
@@ -179,7 +179,7 @@ public:
## 47. 全排列 II
-使用used数组去重版本:[回溯算法:排列问题(二)](https://mp.weixin.qq.com/s/9L8h3WqRP_h8LLWNT34YlA)
+使用used数组去重版本:[回溯算法:排列问题(二)](https://programmercarl.com/0047.全排列II.html)
使用set去重的版本如下:
@@ -224,11 +224,11 @@ public:
需要注意的是:**使用set去重的版本相对于used数组的版本效率都要低很多**,大家在leetcode上提交,能明显发现。
-原因在[回溯算法:递增子序列](https://mp.weixin.qq.com/s/ePxOtX1ATRYJb2Jq7urzHQ)中也分析过,主要是因为程序运行的时候对unordered_set 频繁的insert,unordered_set需要做哈希映射(也就是把key通过hash function映射为唯一的哈希值)相对费时间,而且insert的时候其底层的符号表也要做相应的扩充,也是费时的。
+原因在[回溯算法:递增子序列](https://programmercarl.com/0491.递增子序列.html)中也分析过,主要是因为程序运行的时候对unordered_set 频繁的insert,unordered_set需要做哈希映射(也就是把key通过hash function映射为唯一的哈希值)相对费时间,而且insert的时候其底层的符号表也要做相应的扩充,也是费时的。
**而使用used数组在时间复杂度上几乎没有额外负担!**
-**使用set去重,不仅时间复杂度高了,空间复杂度也高了**,在[本周小结!(回溯算法系列三)](https://mp.weixin.qq.com/s/tLkt9PSo42X60w8i94ViiA)中分析过,组合,子集,排列问题的空间复杂度都是O(n),但如果使用set去重,空间复杂度就变成了O(n^2),因为每一层递归都有一个set集合,系统栈空间是n,每一个空间都有set集合。
+**使用set去重,不仅时间复杂度高了,空间复杂度也高了**,在[本周小结!(回溯算法系列三)](https://programmercarl.com/周总结/20201112回溯周末总结.html)中分析过,组合,子集,排列问题的空间复杂度都是O(n),但如果使用set去重,空间复杂度就变成了O(n^2),因为每一层递归都有一个set集合,系统栈空间是n,每一个空间都有set集合。
那有同学可能疑惑 用used数组也是占用O(n)的空间啊?
@@ -236,7 +236,7 @@ used数组可是全局变量,每层与每层之间公用一个used数组,所
## 总结
-本篇本打算是对[本周小结!(回溯算法系列三)](https://mp.weixin.qq.com/s/tLkt9PSo42X60w8i94ViiA)的一个点做一下纠正,没想到又写出来这么多!
+本篇本打算是对[本周小结!(回溯算法系列三)](https://programmercarl.com/周总结/20201112回溯周末总结.html)的一个点做一下纠正,没想到又写出来这么多!
**这个点都源于一位录友的疑问,然后我思考总结了一下,就写着这一篇,所以还是得多交流啊!**
diff --git "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md"
index b86c2506b9..29981c6605 100644
--- "a/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md"
+++ "b/problems/\345\233\236\346\272\257\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md"
@@ -13,7 +13,7 @@
回溯法也可以叫做回溯搜索法,它是一种搜索的方式。
-在二叉树系列中,我们已经不止一次,提到了回溯,例如[二叉树:以为使用了递归,其实还隐藏着回溯](https://mp.weixin.qq.com/s/ivLkHzWdhjQQD1rQWe6zWA)。
+在二叉树系列中,我们已经不止一次,提到了回溯,例如[二叉树:以为使用了递归,其实还隐藏着回溯](https://programmercarl.com/二叉树中递归带着回溯.html)。
回溯是递归的副产品,只要有递归就会有回溯。
@@ -67,7 +67,7 @@
这里给出Carl总结的回溯算法模板。
-在讲[二叉树的递归](https://mp.weixin.qq.com/s/PwVIfxDlT3kRgMASWAMGhA)中我们说了递归三部曲,这里我再给大家列出回溯三部曲。
+在讲[二叉树的递归](https://programmercarl.com/二叉树的递归遍历.html)中我们说了递归三部曲,这里我再给大家列出回溯三部曲。
* 回溯函数模板返回值以及参数
@@ -87,7 +87,7 @@ void backtracking(参数)
* 回溯函数终止条件
-既然是树形结构,那么我们在讲解[二叉树的递归](https://mp.weixin.qq.com/s/PwVIfxDlT3kRgMASWAMGhA)的时候,就知道遍历树形结构一定要有终止条件。
+既然是树形结构,那么我们在讲解[二叉树的递归](https://programmercarl.com/二叉树的递归遍历.html)的时候,就知道遍历树形结构一定要有终止条件。
所以回溯也有要终止条件。
diff --git "a/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md" "b/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md"
index baf7dcf542..dfc824fa18 100644
--- "a/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md"
+++ "b/problems/\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227\357\274\210vector\345\216\237\347\220\206\350\256\262\350\247\243\357\274\211.md"
@@ -7,7 +7,7 @@
欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!
# 贪心算法:根据身高重建队列(续集)
-在讲解[贪心算法:根据身高重建队列](https://mp.weixin.qq.com/s/-2TgZVdOwS-DvtbjjDEbfw)中,我们提到了使用vector(C++中的动态数组)来进行insert操作是费时的。
+在讲解[贪心算法:根据身高重建队列](https://programmercarl.com/0406.根据身高重建队列.html)中,我们提到了使用vector(C++中的动态数组)来进行insert操作是费时的。
但是在解释的过程中有不恰当的地方,所以来专门写一篇文章来详细说一说这个问题。
@@ -99,9 +99,9 @@ for (int i = 0; i < vec.size(); i++) {
**同时也注意此时capicity和size的变化,关键的地方我都标红了**。
-而在[贪心算法:根据身高重建队列](https://mp.weixin.qq.com/s/-2TgZVdOwS-DvtbjjDEbfw)中,我们使用vector来做insert的操作,此时大家可会发现,**虽然表面上复杂度是O(n^2),但是其底层都不知道额外做了多少次全量拷贝了,所以算上vector的底层拷贝,整体时间复杂度可以认为是O(n^2 + t * n)级别的,t是底层拷贝的次数**。
+而在[贪心算法:根据身高重建队列](https://programmercarl.com/0406.根据身高重建队列.html)中,我们使用vector来做insert的操作,此时大家可会发现,**虽然表面上复杂度是O(n^2),但是其底层都不知道额外做了多少次全量拷贝了,所以算上vector的底层拷贝,整体时间复杂度可以认为是O(n^2 + t * n)级别的,t是底层拷贝的次数**。
-那么是不是可以直接确定好vector的大小,不让它在动态扩容了,例如在[贪心算法:根据身高重建队列](https://mp.weixin.qq.com/s/-2TgZVdOwS-DvtbjjDEbfw)中已经给出了有people.size这么多的人,可以定义好一个固定大小的vector,这样我们就可以控制vector,不让它底层动态扩容。
+那么是不是可以直接确定好vector的大小,不让它在动态扩容了,例如在[贪心算法:根据身高重建队列](https://programmercarl.com/0406.根据身高重建队列.html)中已经给出了有people.size这么多的人,可以定义好一个固定大小的vector,这样我们就可以控制vector,不让它底层动态扩容。
这种方法需要自己模拟插入的操作,不仅没有直接调用insert接口那么方便,需要手动模拟插入操作,而且效率也不高!
@@ -147,7 +147,7 @@ public:
所以对于两种使用数组的方法一和方法三,也不好确定谁优,但一定都没有使用方法二链表的效率高!
-一波分析之后,对于[贪心算法:根据身高重建队列](https://mp.weixin.qq.com/s/-2TgZVdOwS-DvtbjjDEbfw) ,大家就安心使用链表吧!别折腾了,哈哈,相当于我替大家折腾了一下。
+一波分析之后,对于[贪心算法:根据身高重建队列](https://programmercarl.com/0406.根据身高重建队列.html) ,大家就安心使用链表吧!别折腾了,哈哈,相当于我替大家折腾了一下。
## 总结
From cf9b9d045ff2d4b60943d9f5e67dc532710f1b1d Mon Sep 17 00:00:00 2001
From: XuDaHaoRen <1547794387@qq.com>
Date: Wed, 25 Aug 2021 20:31:27 +0800
Subject: [PATCH 0084/3468] =?UTF-8?q?=E5=89=91=E6=8C=87Offer05~=E6=95=B0?=
=?UTF-8?q?=E7=BB=84=E6=80=BB=E7=BB=93=E8=BF=9E=E6=8E=A5=E6=9B=B4=E6=96=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...77\346\215\242\347\251\272\346\240\274.md" | 14 ++++----
...54\345\255\227\347\254\246\344\270\262.md" | 13 ++++---
...07\351\222\210\346\200\273\347\273\223.md" | 18 +++++-----
...04\346\200\273\347\273\223\347\257\207.md" | 8 ++---
...50\346\200\273\347\273\223\347\257\207.md" | 34 +++++++++----------
...76\350\241\250\347\233\270\344\272\244.md" | 2 +-
6 files changed, 44 insertions(+), 45 deletions(-)
diff --git "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md"
index 3f373d0d1b..3294a16bf3 100644
--- "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md"
+++ "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md"
@@ -9,7 +9,7 @@
# 题目:剑指Offer 05.替换空格
-https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof/
+[力扣题目链接](https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof/)
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
@@ -81,12 +81,12 @@ public:
此时算上本题,我们已经做了七道双指针相关的题目了分别是:
-* [27.移除元素](https://mp.weixin.qq.com/s/RMkulE4NIb6XsSX83ra-Ww)
-* [15.三数之和](https://mp.weixin.qq.com/s/QfTNEByq1YlNSXRKEumwHg)
-* [18.四数之和](https://mp.weixin.qq.com/s/SBU3THi1Kv6Sar7htqCB2Q)
-* [206.翻转链表](https://mp.weixin.qq.com/s/ckEvIVGcNLfrz6OLOMoT0A)
-* [142.环形链表II](https://mp.weixin.qq.com/s/gt_VH3hQTqNxyWcl1ECSbQ)
-* [344.反转字符串](https://mp.weixin.qq.com/s/_rNm66OJVl92gBDIbGpA3w)
+* [27.移除元素](https://programmercarl.com/0027.移除元素.html)
+* [15.三数之和](https://programmercarl.com/0015.三数之和.html)
+* [18.四数之和](https://programmercarl.com/0018.四数之和.html)
+* [206.翻转链表](https://programmercarl.com/0206.翻转链表.html)
+* [142.环形链表II](https://programmercarl.com/0142.环形链表II.html)
+* [344.反转字符串](https://programmercarl.com/0344.反转字符串.html)
# 拓展
diff --git "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md"
index 15607a50a9..f4d3368cad 100644
--- "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md"
+++ "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md"
@@ -11,11 +11,10 @@
# 题目:剑指Offer58-II.左旋转字符串
-https://leetcode-cn.com/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/
+[力扣题目链接](https://leetcode-cn.com/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/)
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
-
示例 1:
输入: s = "abcdefg", k = 2
输出: "cdefgab"
@@ -34,7 +33,7 @@ https://leetcode-cn.com/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/
不能使用额外空间的话,模拟在本串操作要实现左旋转字符串的功能还是有点困难的。
-那么我们可以想一下上一题目[字符串:花式反转还不够!](https://mp.weixin.qq.com/s/4j6vPFHkFAXnQhmSkq2X9g)中讲过,使用整体反转+局部反转就可以实现,反转单词顺序的目的。
+那么我们可以想一下上一题目[字符串:花式反转还不够!](https://programmercarl.com/0151.翻转字符串里的单词.html)中讲过,使用整体反转+局部反转就可以实现,反转单词顺序的目的。
这道题目也非常类似,依然可以通过局部反转+整体反转 达到左旋转的目的。
@@ -76,13 +75,13 @@ public:
此时我们已经反转好多次字符串了,来一起回顾一下吧。
-在这篇文章[344.反转字符串](https://mp.weixin.qq.com/s/_rNm66OJVl92gBDIbGpA3w),第一次讲到反转一个字符串应该怎么做,使用了双指针法。
+在这篇文章[344.反转字符串](https://programmercarl.com/0344.反转字符串.html),第一次讲到反转一个字符串应该怎么做,使用了双指针法。
-然后发现[541. 反转字符串II](https://mp.weixin.qq.com/s/pzXt6PQ029y7bJ9YZB2mVQ),这里开始给反转加上了一些条件,当需要固定规律一段一段去处理字符串的时候,要想想在在for循环的表达式上做做文章。
+然后发现[541. 反转字符串II](https://programmercarl.com/0541.反转字符串II.html),这里开始给反转加上了一些条件,当需要固定规律一段一段去处理字符串的时候,要想想在在for循环的表达式上做做文章。
-后来在[151.翻转字符串里的单词](https://mp.weixin.qq.com/s/4j6vPFHkFAXnQhmSkq2X9g)中,要对一句话里的单词顺序进行反转,发现先整体反转再局部反转 是一个很妙的思路。
+后来在[151.翻转字符串里的单词](https://programmercarl.com/0151.翻转字符串里的单词.html)中,要对一句话里的单词顺序进行反转,发现先整体反转再局部反转 是一个很妙的思路。
-最后再讲到本题,本题则是先局部反转再 整体反转,与[151.翻转字符串里的单词](https://mp.weixin.qq.com/s/4j6vPFHkFAXnQhmSkq2X9g)类似,但是也是一种新的思路。
+最后再讲到本题,本题则是先局部反转再 整体反转,与[151.翻转字符串里的单词](https://programmercarl.com/0151.翻转字符串里的单词.html)类似,但是也是一种新的思路。
好了,反转字符串一共就介绍到这里,相信大家此时对反转字符串的常见操作已经很了解了。
diff --git "a/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md" "b/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md"
index df7cffae68..11d6ffa440 100644
--- "a/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md"
+++ "b/problems/\345\217\214\346\214\207\351\222\210\346\200\273\347\273\223.md"
@@ -12,7 +12,7 @@
# 数组篇
-在[数组:就移除个元素很难么?](https://mp.weixin.qq.com/s/RMkulE4NIb6XsSX83ra-Ww)中,原地移除数组上的元素,我们说到了数组上的元素,不能真正的删除,只能覆盖。
+在[数组:就移除个元素很难么?](https://programmercarl.com/0027.移除元素.html)中,原地移除数组上的元素,我们说到了数组上的元素,不能真正的删除,只能覆盖。
一些同学可能会写出如下代码(伪代码):
@@ -30,11 +30,11 @@ for (int i = 0; i < array.size(); i++) {
# 字符串篇
-在[字符串:这道题目,使用库函数一行代码搞定](https://mp.weixin.qq.com/s/_rNm66OJVl92gBDIbGpA3w)中讲解了反转字符串,注意这里强调要原地反转,要不然就失去了题目的意义。
+在[字符串:这道题目,使用库函数一行代码搞定](https://programmercarl.com/0344.反转字符串.html)中讲解了反转字符串,注意这里强调要原地反转,要不然就失去了题目的意义。
使用双指针法,**定义两个指针(也可以说是索引下表),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。**,时间复杂度是O(n)。
-在[替换空格](https://mp.weixin.qq.com/s/69HNjR4apcRSAo_KyknPjA) 中介绍使用双指针填充字符串的方法,如果想把这道题目做到极致,就不要只用额外的辅助空间了!
+在[替换空格](https://programmercarl.com/剑指Offer05.替换空格.html) 中介绍使用双指针填充字符串的方法,如果想把这道题目做到极致,就不要只用额外的辅助空间了!
思路就是**首先扩充数组到每个空格替换成"%20"之后的大小。然后双指针从后向前替换空格。**
@@ -44,7 +44,7 @@ for (int i = 0; i < array.size(); i++) {
**其实很多数组(字符串)填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。**
-那么在[字符串:花式反转还不够!](https://mp.weixin.qq.com/s/4j6vPFHkFAXnQhmSkq2X9g)中,我们使用双指针法,用O(n)的时间复杂度完成字符串删除类的操作,因为题目要产出冗余空格。
+那么在[字符串:花式反转还不够!](https://programmercarl.com/0151.翻转字符串里的单词.html)中,我们使用双指针法,用O(n)的时间复杂度完成字符串删除类的操作,因为题目要产出冗余空格。
**在删除冗余空格的过程中,如果不注意代码效率,很容易写成了O(n^2)的时间复杂度。其实使用双指针法O(n)就可以搞定。**
@@ -54,19 +54,19 @@ for (int i = 0; i < array.size(); i++) {
翻转链表是现场面试,白纸写代码的好题,考察了候选者对链表以及指针的熟悉程度,而且代码也不长,适合在白纸上写。
-在[链表:听说过两天反转链表又写不出来了?](https://mp.weixin.qq.com/s/ckEvIVGcNLfrz6OLOMoT0A)中,讲如何使用双指针法来翻转链表,**只需要改变链表的next指针的指向,直接将链表反转 ,而不用重新定义一个新的链表。**
+在[链表:听说过两天反转链表又写不出来了?](https://programmercarl.com/0206.翻转链表.html)中,讲如何使用双指针法来翻转链表,**只需要改变链表的next指针的指向,直接将链表反转 ,而不用重新定义一个新的链表。**
思路还是很简单的,代码也不长,但是想在白纸上一次性写出bugfree的代码,并不是容易的事情。
-在链表中求环,应该是双指针在链表里最经典的应用,在[链表:环找到了,那入口呢?](https://mp.weixin.qq.com/s/gt_VH3hQTqNxyWcl1ECSbQ)中讲解了如何通过双指针判断是否有环,而且还要找到环的入口。
+在链表中求环,应该是双指针在链表里最经典的应用,在[链表:环找到了,那入口呢?](https://programmercarl.com/0142.环形链表II.html)中讲解了如何通过双指针判断是否有环,而且还要找到环的入口。
**使用快慢指针(双指针法),分别定义 fast 和 slow指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast 和 slow指针在途中相遇 ,说明这个链表有环。**
-那么找到环的入口,其实需要点简单的数学推理,我在文章中把找环的入口清清楚楚的推理的一遍,如果对找环入口不够清楚的同学建议自己看一看[链表:环找到了,那入口呢?](https://mp.weixin.qq.com/s/gt_VH3hQTqNxyWcl1ECSbQ)。
+那么找到环的入口,其实需要点简单的数学推理,我在文章中把找环的入口清清楚楚的推理的一遍,如果对找环入口不够清楚的同学建议自己看一看[链表:环找到了,那入口呢?](https://programmercarl.com/0142.环形链表II.html)。
# N数之和篇
-在[哈希表:解决了两数之和,那么能解决三数之和么?](https://mp.weixin.qq.com/s/QfTNEByq1YlNSXRKEumwHg)中,讲到使用哈希法可以解决1.两数之和的问题
+在[哈希表:解决了两数之和,那么能解决三数之和么?](https://programmercarl.com/0015.三数之和.html)中,讲到使用哈希法可以解决1.两数之和的问题
其实使用双指针也可以解决1.两数之和的问题,只不过1.两数之和求的是两个元素的下标,没法用双指针,如果改成求具体两个元素的数值就可以了,大家可以尝试用双指针做一个leetcode上两数之和的题目,就可以体会到我说的意思了。
@@ -82,7 +82,7 @@ for (int i = 0; i < array.size(); i++) {
只用双指针法时间复杂度为O(n^2),但比哈希法的O(n^2)效率高得多,哈希法在使用两层for循环的时候,能做的剪枝操作很有限。
-在[双指针法:一样的道理,能解决四数之和](https://mp.weixin.qq.com/s/SBU3THi1Kv6Sar7htqCB2Q)中,讲到了四数之和,其实思路是一样的,**在三数之和的基础上再套一层for循环,依然是使用双指针法。**
+在[双指针法:一样的道理,能解决四数之和](https://programmercarl.com/0018.四数之和.html)中,讲到了四数之和,其实思路是一样的,**在三数之和的基础上再套一层for循环,依然是使用双指针法。**
对于三数之和使用双指针法就是将原本暴力O(n^3)的解法,降为O(n^2)的解法,四数之和的双指针解法就是将原本暴力O(n^4)的解法,降为O(n^3)的解法。
diff --git "a/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md" "b/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md"
index 009cc6f2b8..7fafb94b03 100644
--- "a/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md"
+++ "b/problems/\346\225\260\347\273\204\346\200\273\347\273\223\347\257\207.md"
@@ -63,7 +63,7 @@
## 二分法
-[数组:每次遇到二分法,都是一看就会,一写就废](https://mp.weixin.qq.com/s/fCf5QbPDtE6SSlZ1yh_q8Q)
+[数组:每次遇到二分法,都是一看就会,一写就废](https://programmercarl.com/0704.二分查找.html)
这道题目呢,考察的数据的基本操作,思路很简单,但是在通过率在简单题里并不高,不要轻敌。
@@ -79,7 +79,7 @@
## 双指针法
-* [数组:就移除个元素很难么?](https://mp.weixin.qq.com/s/wj0T-Xs88_FHJFwayElQlA)
+* [数组:就移除个元素很难么?](https://programmercarl.com/0027.移除元素.html)
双指针法(快慢指针法):**通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。**
@@ -95,7 +95,7 @@
## 滑动窗口
-* [数组:滑动窗口拯救了你](https://mp.weixin.qq.com/s/UrZynlqi4QpyLlLhBPglyg)
+* [数组:滑动窗口拯救了你](https://programmercarl.com/0209.长度最小的子数组.html)
本题介绍了数组操作中的另一个重要思想:滑动窗口。
@@ -111,7 +111,7 @@
## 模拟行为
-* [数组:这个循环可以转懵很多人!](https://mp.weixin.qq.com/s/KTPhaeqxbMK9CxHUUgFDmg)
+* [数组:这个循环可以转懵很多人!](https://programmercarl.com/0059.螺旋矩阵II.html)
模拟类的题目在数组中很常见,不涉及到什么算法,就是单纯的模拟,十分考察大家对代码的掌控能力。
diff --git "a/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md" "b/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md"
index 1f0de6fb21..fed8cb607c 100644
--- "a/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md"
+++ "b/problems/\351\223\276\350\241\250\346\200\273\347\273\223\347\257\207.md"
@@ -10,7 +10,7 @@
## 链表的理论基础
-在这篇文章[关于链表,你该了解这些!](https://mp.weixin.qq.com/s/fDGMmLrW7ZHlzkzlf_dZkw)中,介绍了如下几点:
+在这篇文章[关于链表,你该了解这些!](https://programmercarl.com/链表理论基础.html)中,介绍了如下几点:
* 链表的种类主要为:单链表,双链表,循环链表
* 链表的存储方式:链表的节点在内存中是分散存储的,通过指针连在一起。
@@ -23,17 +23,17 @@
### 虚拟头结点
-在[链表:听说用虚拟头节点会方便很多?](https://mp.weixin.qq.com/s/L5aanfALdLEwVWGvyXPDqA)中,我们讲解了链表操作中一个非常总要的技巧:虚拟头节点。
+在[链表:听说用虚拟头节点会方便很多?](https://programmercarl.com/0203.移除链表元素.html)中,我们讲解了链表操作中一个非常总要的技巧:虚拟头节点。
链表的一大问题就是操作当前节点必须要找前一个节点才能操作。这就造成了,头结点的尴尬,因为头结点没有前一个节点了。
**每次对应头结点的情况都要单独处理,所以使用虚拟头结点的技巧,就可以解决这个问题**。
-在[链表:听说用虚拟头节点会方便很多?](https://mp.weixin.qq.com/s/L5aanfALdLEwVWGvyXPDqA)中,我给出了用虚拟头结点和没用虚拟头结点的代码,大家对比一下就会发现,使用虚拟头结点的好处。
+在[链表:听说用虚拟头节点会方便很多?](https://programmercarl.com/0203.移除链表元素.html)中,我给出了用虚拟头结点和没用虚拟头结点的代码,大家对比一下就会发现,使用虚拟头结点的好处。
### 链表的基本操作
-在[链表:一道题目考察了常见的五个操作!](https://mp.weixin.qq.com/s/jnC_LAD0ZKCsj-FZc57F1g)中,我们通设计链表把链表常见的五个操作练习了一遍。
+在[链表:一道题目考察了常见的五个操作!](https://programmercarl.com/0707.设计链表.html)中,我们通设计链表把链表常见的五个操作练习了一遍。
这是练习链表基础操作的非常好的一道题目,考察了:
@@ -49,13 +49,13 @@
### 反转链表
-在[链表:听说过两天反转链表又写不出来了?](https://mp.weixin.qq.com/s/ckEvIVGcNLfrz6OLOMoT0A)中,讲解了如何反转链表。
+在[链表:听说过两天反转链表又写不出来了?](https://programmercarl.com/0206.翻转链表.html)中,讲解了如何反转链表。
因为反转链表的代码相对简单,有的同学可能直接背下来了,但一写还是容易出问题。
反转链表是面试中高频题目,很考察面试者对链表操作的熟练程度。
-我在[文章](https://mp.weixin.qq.com/s/ckEvIVGcNLfrz6OLOMoT0A)中,给出了两种反转的方式,迭代法和递归法。
+我在[文章](https://programmercarl.com/0206.翻转链表.html)中,给出了两种反转的方式,迭代法和递归法。
建议大家先学透迭代法,然后再看递归法,因为递归法比较绕,如果迭代还写不明白,递归基本也写不明白了。
@@ -63,16 +63,16 @@
### 删除倒数第N个节点
-在[链表:删除链表倒数第N个节点,怎么删?](https://mp.weixin.qq.com/s/gxu65X1343xW_sBrkTz0Eg)中我们结合虚拟头结点 和 双指针法来移除链表倒数第N个节点。
+在[链表:删除链表倒数第N个节点,怎么删?](https://programmercarl.com/0019.删除链表的倒数第N个节点.html)中我们结合虚拟头结点 和 双指针法来移除链表倒数第N个节点。
### 链表相交
-[链表:链表相交](https://mp.weixin.qq.com/s/BhfFfaGvt9Zs7UmH4YehZw)使用双指针来找到两个链表的交点(引用完全相同,即:内存地址完全相同的交点)
+[链表:链表相交](https://programmercarl.com/面试题02.07.链表相交.html)使用双指针来找到两个链表的交点(引用完全相同,即:内存地址完全相同的交点)
## 环形链表
-在[链表:环找到了,那入口呢?](https://mp.weixin.qq.com/s/gt_VH3hQTqNxyWcl1ECSbQ)中,讲解了在链表如何找环,以及如何找环的入口位置。
+在[链表:环找到了,那入口呢?](https://programmercarl.com/0142.环形链表II.html)中,讲解了在链表如何找环,以及如何找环的入口位置。
这道题目可以说是链表的比较难的题目了。 但代码却十分简洁,主要在于一些数学证明。
@@ -80,15 +80,15 @@
考察链表的操作其实就是考察指针的操作,是面试中的常见类型。
-链表篇中开头介绍[链表理论知识](https://mp.weixin.qq.com/s/slM1CH5Ew9XzK93YOQYSjA),然后分别通过经典题目介绍了如下知识点:
+链表篇中开头介绍[链表理论知识](https://programmercarl.com/0203.移除链表元素.html),然后分别通过经典题目介绍了如下知识点:
-1. [关于链表,你该了解这些!](https://mp.weixin.qq.com/s/fDGMmLrW7ZHlzkzlf_dZkw)
-2. [虚拟头结点的技巧](https://mp.weixin.qq.com/s/L5aanfALdLEwVWGvyXPDqA)
-3. [链表的增删改查](https://mp.weixin.qq.com/s/jnC_LAD0ZKCsj-FZc57F1g)
-4. [反转一个链表](https://mp.weixin.qq.com/s/ckEvIVGcNLfrz6OLOMoT0A)
-5. [删除倒数第N个节点](https://mp.weixin.qq.com/s/gxu65X1343xW_sBrkTz0Eg)
-6. [链表相交](https://mp.weixin.qq.com/s/BhfFfaGvt9Zs7UmH4YehZw)
-7. [有否环形,以及环的入口](https://mp.weixin.qq.com/s/gt_VH3hQTqNxyWcl1ECSbQ)
+1. [关于链表,你该了解这些!](https://programmercarl.com/链表理论基础.html)
+2. [虚拟头结点的技巧](https://programmercarl.com/0203.移除链表元素.html)
+3. [链表的增删改查](https://programmercarl.com/0707.设计链表.html)
+4. [反转一个链表](https://programmercarl.com/0206.翻转链表.html)
+5. [删除倒数第N个节点](https://programmercarl.com/0019.删除链表的倒数第N个节点.html)
+6. [链表相交](https://programmercarl.com/面试题02.07.链表相交.html)
+7. [有否环形,以及环的入口](https://programmercarl.com/0142.环形链表II.html)
diff --git "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md" "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md"
index 8c3a583139..d59256c6ef 100644
--- "a/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md"
+++ "b/problems/\351\235\242\350\257\225\351\242\23002.07.\351\223\276\350\241\250\347\233\270\344\272\244.md"
@@ -9,7 +9,7 @@
## 面试题 02.07. 链表相交
-题目链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists-lcci/
+[力扣题目链接](https://leetcode-cn.com/problems/intersection-of-two-linked-lists-lcci/)
给定两个(单向)链表,判定它们是否相交并返回交点。请注意相交的定义基于节点的引用,而不是基于节点的值。换句话说,如果一个链表的第k个节点与另一个链表的第j个节点是同一节点(引用完全相同),则这两个链表相交。
From e82df507ec2532d1daaf7220b16954de73848bbe Mon Sep 17 00:00:00 2001
From: ltinyho
Date: Thu, 26 Aug 2021 08:48:40 +0800
Subject: [PATCH 0085/3468] fix typo
---
.../0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md" "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md"
index 55b66b226a..4aab178240 100644
--- "a/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md"
+++ "b/problems/0040.\347\273\204\345\220\210\346\200\273\345\222\214II.md"
@@ -63,7 +63,7 @@ candidates 中的每个数字在每个组合中只能使用一次。
都知道组合问题可以抽象为树形结构,那么“使用过”在这个树形结构上是有两个维度的,一个维度是同一树枝上使用过,一个维度是同一树层上使用过。**没有理解这两个层面上的“使用过” 是造成大家没有彻底理解去重的根本原因。**
-那么问题来了,我们是要同一树层上使用过,还是统一树枝上使用过呢?
+那么问题来了,我们是要同一树层上使用过,还是同一树枝上使用过呢?
回看一下题目,元素在同一个组合内是可以重复的,怎么重复都没事,但两个组合不能相同。
From 55bf380c4527f16985ea00cf1373c612217061d5 Mon Sep 17 00:00:00 2001
From: ironartisan
Date: Thu, 26 Aug 2021 09:13:13 +0800
Subject: [PATCH 0086/3468] =?UTF-8?q?=E8=B0=83=E6=95=B4N=E7=9A=87=E5=90=8E?=
=?UTF-8?q?Markdown=E5=B8=83=E5=B1=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
"problems/0051.N\347\232\207\345\220\216.md" | 15 ++++++++++++---
"problems/0052.N\347\232\207\345\220\216II.md" | 11 +++++++++--
2 files changed, 21 insertions(+), 5 deletions(-)
diff --git "a/problems/0051.N\347\232\207\345\220\216.md" "b/problems/0051.N\347\232\207\345\220\216.md"
index 5404b620f8..fd2ac4fae7 100644
--- "a/problems/0051.N\347\232\207\345\220\216.md"
+++ "b/problems/0051.N\347\232\207\345\220\216.md"
@@ -21,18 +21,27 @@ n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。
示例:
+
输入: 4
-输出: [
- [".Q..", // 解法 1
+
+输出:
+
+解法 1
+
+[
+ [".Q..",
"...Q",
"Q...",
"..Q."],
- ["..Q.", // 解法 2
+解法 2
+
+ ["..Q.",
"Q...",
"...Q",
".Q.."]
]
+
解释: 4 皇后问题存在两个不同的解法。
提示:
diff --git "a/problems/0052.N\347\232\207\345\220\216II.md" "b/problems/0052.N\347\232\207\345\220\216II.md"
index 81f5c7ea71..1a34f76387 100644
--- "a/problems/0052.N\347\232\207\345\220\216II.md"
+++ "b/problems/0052.N\347\232\207\345\220\216II.md"
@@ -22,15 +22,22 @@ n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并
示例:
输入: 4
+
输出: 2
+
解释: 4 皇后问题存在如下两个不同的解法。
+
+解法 1
+
[
- [".Q..", // 解法 1
+ [".Q..",
"...Q",
"Q...",
"..Q."],
- ["..Q.", // 解法 2
+解法 2
+
+ ["..Q.",
"Q...",
"...Q",
".Q.."]
From 5d8a0b091ced561f0538934245f3e5a64e6ea9f2 Mon Sep 17 00:00:00 2001
From: martisss <2466632626@qq.com>
Date: Thu, 26 Aug 2021 09:47:05 +0800
Subject: [PATCH 0087/3468] =?UTF-8?q?=E5=88=A0=E9=99=A4=E9=87=8D=E5=A4=8D?=
=?UTF-8?q?=E4=BB=A3=E7=A0=81=EF=BC=8C=E5=A2=9E=E5=8A=A0N=E5=8F=89?=
=?UTF-8?q?=E6=A0=91=E6=9C=80=E5=A4=A7=E6=B7=B1=E5=BA=A6=E7=9A=84=E9=80=92?=
=?UTF-8?q?=E5=BD=92=E4=B8=8E=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86=E5=AE=9E?=
=?UTF-8?q?=E7=8E=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...00\345\244\247\346\267\261\345\272\246.md" | 56 ++++++++++++++-----
1 file changed, 43 insertions(+), 13 deletions(-)
diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md"
index d086686dc7..7adb8bb765 100644
--- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md"
+++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md"
@@ -505,21 +505,51 @@ var maxdepth = function(root) {
二叉树最大深度层级遍历
```javascript
-var maxdepth = function(root) {
- //使用递归的方法 递归三部曲
- //1. 确定递归函数的参数和返回值
- const getdepth=function(node){
- //2. 确定终止条件
- if(node===null){
- return 0;
+var maxDepth = function(root) {
+ if(!root) return 0
+ let count = 0
+ const queue = [root]
+ while(queue.length) {
+ let size = queue.length
+ /* 层数+1 */
+ count++
+ while(size--) {
+ let node = queue.shift();
+ node.left && queue.push(node.left);
+ node.right && queue.push(node.right);
+ }
+ }
+ return count
+};
+```
+
+N叉树的最大深度 递归写法
+```js
+var maxDepth = function(root) {
+ if(!root) return 0
+ let depth = 0
+ for(let node of root.children) {
+ depth = Math.max(depth, maxDepth(node))
+ }
+ return depth + 1
+}
+```
+
+N叉树的最大深度 层序遍历
+```js
+var maxDepth = function(root) {
+ if(!root) return 0
+ let count = 0
+ let queue = [root]
+ while(queue.length) {
+ let size = queue.length
+ count++
+ while(size--) {
+ let node = queue.shift()
+ node && (queue = [...queue, ...node.children])
}
- //3. 确定单层逻辑
- let leftdepth=getdepth(node.left);
- let rightdepth=getdepth(node.right);
- let depth=1+math.max(leftdepth,rightdepth);
- return depth;
}
- return getDepth(root);
+ return count
};
```
From e419a5f90815cf233a6e91ea51c7c23c005e4d22 Mon Sep 17 00:00:00 2001
From: xsduan98
Date: Thu, 26 Aug 2021 10:29:54 +0800
Subject: [PATCH 0088/3468] =?UTF-8?q?=E7=AC=AC51=E9=A2=98.N=E7=9A=87?=
=?UTF-8?q?=E5=90=8E=20=E4=BF=AE=E6=94=B9Java=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
"problems/0051.N\347\232\207\345\220\216.md" | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git "a/problems/0051.N\347\232\207\345\220\216.md" "b/problems/0051.N\347\232\207\345\220\216.md"
index 5404b620f8..9cc84cf8b3 100644
--- "a/problems/0051.N\347\232\207\345\220\216.md"
+++ "b/problems/0051.N\347\232\207\345\220\216.md"
@@ -332,7 +332,7 @@ class Solution {
public boolean isValid(int row, int col, int n, char[][] chessboard) {
// 检查列
- for (int i=0; i
Date: Thu, 26 Aug 2021 11:46:26 +0800
Subject: [PATCH 0089/3468] =?UTF-8?q?Update=201002.=E6=9F=A5=E6=89=BE?=
=?UTF-8?q?=E5=B8=B8=E7=94=A8=E5=AD=97=E7=AC=A6.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
这个python代码又有小问题,不知道为啥修改前虽然word[0]逻辑上完全讲不通,但是运行居然正确
---
...\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md"
index a789373b7c..c165f9859a 100644
--- "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md"
+++ "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md"
@@ -181,7 +181,7 @@ class Solution:
# 统计除第一个字符串外字符的出现频率
for i in range(1, len(words)):
hashOtherStr = [0] * 26
- for j in range(len(words[0])):
+ for j in range(len(words[i])):
hashOtherStr[ord(words[i][j]) - ord('a')] += 1
# 更新hash,保证hash里统计26个字符在所有字符串里出现的最小次数
for k in range(26):
From eae239903bf5b70447acc8dca780e3d0456335e9 Mon Sep 17 00:00:00 2001
From: XuDaHaoRen <1547794387@qq.com>
Date: Thu, 26 Aug 2021 13:01:19 +0800
Subject: [PATCH 0090/3468] =?UTF-8?q?=E7=AE=97=E6=B3=95=E6=A8=A1=E6=9D=BF~?=
=?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=E6=80=BB=E7=BB=93=E8=BF=9E=E6=8E=A5?=
=?UTF-8?q?=E6=9B=B4=E6=96=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...11\346\255\245\351\223\272\345\236\253.md" | 16 +++---
...46\344\270\262\346\200\273\347\273\223.md" | 24 ++++-----
...37\345\210\227\346\200\273\347\273\223.md" | 18 +++----
...25\346\200\273\347\273\223\347\257\207.md" | 51 +++++++++----------
...06\350\256\272\345\237\272\347\241\200.md" | 2 +-
5 files changed, 55 insertions(+), 56 deletions(-)
diff --git "a/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md" "b/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md"
index 4a0ef0d28c..31a5e4482e 100644
--- "a/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md"
+++ "b/problems/\344\270\272\344\272\206\347\273\235\346\235\200\347\274\226\350\276\221\350\267\235\347\246\273\357\274\214\345\215\241\345\260\224\345\201\232\344\272\206\344\270\211\346\255\245\351\223\272\345\236\253.md"
@@ -14,7 +14,7 @@
## 判断子序列
-[动态规划:392.判断子序列](https://mp.weixin.qq.com/s/2pjT4B4fjfOx5iB6N6xyng) 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。
+[动态规划:392.判断子序列](https://programmercarl.com/0392.判断子序列.html) 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。
这道题目 其实是可以用双指针或者贪心的的,但是我在开篇的时候就说了这是编辑距离的入门题目,因为从题意中我们也可以发现,只需要计算删除的情况,不用考虑增加和替换的情况。
@@ -33,9 +33,9 @@ else dp[i][j] = dp[i][j - 1];
## 不同的子序列
-[动态规划:115.不同的子序列](https://mp.weixin.qq.com/s/1SULY2XVSROtk_hsoVLu8A) 给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。
+[动态规划:115.不同的子序列](https://programmercarl.com/0115.不同的子序列.html) 给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。
-本题虽然也只有删除操作,不用考虑替换增加之类的,但相对于[动态规划:392.判断子序列](https://mp.weixin.qq.com/s/2pjT4B4fjfOx5iB6N6xyng)就有难度了,这道题目双指针法可就做不了。
+本题虽然也只有删除操作,不用考虑替换增加之类的,但相对于[动态规划:392.判断子序列](https://programmercarl.com/0392.判断子序列.html)就有难度了,这道题目双指针法可就做不了。
当s[i - 1] 与 t[j - 1]相等时,dp[i][j]可以有两部分组成。
@@ -68,9 +68,9 @@ if (s[i - 1] == t[j - 1]) {
## 两个字符串的删除操作
-[动态规划:583.两个字符串的删除操作](https://mp.weixin.qq.com/s/a8BerpqSf76DCqkPDJrpYg)给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。
+[动态规划:583.两个字符串的删除操作](https://programmercarl.com/0583.两个字符串的删除操作.html)给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。
-本题和[动态规划:115.不同的子序列](https://mp.weixin.qq.com/s/1SULY2XVSROtk_hsoVLu8A)相比,其实就是两个字符串可以都可以删除了,情况虽说复杂一些,但整体思路是不变的。
+本题和[动态规划:115.不同的子序列](https://programmercarl.com/0115.不同的子序列.html)相比,其实就是两个字符串可以都可以删除了,情况虽说复杂一些,但整体思路是不变的。
* 当word1[i - 1] 与 word2[j - 1]相同的时候
@@ -100,10 +100,10 @@ if (word1[i - 1] == word2[j - 1]) {
## 编辑距离
-[动态规划:72.编辑距离](https://mp.weixin.qq.com/s/8aG71XjSgZG6kZbiAdkJnQ) 给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。
+[动态规划:72.编辑距离](https://programmercarl.com/0072.编辑距离.html) 给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。
-编辑距离终于来了,**有了前面三道题目的铺垫,应该有思路了**,本题是两个字符串可以增删改,比 [动态规划:判断子序列](https://mp.weixin.qq.com/s/2pjT4B4fjfOx5iB6N6xyng),[动态规划:不同的子序列](https://mp.weixin.qq.com/s/1SULY2XVSROtk_hsoVLu8A),[动态规划:两个字符串的删除操作](https://mp.weixin.qq.com/s/a8BerpqSf76DCqkPDJrpYg)都要复杂的多。
+编辑距离终于来了,**有了前面三道题目的铺垫,应该有思路了**,本题是两个字符串可以增删改,比 [动态规划:判断子序列](https://programmercarl.com/0392.判断子序列.html),[动态规划:不同的子序列](https://programmercarl.com/0115.不同的子序列.html),[动态规划:两个字符串的删除操作](https://programmercarl.com/0583.两个字符串的删除操作.html)都要复杂的多。
在确定递推公式的时候,首先要考虑清楚编辑的几种操作,整理如下:
@@ -161,7 +161,7 @@ else {
## 总结
-心思的录友应该会发现我用了三道题做铺垫,才最后引出了[动态规划:72.编辑距离](https://mp.weixin.qq.com/s/8aG71XjSgZG6kZbiAdkJnQ) ,Carl的良苦用心呀,你们体会到了嘛!
+心思的录友应该会发现我用了三道题做铺垫,才最后引出了[动态规划:72.编辑距离](https://programmercarl.com/0072.编辑距离.html) ,Carl的良苦用心呀,你们体会到了嘛!
## 其他语言版本
diff --git "a/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md" "b/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md"
index f9c9766e1f..57ac9a317b 100644
--- "a/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md"
+++ "b/problems/\345\255\227\347\254\246\344\270\262\346\200\273\347\273\223.md"
@@ -46,7 +46,7 @@ for (int i = 0; i < a.size(); i++) {
# 要不要使用库函数
-在文章[344.反转字符串](https://mp.weixin.qq.com/s/_rNm66OJVl92gBDIbGpA3w)中强调了**打基础的时候,不要太迷恋于库函数。**
+在文章[344.反转字符串](https://programmercarl.com/0344.反转字符串.html)中强调了**打基础的时候,不要太迷恋于库函数。**
甚至一些同学习惯于调用substr,split,reverse之类的库函数,却不知道其实现原理,也不知道其时间复杂度,这样实现出来的代码,如果在面试现场,面试官问:“分析其时间复杂度”的话,一定会一脸懵逼!
@@ -57,15 +57,15 @@ for (int i = 0; i < a.size(); i++) {
# 双指针法
-在[344.反转字符串](https://mp.weixin.qq.com/s/_rNm66OJVl92gBDIbGpA3w) ,我们使用双指针法实现了反转字符串的操作,**双指针法在数组,链表和字符串中很常用。**
+在[344.反转字符串](https://programmercarl.com/0344.反转字符串.html) ,我们使用双指针法实现了反转字符串的操作,**双指针法在数组,链表和字符串中很常用。**
-接着在[字符串:替换空格](https://mp.weixin.qq.com/s/69HNjR4apcRSAo_KyknPjA),同样还是使用双指针法在时间复杂度O(n)的情况下完成替换空格。
+接着在[字符串:替换空格](https://programmercarl.com/剑指Offer05.替换空格.html),同样还是使用双指针法在时间复杂度O(n)的情况下完成替换空格。
**其实很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。**
-那么针对数组删除操作的问题,其实在[27. 移除元素](https://mp.weixin.qq.com/s/RMkulE4NIb6XsSX83ra-Ww)中就已经提到了使用双指针法进行移除操作。
+那么针对数组删除操作的问题,其实在[27. 移除元素](https://programmercarl.com/0027.移除元素.html)中就已经提到了使用双指针法进行移除操作。
-同样的道理在[151.翻转字符串里的单词](https://mp.weixin.qq.com/s/4j6vPFHkFAXnQhmSkq2X9g)中我们使用O(n)的时间复杂度,完成了删除冗余空格。
+同样的道理在[151.翻转字符串里的单词](https://programmercarl.com/0151.翻转字符串里的单词.html)中我们使用O(n)的时间复杂度,完成了删除冗余空格。
一些同学会使用for循环里调用库函数erase来移除元素,这其实是O(n^2)的操作,因为erase就是O(n)的操作,所以这也是典型的不知道库函数的时间复杂度,上来就用的案例了。
@@ -73,7 +73,7 @@ for (int i = 0; i < a.size(); i++) {
在反转上还可以在加一些玩法,其实考察的是对代码的掌控能力。
-[541. 反转字符串II](https://mp.weixin.qq.com/s/pzXt6PQ029y7bJ9YZB2mVQ)中,一些同学可能为了处理逻辑:每隔2k个字符的前k的字符,写了一堆逻辑代码或者再搞一个计数器,来统计2k,再统计前k个字符。
+[541. 反转字符串II](https://programmercarl.com/0541.反转字符串II.html)中,一些同学可能为了处理逻辑:每隔2k个字符的前k的字符,写了一堆逻辑代码或者再搞一个计数器,来统计2k,再统计前k个字符。
其实**当需要固定规律一段一段去处理字符串的时候,要想想在在for循环的表达式上做做文章**。
@@ -81,26 +81,26 @@ for (int i = 0; i < a.size(); i++) {
因为要找的也就是每2 * k 区间的起点,这样写程序会高效很多。
-在[151.翻转字符串里的单词](https://mp.weixin.qq.com/s/4j6vPFHkFAXnQhmSkq2X9g)中要求翻转字符串里的单词,这道题目可以说是综合考察了字符串的多种操作。是考察字符串的好题。
+在[151.翻转字符串里的单词](https://programmercarl.com/0151.翻转字符串里的单词.html)中要求翻转字符串里的单词,这道题目可以说是综合考察了字符串的多种操作。是考察字符串的好题。
这道题目通过 **先整体反转再局部反转**,实现了反转字符串里的单词。
后来发现反转字符串还有一个牛逼的用处,就是达到左旋的效果。
-在[字符串:反转个字符串还有这个用处?](https://mp.weixin.qq.com/s/Px_L-RfT2b_jXKcNmccPsw)中,我们通过**先局部反转再整体反转**达到了左旋的效果。
+在[字符串:反转个字符串还有这个用处?](https://programmercarl.com/剑指Offer58-II.左旋转字符串.html)中,我们通过**先局部反转再整体反转**达到了左旋的效果。
# KMP
KMP的主要思想是**当出现字符串不匹配时,可以知道一部分之前已经匹配的文本内容,可以利用这些信息避免从头再去做匹配了。**
-KMP的精髓所在就是前缀表,在[KMP精讲](https://mp.weixin.qq.com/s/MoRBHbS4hQXn7LcPdmHmIg)中提到了,什么是KMP,什么是前缀表,以及为什么要用前缀表。
+KMP的精髓所在就是前缀表,在[KMP精讲](https://programmercarl.com/0028.实现strStr.html)中提到了,什么是KMP,什么是前缀表,以及为什么要用前缀表。
前缀表:起始位置到下表i之前(包括i)的子串中,有多大长度的相同前缀后缀。
那么使用KMP可以解决两类经典问题:
-1. 匹配问题:[28. 实现 strStr()](https://mp.weixin.qq.com/s/MoRBHbS4hQXn7LcPdmHmIg)
-2. 重复子串问题:[459.重复的子字符串](https://mp.weixin.qq.com/s/32Pve4j8IWvdgxYEZdTeFg)
+1. 匹配问题:[28. 实现 strStr()](https://programmercarl.com/0028.实现strStr.html)
+2. 重复子串问题:[459.重复的子字符串](https://programmercarl.com/0459.重复的子字符串.html)
再一次强调了什么是前缀,什么是后缀,什么又是最长相等前后缀。
@@ -108,7 +108,7 @@ KMP的精髓所在就是前缀表,在[KMP精讲](https://mp.weixin.qq.com/s/Mo
后缀:指不包含第一个字符的所有以最后一个字符结尾的连续子串。
-然后**针对前缀表到底要不要减一,这其实是不同KMP实现的方式**,我们在[KMP精讲](https://mp.weixin.qq.com/s/MoRBHbS4hQXn7LcPdmHmIg)中针对之前两个问题,分别给出了两个不同版本的的KMP实现。
+然后**针对前缀表到底要不要减一,这其实是不同KMP实现的方式**,我们在[KMP精讲](https://programmercarl.com/0028.实现strStr.html)中针对之前两个问题,分别给出了两个不同版本的的KMP实现。
其中主要**理解j=next[x]这一步最为关键!**
diff --git "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md" "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md"
index 70ef7e9cae..ffcd38a11e 100644
--- "a/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md"
+++ "b/problems/\346\240\210\344\270\216\351\230\237\345\210\227\346\200\273\347\273\223.md"
@@ -9,7 +9,7 @@
# 栈与队列的理论基础
-首先我们在[栈与队列:来看看栈和队列不为人知的一面](https://mp.weixin.qq.com/s/VZRjOccyE09aE-MgLbCMjQ)中讲解了栈和队列的理论基础。
+首先我们在[栈与队列:来看看栈和队列不为人知的一面](https://programmercarl.com/栈与队列理论基础.html)中讲解了栈和队列的理论基础。
里面提到了灵魂四问:
@@ -33,9 +33,9 @@
大家还是要多多重视起来!
-了解了栈与队列基础之后,那么可以用[栈与队列:栈实现队列](https://mp.weixin.qq.com/s/P6tupDwRFi6Ay-L7DT4NVg) 和 [栈与队列:队列实现栈](https://mp.weixin.qq.com/s/yzn6ktUlL-vRG3-m5a8_Yw) 来练习一下栈与队列的基本操作。
+了解了栈与队列基础之后,那么可以用[栈与队列:栈实现队列](https://programmercarl.com/0232.用栈实现队列.html) 和 [栈与队列:队列实现栈](https://programmercarl.com/0225.用队列实现栈.html) 来练习一下栈与队列的基本操作。
-值得一提的是,用[栈与队列:用队列实现栈还有点别扭](https://mp.weixin.qq.com/s/yzn6ktUlL-vRG3-m5a8_Yw)中,其实只用一个队列就够了。
+值得一提的是,用[栈与队列:用队列实现栈还有点别扭](https://programmercarl.com/0225.用队列实现栈.html)中,其实只用一个队列就够了。
**一个队列在模拟栈弹出元素的时候只要将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部,此时在去弹出元素就是栈的顺序了。**
@@ -63,7 +63,7 @@ cd a/b/c/../../
## 括号匹配问题
-在[栈与队列:系统中处处都是栈的应用](https://mp.weixin.qq.com/s/nLlmPMsDCIWSqAtr0jbrpQ)中我们讲解了括号匹配问题。
+在[栈与队列:系统中处处都是栈的应用](https://programmercarl.com/0020.有效的括号.html)中我们讲解了括号匹配问题。
**括号匹配是使用栈解决的经典问题。**
@@ -79,23 +79,23 @@ cd a/b/c/../../
## 字符串去重问题
-在[栈与队列:匹配问题都是栈的强项](https://mp.weixin.qq.com/s/eynAEbUbZoAWrk0ZlEugqg)中讲解了字符串去重问题。
+在[栈与队列:匹配问题都是栈的强项](https://programmercarl.com/1047.删除字符串中的所有相邻重复项.html)中讲解了字符串去重问题。
1047. 删除字符串中的所有相邻重复项
思路就是可以把字符串顺序放到一个栈中,然后如果相同的话 栈就弹出,这样最后栈里剩下的元素都是相邻不相同的元素了。
## 逆波兰表达式问题
-在[栈与队列:有没有想过计算机是如何处理表达式的?](https://mp.weixin.qq.com/s/hneh2nnLT91rR8ms2fm_kw)中讲解了求逆波兰表达式。
+在[栈与队列:有没有想过计算机是如何处理表达式的?](https://programmercarl.com/0150.逆波兰表达式求值.html)中讲解了求逆波兰表达式。
-本题中每一个子表达式要得出一个结果,然后拿这个结果再进行运算,那么**这岂不就是一个相邻字符串消除的过程,和[栈与队列:匹配问题都是栈的强项](https://mp.weixin.qq.com/s/eynAEbUbZoAWrk0ZlEugqg)中的对对碰游戏是不是就非常像了。**
+本题中每一个子表达式要得出一个结果,然后拿这个结果再进行运算,那么**这岂不就是一个相邻字符串消除的过程,和[栈与队列:匹配问题都是栈的强项](https://programmercarl.com/1047.删除字符串中的所有相邻重复项.html)中的对对碰游戏是不是就非常像了。**
# 队列的经典题目
## 滑动窗口最大值问题
-在[栈与队列:滑动窗口里求最大值引出一个重要数据结构](https://mp.weixin.qq.com/s/8c6l2bO74xyMjph09gQtpA)中讲解了一种数据结构:单调队列。
+在[栈与队列:滑动窗口里求最大值引出一个重要数据结构](https://programmercarl.com/0239.滑动窗口最大值.html)中讲解了一种数据结构:单调队列。
这道题目还是比较绕的,如果第一次遇到这种题目,需要反复琢磨琢磨
@@ -123,7 +123,7 @@ cd a/b/c/../../
## 求前 K 个高频元素
-在[栈与队列:求前 K 个高频元素和队列有啥关系?](https://mp.weixin.qq.com/s/8hMwxoE_BQRbzCc7CA8rng)中讲解了求前 K 个高频元素。
+在[栈与队列:求前 K 个高频元素和队列有啥关系?](https://programmercarl.com/0347.前K个高频元素.html)中讲解了求前 K 个高频元素。
通过求前 K 个高频元素,引出另一种队列就是**优先级队列**。
diff --git "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md" "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md"
index 413eb3ac3a..94e292ba62 100644
--- "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md"
+++ "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\346\200\273\347\273\223\347\257\207.md"
@@ -26,7 +26,7 @@
## 贪心理论基础
-在贪心系列开篇词[关于贪心算法,你该了解这些!](https://mp.weixin.qq.com/s/O935TaoHE9Eexwe_vSbRAg)中,我们就讲解了大家对贪心的普遍疑惑。
+在贪心系列开篇词[关于贪心算法,你该了解这些!](https://programmercarl.com/贪心算法理论基础.html)中,我们就讲解了大家对贪心的普遍疑惑。
1. 贪心很简单,就是常识?
@@ -48,42 +48,42 @@ Carl个人认为:如果找出局部最优并可以推出全局最优,就是
就像是 要用一下 1 + 1 = 2,没有必要再证明一下 1 + 1 究竟为什么等于 2。(例子极端了点,但是这个道理)
-相信大家读完[关于贪心算法,你该了解这些!](https://mp.weixin.qq.com/s/O935TaoHE9Eexwe_vSbRAg),就对贪心有了一个基本的认识了。
+相信大家读完[关于贪心算法,你该了解这些!](https://programmercarl.com/贪心算法理论基础.html),就对贪心有了一个基本的认识了。
## 贪心简单题
以下三道题目就是简单题,大家会发现贪心感觉就是常识。是的,如下三道题目,就是靠常识,但我都具体分析了局部最优是什么,全局最优是什么,贪心也要贪的有理有据!
-* [贪心算法:分发饼干](https://mp.weixin.qq.com/s/YSuLIAYyRGlyxbp9BNC1uw)
-* [贪心算法:K次取反后最大化的数组和](https://mp.weixin.qq.com/s/dMTzBBVllRm_Z0aaWvYazA)
-* [贪心算法:柠檬水找零](https://mp.weixin.qq.com/s/0kT4P-hzY7H6Ae0kjQqnZg)
+* [贪心算法:分发饼干](https://programmercarl.com/0455.分发饼干.html)
+* [贪心算法:K次取反后最大化的数组和](https://programmercarl.com/1005.K次取反后最大化的数组和.html)
+* [贪心算法:柠檬水找零](https://programmercarl.com/0860.柠檬水找零.html)
## 贪心中等题
贪心中等题,靠常识可能就有点想不出来了。开始初现贪心算法的难度与巧妙之处。
-* [贪心算法:摆动序列](https://mp.weixin.qq.com/s/Xytl05kX8LZZ1iWWqjMoHA)
-* [贪心算法:单调递增的数字](https://mp.weixin.qq.com/s/TAKO9qPYiv6KdMlqNq_ncg)
+* [贪心算法:摆动序列](https://programmercarl.com/0376.摆动序列.html)
+* [贪心算法:单调递增的数字](https://programmercarl.com/0738.单调递增的数字.html)
### 贪心解决股票问题
大家都知道股票系列问题是动规的专长,其实用贪心也可以解决,而且还不止就这两道题目,但这两道比较典型,我就拿来单独说一说
-* [贪心算法:买卖股票的最佳时机II](https://mp.weixin.qq.com/s/VsTFA6U96l18Wntjcg3fcg)
-* [贪心算法:买卖股票的最佳时机含手续费](https://mp.weixin.qq.com/s/olWrUuDEYw2Jx5rMeG7XAg)
+* [贪心算法:买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II.html)
+* [贪心算法:买卖股票的最佳时机含手续费](https://programmercarl.com/0714.买卖股票的最佳时机含手续费.html)
### 两个维度权衡问题
在出现两个维度相互影响的情况时,两边一起考虑一定会顾此失彼,要先确定一个维度,再确定另一个一个维度。
-* [贪心算法:分发糖果](https://mp.weixin.qq.com/s/8MwlgFfvaNYmjGwjuMlETQ)
-* [贪心算法:根据身高重建队列](https://mp.weixin.qq.com/s/-2TgZVdOwS-DvtbjjDEbfw)
+* [贪心算法:分发糖果](https://programmercarl.com/0135.分发糖果.html)
+* [贪心算法:根据身高重建队列](https://programmercarl.com/0406.根据身高重建队列.html)
在讲解本题的过程中,还强调了编程语言的重要性,模拟插队的时候,使用C++中的list(链表)替代了vector(动态数组),效率会高很多。
-所以在[贪心算法:根据身高重建队列(续集)](https://mp.weixin.qq.com/s/K-pRN0lzR-iZhoi-1FgbSQ)详细讲解了,为什么用list(链表)更快!
+所以在[贪心算法:根据身高重建队列(续集)](https://programmercarl.com/根据身高重建队列(vector原理讲解).html)详细讲解了,为什么用list(链表)更快!
**大家也要掌握自己所用的编程语言,理解其内部实现机制,这样才能写出高效的算法!**
@@ -95,21 +95,20 @@ Carl个人认为:如果找出局部最优并可以推出全局最优,就是
关于区间问题,大家应该印象深刻,有一周我们专门讲解的区间问题,各种覆盖各种去重。
-* [贪心算法:跳跃游戏](https://mp.weixin.qq.com/s/606_N9j8ACKCODoCbV1lSA)
-* [贪心算法:跳跃游戏II](https://mp.weixin.qq.com/s/kJBcsJ46DKCSjT19pxrNYg)
-* [贪心算法:用最少数量的箭引爆气球](https://mp.weixin.qq.com/s/HxVAJ6INMfNKiGwI88-RFw)
-* [贪心算法:无重叠区间](https://mp.weixin.qq.com/s/oFOEoW-13Bm4mik-aqAOmw)
-* [贪心算法:划分字母区间](https://mp.weixin.qq.com/s/pdX4JwV1AOpc_m90EcO2Hw)
-* [贪心算法:合并区间](https://mp.weixin.qq.com/s/royhzEM5tOkUFwUGrNStpw)
+* [贪心算法:跳跃游戏](https://programmercarl.com/0055.跳跃游戏.html)
+* [贪心算法:跳跃游戏II](https://programmercarl.com/0045.跳跃游戏II.html)
+* [贪心算法:用最少数量的箭引爆气球](https://programmercarl.com/0452.用最少数量的箭引爆气球.html)
+* [贪心算法:无重叠区间](https://programmercarl.com/0435.无重叠区间.html)
+* [贪心算法:划分字母区间](https://programmercarl.com/0763.划分字母区间.html)
+* [贪心算法:合并区间](https://programmercarl.com/0056.合并区间.html)
### 其他难题
-[贪心算法:最大子序和](https://mp.weixin.qq.com/s/DrjIQy6ouKbpletQr0g1Fg) 其实是动态规划的题目,但贪心性能更优,很多同学也是第一次发现贪心能比动规更优的题目。
+[贪心算法:最大子序和](https://programmercarl.com/0053.最大子序和.html) 其实是动态规划的题目,但贪心性能更优,很多同学也是第一次发现贪心能比动规更优的题目。
+[贪心算法:加油站](https://programmercarl.com/0134.加油站.html)可能以为是一道模拟题,但就算模拟其实也不简单,需要把while用的很娴熟。但其实是可以使用贪心给时间复杂度降低一个数量级。
-[贪心算法:加油站](https://mp.weixin.qq.com/s/aDbiNuEZIhy6YKgQXvKELw)可能以为是一道模拟题,但就算模拟其实也不简单,需要把while用的很娴熟。但其实是可以使用贪心给时间复杂度降低一个数量级。
-
-最后贪心系列压轴题目[贪心算法:我要监控二叉树!](https://mp.weixin.qq.com/s/kCxlLLjWKaE6nifHC3UL2Q),不仅贪心的思路不好想,而且需要对二叉树的操作特别娴熟,这就是典型的交叉类难题了。
+最后贪心系列压轴题目[贪心算法:我要监控二叉树!](https://programmercarl.com/0968.监控二叉树.html),不仅贪心的思路不好想,而且需要对二叉树的操作特别娴熟,这就是典型的交叉类难题了。
## 贪心每周总结
@@ -120,10 +119,10 @@ Carl个人认为:如果找出局部最优并可以推出全局最优,就是
所以周总结一定要看!
-* [本周小结!(贪心算法系列一)](https://mp.weixin.qq.com/s/KQ2caT9GoVXgB1t2ExPncQ)
-* [本周小结!(贪心算法系列二)](https://mp.weixin.qq.com/s/RiQri-4rP9abFmq_mlXNiQ)
-* [本周小结!(贪心算法系列三)](https://mp.weixin.qq.com/s/JfeuK6KgmifscXdpEyIm-g)
-* [本周小结!(贪心算法系列四)](https://mp.weixin.qq.com/s/zAMHT6JfB19ZSJNP713CAQ)
+* [本周小结!(贪心算法系列一)](https://programmercarl.com/周总结/20201126贪心周末总结.html)
+* [本周小结!(贪心算法系列二)](https://programmercarl.com/周总结/20201203贪心周末总结.html)
+* [本周小结!(贪心算法系列三)](https://programmercarl.com/周总结/20201217贪心周末总结.html)
+* [本周小结!(贪心算法系列四)](https://programmercarl.com/周总结/20201224贪心周末总结.html)
## 总结
diff --git "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md"
index 77e8fe958e..fdb7abf3a8 100644
--- "a/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md"
+++ "b/problems/\350\264\252\345\277\203\347\256\227\346\263\225\347\220\206\350\256\272\345\237\272\347\241\200.md"
@@ -63,7 +63,7 @@
**那么刷题的时候什么时候真的需要数学推导呢?**
-例如这道题目:[链表:环找到了,那入口呢?](https://mp.weixin.qq.com/s/_QVP3IkRZWx9zIpQRgajzA),这道题不用数学推导一下,就找不出环的起始位置,想试一下就不知道怎么试,这种题目确实需要数学简单推导一下。
+例如这道题目:[链表:环找到了,那入口呢?](https://programmercarl.com/0142.环形链表II.html),这道题不用数学推导一下,就找不出环的起始位置,想试一下就不知道怎么试,这种题目确实需要数学简单推导一下。
## 贪心一般解题步骤
From f0dc3c1de41c6d5949ff95432eabdd38f14da79b Mon Sep 17 00:00:00 2001
From: XuDaHaoRen <1547794387@qq.com>
Date: Thu, 26 Aug 2021 13:07:27 +0800
Subject: [PATCH 0091/3468] =?UTF-8?q?problems/=E5=89=8D=E5=BA=8F=20?=
=?UTF-8?q?=E9=83=A8=E5=88=86=E6=96=87=E4=BB=B6=E8=BF=9E=E6=8E=A5=E6=9B=BF?=
=?UTF-8?q?=E6=8D=A2=E2=80=99?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git "a/problems/\345\211\215\345\272\217/\345\214\227\344\272\254\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" "b/problems/\345\211\215\345\272\217/\345\214\227\344\272\254\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md"
index c770759ff6..0e22dad640 100644
--- "a/problems/\345\211\215\345\272\217/\345\214\227\344\272\254\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md"
+++ "b/problems/\345\211\215\345\272\217/\345\214\227\344\272\254\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md"
@@ -105,7 +105,7 @@
可能是我写总结写习惯了,什么文章都要有一个总结,哈哈,那么我就总结一下。
-北京的互联网氛围绝对是最好的(暂不讨论户口和房价问题),大家如果看了[深圳原来有这么多互联网公司,你都知道么?](https://mp.weixin.qq.com/s/3VJHF2zNohBwDBxARFIn-Q)这篇之后,**会发现北京互联网外企和二线互联网公司数量多的优势,在深圳的互联网公司断档比较严重,如果去不了为数不多的一线公司,可选择的余地就非常少了,而北京选择的余地就很多!**
+北京的互联网氛围绝对是最好的(暂不讨论户口和房价问题),大家如果看了[深圳原来有这么多互联网公司,你都知道么?](https://programmercarl.com/前序/深圳互联网公司总结.html)这篇之后,**会发现北京互联网外企和二线互联网公司数量多的优势,在深圳的互联网公司断档比较严重,如果去不了为数不多的一线公司,可选择的余地就非常少了,而北京选择的余地就很多!**
相对来说,深圳的硬件企业更多一些,因为珠三角制造业配套比较完善。而大多数互联网公司其实就是媒体公司,当然要靠近政治文化中心,这也是有原因的。
From d1e96301933881b0b7e7e14a6aeab804a32a9a64 Mon Sep 17 00:00:00 2001
From: Wen
Date: Thu, 26 Aug 2021 13:20:47 +0800
Subject: [PATCH 0092/3468] =?UTF-8?q?=E4=BC=98=E5=8C=96=200027.=E7=A7=BB?=
=?UTF-8?q?=E9=99=A4=E5=85=83=E7=B4=A0.md=20Python3=E8=A7=A3=E6=B3=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...73\351\231\244\345\205\203\347\264\240.md" | 29 ++++++++++++++-----
1 file changed, 21 insertions(+), 8 deletions(-)
diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md"
index fadd4d7e11..6fce4c6ecb 100644
--- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md"
+++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md"
@@ -144,15 +144,28 @@ class Solution {
Python:
-```python
+```python3
class Solution:
- def removeElement(self, nums: List[int], val: int) -> int:
- i,n = 0,len(nums)
- for j in range(n):
- if nums[j] != val:
- nums[i] = nums[j]
- i += 1
- return i
+ """双指针法
+ 时间复杂度:O(n)
+ 空间复杂度:O(1)
+ """
+
+ @classmethod
+ def removeElement(cls, nums: List[int], val: int) -> int:
+ fast = slow = 0
+
+ while fast < len(nums):
+
+ if nums[fast] != val:
+ nums[slow] = nums[fast]
+ slow += 1
+
+ # 当 fast 指针遇到要删除的元素时停止赋值
+ # slow 指针停止移动, fast 指针继续前进
+ fast += 1
+
+ return slow
```
From b17cdcd283416d63093519f7f804fe364b0f5206 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9E=81=E5=AE=A2=E5=AD=A6=E4=BC=9F?=
Date: Thu, 26 Aug 2021 14:59:02 +0800
Subject: [PATCH 0093/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20242.=E6=9C=89?=
=?UTF-8?q?=E6=95=88=E7=9A=84=E5=AD=97=E6=AF=8D=E5=BC=82=E4=BD=8D=E8=AF=8D?=
=?UTF-8?q?=20Swift=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...15\345\274\202\344\275\215\350\257\215.md" | 23 +++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md"
index 15bf14cab6..1b6b3109db 100644
--- "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md"
+++ "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md"
@@ -198,6 +198,29 @@ var isAnagram = function(s, t) {
};
```
+Swift:
+```Swift
+func isAnagram(_ s: String, _ t: String) -> Bool {
+ if s.count != t.count {
+ return false
+ }
+ var record = Array(repeating: 0, count: 26)
+ let aUnicodeScalar = "a".unicodeScalars.first!.value
+ for c in s.unicodeScalars {
+ record[Int(c.value - aUnicodeScalar)] += 1
+ }
+ for c in t.unicodeScalars {
+ record[Int(c.value - aUnicodeScalar)] -= 1
+ }
+ for value in record {
+ if value != 0 {
+ return false
+ }
+ }
+ return true
+}
+```
+
## 相关题目
* 383.赎金信
From b32c3bb8a8233ff11e7436319fa952da0195439f Mon Sep 17 00:00:00 2001
From: Bryce S <44215173+GHumorBS@users.noreply.github.com>
Date: Thu, 26 Aug 2021 16:20:26 +0800
Subject: [PATCH 0094/3468] =?UTF-8?q?Update=200454.=E5=9B=9B=E6=95=B0?=
=?UTF-8?q?=E7=9B=B8=E5=8A=A0II.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
更新python算法:明明用了defaultdict[key: int]默认value等于0,却仍要画蛇添足:
value = hashmap.get(key)
count += value or 0
这也太奇怪了8!!!
---
...233\233\346\225\260\347\233\270\345\212\240II.md" | 12 +++---------
1 file changed, 3 insertions(+), 9 deletions(-)
diff --git "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md"
index 7bb24e59b2..4e61dc2f38 100644
--- "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md"
+++ "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md"
@@ -161,15 +161,9 @@ class Solution(object):
# count=0
# for x3 in nums3:
# for x4 in nums4:
-# key = -x3-x4
-# value = hashmap.get(key)
-
- # dict的get方法会返回None(key不存在)或者key对应的value
- # 所以如果value==0,就会继续执行or,count+0,否则就会直接加value
- # 这样就不用去写if判断了
-
-# count += value or 0
-
+# key = 0 - x3 - x4
+# value = hashmap[key] # 若差值(key)不存在,则value被赋值0
+# count += value
# return count
```
From 56b3c9ba70ba0cd151405c3421c655c34900b842 Mon Sep 17 00:00:00 2001
From: Zhengtian CHU <40222298+lakerschampions@users.noreply.github.com>
Date: Thu, 26 Aug 2021 16:29:20 +0800
Subject: [PATCH 0095/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86559.n?=
=?UTF-8?q?=E5=8F=89=E6=A0=91=E7=9A=84=E6=9C=80=E5=A4=A7=E6=B7=B1=E5=BA=A6?=
=?UTF-8?q?=20JAVA=E8=BF=AD=E4=BB=A3=E6=B3=95=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...00\345\244\247\346\267\261\345\272\246.md" | 29 +++++++++++++++++++
1 file changed, 29 insertions(+)
diff --git "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md" "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md"
index 7adb8bb765..cde3d460a8 100644
--- "a/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md"
+++ "b/problems/0104.\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.md"
@@ -311,6 +311,35 @@ class solution {
}
```
+### 559.n叉树的最大深度
+```java
+class solution {
+ /**
+ * 迭代法,使用层序遍历
+ */
+ public int maxDepth(Node root) {
+ if (root == null) return 0;
+ int depth = 0;
+ Queue que = new LinkedList<>();
+ que.offer(root);
+ while (!que.isEmpty())
+ {
+ depth ++;
+ int len = que.size();
+ while (len > 0)
+ {
+ Node node = que.poll();
+ for (int i = 0; i < node.children.size(); i++)
+ if (node.children.get(i) != null)
+ que.offer(node.children.get(i));
+ len--;
+ }
+ }
+ return depth;
+ }
+}
+```
+
## python
### 104.二叉树的最大深度
From 9604cbfe435e6449b7a7c33514dce92b7b2882ff Mon Sep 17 00:00:00 2001
From: yqq
Date: Thu, 26 Aug 2021 17:44:27 +0800
Subject: [PATCH 0096/3468] =?UTF-8?q?=E5=A2=9E=E5=8A=A00649=5FDota2?=
=?UTF-8?q?=E5=8F=82=E8=AE=AE=E9=99=A2=E7=9A=84Java,=20Python,=20Go?=
=?UTF-8?q?=E8=AF=AD=E8=A8=80=E5=AE=9E=E7=8E=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...a2\345\217\202\350\256\256\351\231\242.md" | 89 +++++++++++++++++++
1 file changed, 89 insertions(+)
diff --git "a/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md" "b/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md"
index 9cec740105..e2900824c7 100644
--- "a/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md"
+++ "b/problems/0649.Dota2\345\217\202\350\256\256\351\231\242.md"
@@ -10,6 +10,9 @@
# 649. Dota2 参议院
+[力扣题目链接](https://leetcode-cn.com/problems/dota2-senate/)
+
+
Dota2 的世界里有两个阵营:Radiant(天辉)和 Dire(夜魇)
Dota2 参议院由来自两派的参议员组成。现在参议院希望对一个 Dota2 游戏里的改变作出决定。他们以一个基于轮为过程的投票进行。在每一轮中,每一位参议员都可以行使两项权利中的一项:
@@ -115,16 +118,102 @@ public:
## Java
```java
+class Solution {
+ public String predictPartyVictory(String senateStr) {
+ // R = true表示本轮循环结束后,字符串里依然有R。D同理
+ Boolean R = true, D = true;
+ // 当flag大于0时,R在D前出现,R可以消灭D。当flag小于0时,D在R前出现,D可以消灭R
+ int flag = 0;
+ byte[] senate = senateStr.getBytes();
+ while (R && D) { // 一旦R或者D为false,就结束循环,说明本轮结束后只剩下R或者D了
+ R = false;
+ D = false;
+ for (int i = 0; i < senate.length; i++) {
+ if (senate[i] == 'R') {
+ if (flag < 0) senate[i] = 0; // 消灭R,R此时为false
+ else R = true; // 如果没被消灭,本轮循环结束有R
+ flag++;
+ }
+ if (senate[i] == 'D') {
+ if (flag > 0) senate[i] = 0;
+ else D = true;
+ flag--;
+ }
+ }
+ }
+ // 循环结束之后,R和D只能有一个为true
+ return R == true ? "Radiant" : "Dire";
+ }
+}
```
## Python
```python
+class Solution:
+ def predictPartyVictory(self, senate: str) -> str:
+ # R = true表示本轮循环结束后,字符串里依然有R。D同理
+ R , D = True, True
+
+ # 当flag大于0时,R在D前出现,R可以消灭D。当flag小于0时,D在R前出现,D可以消灭R
+ flag = 0
+
+ senate = list(senate)
+ while R and D: # 一旦R或者D为false,就结束循环,说明本轮结束后只剩下R或者D了
+ R = False
+ D = False
+ for i in range(len(senate)) :
+ if senate[i] == 'R' :
+ if flag < 0: senate[i] = '0' # 消灭R,R此时为false
+ else: R = True # 如果没被消灭,本轮循环结束有R
+ flag += 1
+ if senate[i] == 'D':
+ if flag > 0: senate[i] = '0'
+ else: D = True
+ flag -= 1
+ # 循环结束之后,R和D只能有一个为true
+ return "Radiant" if R else "Dire"
```
## Go
```go
+
+func predictPartyVictory(senateStr string) string {
+ // R = true表示本轮循环结束后,字符串里依然有R。D同理
+ R, D := true, true
+ // 当flag大于0时,R在D前出现,R可以消灭D。当flag小于0时,D在R前出现,D可以消灭R
+ flag := 0
+
+ senate := []byte(senateStr)
+ for R && D { // 一旦R或者D为false,就结束循环,说明本轮结束后只剩下R或者D了
+ R = false
+ D = false
+ for i := 0; i < len(senate); i++ {
+ if senate[i] == 'R' {
+ if flag < 0 {
+ senate[i] = 0 // 消灭R,R此时为false
+ } else {
+ R = true // 如果没被消灭,本轮循环结束有R
+ }
+ flag++;
+ }
+ if (senate[i] == 'D') {
+ if flag > 0 {
+ senate[i] = 0
+ } else {
+ D = true
+ }
+ flag--
+ }
+ }
+ }
+ // 循环结束之后,R和D只能有一个为true
+ if R {
+ return "Radiant"
+ }
+ return "Dire";
+}
```
## JavaScript
From f93ad90c69237b706dc3d0c82b2ba598275e5c9e Mon Sep 17 00:00:00 2001
From: ironartisan
Date: Thu, 26 Aug 2021 20:04:48 +0800
Subject: [PATCH 0097/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A00455.=E5=88=86?=
=?UTF-8?q?=E5=8F=91=E9=A5=BC=E5=B9=B2java=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...06\345\217\221\351\245\274\345\271\262.md" | 20 +++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md"
index b6fa4a98c8..f377b99ee4 100644
--- "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md"
+++ "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md"
@@ -117,6 +117,7 @@ public:
Java:
```java
class Solution {
+ // 思路1:优先考虑饼干,小饼干先喂饱小胃口
public int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);
@@ -132,6 +133,25 @@ class Solution {
}
}
```
+```java
+class Solution {
+ // 思路2:优先考虑胃口,先喂饱大胃口
+ public int findContentChildren(int[] g, int[] s) {
+ Arrays.sort(g);
+ Arrays.sort(s);
+ int count = 0;
+ int start = s.length - 1;
+ // 遍历胃口
+ for (int index = g.length - 1; index >= 0; index--) {
+ if(start >= 0 && g[index] <= s[start]) {
+ start--;
+ count++;
+ }
+ }
+ return count;
+ }
+}
+```
Python:
```python3
From 2304a8c57c04b73df80f5e4869d9fd788f116220 Mon Sep 17 00:00:00 2001
From: YiChih Wang
Date: Thu, 26 Aug 2021 20:07:46 +0800
Subject: [PATCH 0098/3468] =?UTF-8?q?=E5=A2=9E=E5=8A=A00704.=E4=BA=8C?=
=?UTF-8?q?=E5=88=86=E6=9F=A5=E6=89=BE=20Rust=E8=AA=9E=E8=A8=80=E5=AF=A6?=
=?UTF-8?q?=E7=8F=BE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Note:
- 包含左閉右閉與左閉右開版本
---
...14\345\210\206\346\237\245\346\211\276.md" | 43 +++++++++++++++++++
1 file changed, 43 insertions(+)
diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md"
index e576443ea4..f2af7daa8b 100644
--- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md"
+++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md"
@@ -406,6 +406,49 @@ func search(nums: [Int], target: Int) -> Int {
```
+**Rust:**
+
+```rust
+# (版本一)左闭右闭区间
+
+impl Solution {
+ pub fn search(nums: Vec, target: i32) -> i32 {
+ let mut left:usize = 0;
+ let mut right:usize = nums.len() - 1;
+ while left as i32 <= right as i32{
+ let mid = (left + right) / 2;
+ if nums[mid] < target {
+ left = mid + 1;
+ } else if nums[mid] > target {
+ right = mid - 1;
+ } else {
+ return mid as i32;
+ }
+ }
+ -1
+ }
+}
+
+# (版本二)左闭右开区间
+
+impl Solution {
+ pub fn search(nums: Vec, target: i32) -> i32 {
+ let mut left:usize = 0;
+ let mut right:usize = nums.len();
+ while left < right {
+ let mid = (left + right) / 2;
+ if nums[mid] < target {
+ left = mid + 1;
+ } else if nums[mid] > target {
+ right = mid;
+ } else {
+ return mid as i32;
+ }
+ }
+ -1
+ }
+}
+```
-----------------------
From 1b915d57bf54c46f070b2852f12407e5ea2d6492 Mon Sep 17 00:00:00 2001
From: ironartisan
Date: Thu, 26 Aug 2021 20:14:24 +0800
Subject: [PATCH 0099/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A00455.=E5=88=86?=
=?UTF-8?q?=E5=8F=91=E9=A5=BC=E5=B9=B2Python3=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...10\206\345\217\221\351\245\274\345\271\262.md" | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md"
index f377b99ee4..1e1c4afe25 100644
--- "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md"
+++ "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md"
@@ -156,6 +156,7 @@ class Solution {
Python:
```python3
class Solution:
+ # 思路1:优先考虑胃饼干
def findContentChildren(self, g: List[int], s: List[int]) -> int:
g.sort()
s.sort()
@@ -165,6 +166,20 @@ class Solution:
res += 1
return res
```
+```python
+class Solution:
+ # 思路2:优先考虑胃口
+ def findContentChildren(self, g: List[int], s: List[int]) -> int:
+ g.sort()
+ s.sort()
+ start, count = len(s) - 1, 0
+ for index in range(len(g) - 1, -1, -1): # 先喂饱大胃口
+ if start >= 0 and g[index] <= s[start]:
+ start -= 1
+ count += 1
+ return count
+```
+
Go:
```golang
//排序后,局部最优
From 31dfca184b56926c5c53805d28068efb0986e189 Mon Sep 17 00:00:00 2001
From: YiChih Wang
Date: Thu, 26 Aug 2021 20:32:58 +0800
Subject: [PATCH 0100/3468] =?UTF-8?q?=E4=BF=AE=E6=AD=A30027.=E7=A7=BB?=
=?UTF-8?q?=E9=99=A4=E5=85=83=E7=B4=A0Rust=E8=AA=9E=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
1. 根據題目須回傳i32而非&mut Vec
2. 改以Owner介紹的雙指針法解題
---
...73\351\231\244\345\205\203\347\264\240.md" | 20 +++++++++----------
1 file changed, 9 insertions(+), 11 deletions(-)
diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md"
index fadd4d7e11..dc913494ba 100644
--- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md"
+++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md"
@@ -201,19 +201,17 @@ end
```
Rust:
```rust
-pub fn remove_element(nums: &mut Vec, val: i32) -> &mut Vec {
- let mut start: usize = 0;
- while start < nums.len() {
- if nums[start] == val {
- nums.remove(start);
+impl Solution {
+ pub fn remove_element(nums: &mut Vec, val: i32) -> i32 {
+ let mut slowIdx = 0;
+ for pos in (0..nums.len()) {
+ if nums[pos]!=val {
+ nums[slowIdx] = nums[pos];
+ slowIdx += 1;
+ }
}
- start += 1;
+ return (slowIdx) as i32;
}
- nums
-}
-fn main() {
- let mut nums = vec![5,1,3,5,2,3,4,1];
- println!("{:?}",remove_element(&mut nums, 5));
}
```
From 1ded7e92b975da71d32dd752d3b98816be3b2d30 Mon Sep 17 00:00:00 2001
From: YiChih Wang
Date: Thu, 26 Aug 2021 21:15:58 +0800
Subject: [PATCH 0101/3468] =?UTF-8?q?=E5=A2=9E=E5=8A=A00209.=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?Rust=E8=AA=9E=E8=A8=80=E5=AF=A6=E7=8F=BE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Note
- leetcode上提交通過
---
...04\345\255\220\346\225\260\347\273\204.md" | 26 +++++++++++++++++++
1 file changed, 26 insertions(+)
diff --git "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md"
index 45d2a22948..ceca8c8739 100644
--- "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md"
+++ "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md"
@@ -237,6 +237,32 @@ func minSubArrayLen(_ target: Int, _ nums: [Int]) -> Int {
}
```
+Rust:
+
+```rust
+impl Solution {
+ 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;
+ while sum >= target {
+ subLength = (pos - i + 1) as i32;
+ if result > subLength {
+ result = subLength;
+ }
+ sum -= nums[i];
+ i += 1;
+ }
+ }
+ if result == i32::MAX {
+ return 0;
+ }
+ result
+ }
+}
+```
-----------------------
From ce8d523de2e89a942fdcdcf534fa045ea84ed56c Mon Sep 17 00:00:00 2001
From: YiChih Wang
Date: Thu, 26 Aug 2021 21:34:35 +0800
Subject: [PATCH 0102/3468] =?UTF-8?q?=E5=A2=9E=E5=8A=A00059.=E8=9E=BA?=
=?UTF-8?q?=E6=97=8B=E7=9F=A9=E9=98=B5II=20Rust=E8=AA=9E=E8=A8=80=E5=AF=A6?=
=?UTF-8?q?=E7=8F=BE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Note
- leetcode上提交通過
---
...\346\227\213\347\237\251\351\230\265II.md" | 52 +++++++++++++++++++
1 file changed, 52 insertions(+)
diff --git "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md"
index 7d02ff154c..228892de75 100644
--- "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md"
+++ "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md"
@@ -358,6 +358,58 @@ func generateMatrix(_ n: Int) -> [[Int]] {
}
```
+Rust:
+
+```rust
+impl Solution {
+ pub fn generate_matrix(n: i32) -> Vec> {
+ let mut res = vec![vec![0; n as usize]; n as usize];
+ let (mut startX, mut startY, mut offset): (usize, usize, usize) = (0, 0, 1);
+ let mut loopIdx = n/2;
+ let mid: usize = loopIdx as usize;
+ let mut count = 1;
+ let (mut i, mut j): (usize, usize) = (0, 0);
+ while loopIdx > 0 {
+ i = startX;
+ j = startY;
+
+ while j < (startY + (n as usize) - offset) {
+ res[i][j] = count;
+ count += 1;
+ j += 1;
+ }
+
+ while i < (startX + (n as usize) - offset) {
+ res[i][j] = count;
+ count += 1;
+ i += 1;
+ }
+
+ while j > startY {
+ res[i][j] = count;
+ count += 1;
+ j -= 1;
+ }
+
+ while i > startX {
+ res[i][j] = count;
+ count += 1;
+ i -= 1;
+ }
+
+ startX += 1;
+ startY += 1;
+ offset += 2;
+ loopIdx -= 1;
+ }
+
+ if(n % 2 == 1) {
+ res[mid][mid] = count;
+ }
+ res
+ }
+}
+```
-----------------------
From fcc8324d31e45a26e6b1deacdcdef2e08974e602 Mon Sep 17 00:00:00 2001
From: Corki <61616424+KangJ227@users.noreply.github.com>
Date: Fri, 27 Aug 2021 00:07:05 +0800
Subject: [PATCH 0103/3468] =?UTF-8?q?Update=200205.=E5=90=8C=E6=9E=84?=
=?UTF-8?q?=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
添加Go语言版本
---
...\204\345\255\227\347\254\246\344\270\262.md" | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git "a/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md" "b/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md"
index 5b0dd82bc9..5d20aa4a80 100644
--- "a/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md"
+++ "b/problems/0205.\345\220\214\346\236\204\345\255\227\347\254\246\344\270\262.md"
@@ -97,6 +97,23 @@ class Solution {
## Go
```go
+func isIsomorphic(s string, t string) bool {
+ map1 := make(map[byte]byte)
+ map2 := make(map[byte]byte)
+ for i := range s {
+ if _, ok := map1[s[i]]; !ok {
+ map1[s[i]] = t[i] // map1保存 s[i] 到 t[j]的映射
+ }
+ if _, ok := map2[t[i]]; !ok {
+ map2[t[i]] = s[i] // map2保存 t[i] 到 s[j]的映射
+ }
+ // 无法映射,返回 false
+ if (map1[s[i]] != t[i]) || (map2[t[i]] != s[i]) {
+ return false
+ }
+ }
+ return true
+}
```
## JavaScript
From 7c83141ce27f0aead1250ac9722ca54d8728912a Mon Sep 17 00:00:00 2001
From: Qi Jia <13632059+jackeyjia@users.noreply.github.com>
Date: Thu, 26 Aug 2021 22:25:12 -0700
Subject: [PATCH 0104/3468] add type for each go and js code block
---
...40\221\347\220\206\350\256\272\345\237\272\347\241\200.md" | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md"
index edd1fed47b..94a0d67fc9 100644
--- "a/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md"
+++ "b/problems/\344\272\214\345\217\211\346\240\221\347\220\206\350\256\272\345\237\272\347\241\200.md"
@@ -215,7 +215,7 @@ class TreeNode:
```
Go:
-```
+```go
type TreeNode struct {
Val int
Left *TreeNode
@@ -224,7 +224,7 @@ type TreeNode struct {
```
JavaScript:
-```
+```javascript
function TreeNode(val, left, right) {
this.val = (val===undefined ? 0 : val)
this.left = (left===undefined ? null : left)
From 7447e9aed0de51117277a4f3797a3283fb129b8b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9E=81=E5=AE=A2=E5=AD=A6=E4=BC=9F?=
Date: Fri, 27 Aug 2021 13:35:24 +0800
Subject: [PATCH 0105/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20349.=20=E4=B8=A4?=
=?UTF-8?q?=E4=B8=AA=E6=95=B0=E7=BB=84=E7=9A=84=E4=BA=A4=E9=9B=86=20Swift?=
=?UTF-8?q?=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...3\204\347\232\204\344\272\244\351\233\206.md" | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md"
index 62abf6399f..fe9b912140 100644
--- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md"
+++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md"
@@ -192,6 +192,22 @@ var intersection = function(nums1, nums2) {
};
```
+Swift:
+```swift
+func intersection(_ nums1: [Int], _ nums2: [Int]) -> [Int] {
+ var set1 = Set()
+ var set2 = Set()
+ for num in nums1 {
+ set1.insert(num)
+ }
+ for num in nums2 {
+ if set1.contains(num) {
+ set2.insert(num)
+ }
+ }
+ return Array(set2)
+}
+```
## 相关题目
From 3a51b65106147ccf6c503cdd443a36bcacbe4009 Mon Sep 17 00:00:00 2001
From: YDLIN <1924723909@qq.com>
Date: Fri, 27 Aug 2021 18:10:28 +0800
Subject: [PATCH 0106/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A00541.=20=E5=8F=8D?=
=?UTF-8?q?=E8=BD=AC=E5=AD=97=E7=AC=A6=E4=B8=B2II=20Swift=E7=89=88?=
=?UTF-8?q?=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...\345\255\227\347\254\246\344\270\262II.md" | 22 +++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md"
index 02713c65a4..bdcb0ff8de 100644
--- "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md"
+++ "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md"
@@ -226,6 +226,28 @@ var reverseStr = function(s, k) {
```
+Swift:
+
+```swift
+func reverseStr(_ s: String, _ k: Int) -> String {
+ var ch = Array(s)
+
+ for i in stride(from: 0, to: ch.count, by: 2 * k) {
+ var left = i
+ var right = min(s.count - 1, left + k - 1)
+
+ while left < right {
+ (ch[left], ch[right]) = (ch[right], ch[left])
+ left += 1
+ right -= 1
+ }
+ }
+ return String(ch)
+}
+```
+
+
+
-----------------------
From 0a68e191581e898d6fd5def820c4a4e2b16a896f Mon Sep 17 00:00:00 2001
From: yqq
Date: Fri, 27 Aug 2021 19:24:46 +0800
Subject: [PATCH 0107/3468] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20673.=E6=9C=80?=
=?UTF-8?q?=E9=95=BF=E9=80=92=E5=A2=9E=E5=AD=90=E5=BA=8F=E5=88=97=E7=9A=84?=
=?UTF-8?q?=E4=B8=AA=E6=95=B0=20=E7=9A=84=20Java,=20Python,=20Go=E8=AF=AD?=
=?UTF-8?q?=E8=A8=80=E5=AE=9E=E7=8E=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...27\347\232\204\344\270\252\346\225\260.md" | 98 +++++++++++++++++++
1 file changed, 98 insertions(+)
diff --git "a/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md" "b/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md"
index ce3e863997..b3907e0e1d 100644
--- "a/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md"
+++ "b/problems/0673.\346\234\200\351\225\277\351\200\222\345\242\236\345\255\220\345\272\217\345\210\227\347\232\204\344\270\252\346\225\260.md"
@@ -9,6 +9,10 @@
# 673.最长递增子序列的个数
+
+[力扣题目链接](https://leetcode-cn.com/problems/number-of-longest-increasing-subsequence/)
+
+
给定一个未排序的整数数组,找到最长递增子序列的个数。
示例 1:
@@ -224,16 +228,110 @@ public:
## Java
```java
+class Solution {
+ public int findNumberOfLIS(int[] nums) {
+ if (nums.length <= 1) return nums.length;
+ int[] dp = new int[nums.length];
+ for(int i = 0; i < dp.length; i++) dp[i] = 1;
+ int[] count = new int[nums.length];
+ for(int i = 0; i < count.length; i++) count[i] = 1;
+
+ int maxCount = 0;
+ for (int i = 1; i < nums.length; i++) {
+ for (int j = 0; j < i; j++) {
+ if (nums[i] > nums[j]) {
+ if (dp[j] + 1 > dp[i]) {
+ dp[i] = dp[j] + 1;
+ count[i] = count[j];
+ } else if (dp[j] + 1 == dp[i]) {
+ count[i] += count[j];
+ }
+ }
+ if (dp[i] > maxCount) maxCount = dp[i];
+ }
+ }
+ int result = 0;
+ for (int i = 0; i < nums.length; i++) {
+ if (maxCount == dp[i]) result += count[i];
+ }
+ return result;
+ }
+}
```
## Python
```python
+class Solution:
+ def findNumberOfLIS(self, nums: List[int]) -> int:
+ size = len(nums)
+ if size<= 1: return size
+
+ dp = [1 for i in range(size)]
+ count = [1 for i in range(size)]
+
+ maxCount = 0
+ for i in range(1, size):
+ for j in range(i):
+ if nums[i] > nums[j]:
+ if dp[j] + 1 > dp[i] :
+ dp[i] = dp[j] + 1
+ count[i] = count[j]
+ elif dp[j] + 1 == dp[i] :
+ count[i] += count[j]
+ if dp[i] > maxCount:
+ maxCount = dp[i];
+ result = 0
+ for i in range(size):
+ if maxCount == dp[i]:
+ result += count[i]
+ return result;
```
## Go
```go
+
+func findNumberOfLIS(nums []int) int {
+ size := len(nums)
+ if size <= 1 {
+ return size
+ }
+
+ dp := make([]int, size);
+ for i, _ := range dp {
+ dp[i] = 1
+ }
+ count := make([]int, size);
+ for i, _ := range count {
+ count[i] = 1
+ }
+
+ maxCount := 0
+ for i := 1; i < size; i++ {
+ for j := 0; j < i; j++ {
+ if nums[i] > nums[j] {
+ if dp[j] + 1 > dp[i] {
+ dp[i] = dp[j] + 1
+ count[i] = count[j]
+ } else if dp[j] + 1 == dp[i] {
+ count[i] += count[j]
+ }
+ }
+ if dp[i] > maxCount {
+ maxCount = dp[i]
+ }
+ }
+ }
+
+ result := 0
+ for i := 0; i < size; i++ {
+ if maxCount == dp[i] {
+ result += count[i]
+ }
+ }
+ return result
+}
```
## JavaScript
From fa309c928d9b36e27c1bc57be973af3cc0b92489 Mon Sep 17 00:00:00 2001
From: hailincai
Date: Fri, 27 Aug 2021 07:43:28 -0400
Subject: [PATCH 0108/3468] =?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
---
...\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md" "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md"
index f4abc535e0..455a3c3330 100644
--- "a/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md"
+++ "b/problems/\350\203\214\345\214\205\351\227\256\351\242\230\347\220\206\350\256\272\345\237\272\347\241\200\345\256\214\345\205\250\350\203\214\345\214\205.md"
@@ -80,7 +80,7 @@ dp状态图如下:
* [动态规划:关于01背包问题,你该了解这些!](https://programmercarl.com/背包理论基础01背包-1.html)
* [动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html)
-就知道了,01背包中二维dp数组的两个for遍历的先后循序是可以颠倒了,一位dp数组的两个for循环先后循序一定是先遍历物品,再遍历背包容量。
+就知道了,01背包中二维dp数组的两个for遍历的先后循序是可以颠倒了,一维dp数组的两个for循环先后循序一定是先遍历物品,再遍历背包容量。
**在完全背包中,对于一维dp数组来说,其实两个for循环嵌套顺序同样无所谓!**
From d6531b0f2b9699031087ad660ea6744e5c36508a Mon Sep 17 00:00:00 2001
From: ironartisan
Date: Fri, 27 Aug 2021 21:25:07 +0800
Subject: [PATCH 0109/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A00541=E7=BF=BB?=
=?UTF-8?q?=E8=BD=AC=E5=AD=97=E7=AC=A6=E4=B8=B2java=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...\345\255\227\347\254\246\344\270\262II.md" | 28 +++++++++++++++++++
1 file changed, 28 insertions(+)
diff --git "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md"
index 02713c65a4..914fba2379 100644
--- "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md"
+++ "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md"
@@ -152,7 +152,35 @@ class Solution {
}
}
```
+```java
+// 解法3
+class Solution {
+ public String reverseStr(String s, int k) {
+ char[] ch = s.toCharArray();
+ // 1. 每隔 2k 个字符的前 k 个字符进行反转
+ for (int i = 0; i< ch.length; i += 2 * k) {
+ // 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
+ if (i + k <= ch.length) {
+ reverse(ch, i, i + k -1);
+ continue;
+ }
+ // 3. 剩余字符少于 k 个,则将剩余字符全部反转
+ reverse(ch, i, ch.length - 1);
+ }
+ return new String(ch);
+ }
+ // 定义翻转函数
+ public void reverse(char[] ch, int i, int j) {
+ for (; i < j; i++, j--) {
+ char temp = ch[i];
+ ch[i] = ch[j];
+ ch[j] = temp;
+ }
+
+ }
+}
+```
Python:
```python
class Solution:
From 65edb41040dd0f7d4e5062ceee8d617886a62fa0 Mon Sep 17 00:00:00 2001
From: Wen
Date: Fri, 27 Aug 2021 22:46:24 +0800
Subject: [PATCH 0110/3468] =?UTF-8?q?=E4=BC=98=E5=8C=96=200059.=E8=9E=BA?=
=?UTF-8?q?=E6=97=8B=E7=9F=A9=E9=98=B5II.md=20Python3=E8=A7=A3=E6=B3=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...\346\227\213\347\237\251\351\230\265II.md" | 61 ++++++++++++-------
1 file changed, 38 insertions(+), 23 deletions(-)
diff --git "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md"
index 7d02ff154c..6078654225 100644
--- "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md"
+++ "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md"
@@ -191,33 +191,48 @@ class Solution {
python:
-```python
+```python3
class Solution:
+
def generateMatrix(self, n: int) -> List[List[int]]:
- left, right, up, down = 0, n-1, 0, n-1
- matrix = [ [0]*n for _ in range(n)]
- num = 1
- while left<=right and up<=down:
- # 填充左到右
- for i in range(left, right+1):
- matrix[up][i] = num
- num += 1
- up += 1
- # 填充上到下
- for i in range(up, down+1):
- matrix[i][right] = num
- num += 1
+ # 初始化要填充的正方形
+ matrix = [[0] * n for _ in range(n)]
+
+ left, right, up, down = 0, n - 1, 0, n - 1
+ number = 1 # 要填充的数字
+
+ while left < right and up < down:
+
+ # 从左到右填充上边
+ for x in range(left, right):
+ matrix[up][x] = number
+ number += 1
+
+ # 从上到下填充右边
+ for y in range(up, down):
+ matrix[y][right] = number
+ number += 1
+
+ # 从右到左填充下边
+ for x in range(right, left, -1):
+ matrix[down][x] = number
+ number += 1
+
+ # 从下到上填充左边
+ for y in range(down, up, -1):
+ matrix[y][left] = number
+ number += 1
+
+ # 缩小要填充的范围
+ left += 1
right -= 1
- # 填充右到左
- for i in range(right, left-1, -1):
- matrix[down][i] = num
- num += 1
+ up += 1
down -= 1
- # 填充下到上
- for i in range(down, up-1, -1):
- matrix[i][left] = num
- num += 1
- left += 1
+
+ # 如果阶数为奇数,额外填充一次中心
+ if n % 2:
+ matrix[n // 2][n // 2] = number
+
return matrix
```
From 51f217b501c06a25dfaab7eb5b6bf59b8435cbb2 Mon Sep 17 00:00:00 2001
From: XuDaHaoRen <1547794387@qq.com>
Date: Fri, 27 Aug 2021 23:02:34 +0800
Subject: [PATCH 0111/3468] =?UTF-8?q?=E8=BF=9E=E6=8E=A5=E6=9B=B4=E6=96=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git "a/problems/\345\211\215\345\272\217/\344\270\212\346\265\267\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" "b/problems/\345\211\215\345\272\217/\344\270\212\346\265\267\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md"
index 05cbe1b01a..08c1589511 100644
--- "a/problems/\345\211\215\345\272\217/\344\270\212\346\265\267\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md"
+++ "b/problems/\345\211\215\345\272\217/\344\270\212\346\265\267\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md"
@@ -112,7 +112,7 @@
## 总结
-大家如果看了[北京有这些互联网公司,你都知道么?](https://mp.weixin.qq.com/s/BKrjK4myNB-FYbMqW9f3yw)和[深圳原来有这么多互联网公司,你都知道么?](https://mp.weixin.qq.com/s/3VJHF2zNohBwDBxARFIn-Q)就可以看出中国互联网氛围最浓的当然是北京,其次就是上海!
+大家如果看了[北京有这些互联网公司,你都知道么?](https://programmercarl.com/前序/北京互联网公司总结.html)和[深圳原来有这么多互联网公司,你都知道么?](https://programmercarl.com/前序/深圳互联网公司总结.html)就可以看出中国互联网氛围最浓的当然是北京,其次就是上海!
很多人说深圳才是第二,上海没有产生BAT之类的企业。
From 9021e6815bc8412a231c20b94af7e30a4571324d Mon Sep 17 00:00:00 2001
From: XuDaHaoRen <1547794387@qq.com>
Date: Fri, 27 Aug 2021 23:08:09 +0800
Subject: [PATCH 0112/3468] =?UTF-8?q?=E8=BF=9E=E6=8E=A5=E6=9B=B4=E6=96=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...\240\344\270\252\347\226\221\351\227\256\357\274\237.md" | 6 +++---
...\226\350\257\221\350\277\220\350\241\214\357\274\237.md" | 2 +-
...\221\345\205\254\345\217\270\346\200\273\347\273\223.md" | 3 +--
...\215\346\235\202\345\272\246\345\210\206\346\236\220.md" | 2 +-
4 files changed, 6 insertions(+), 7 deletions(-)
diff --git "a/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\345\217\257\350\203\275\346\234\211\345\207\240\344\270\252\347\226\221\351\227\256\357\274\237.md" "b/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\345\217\257\350\203\275\346\234\211\345\207\240\344\270\252\347\226\221\351\227\256\357\274\237.md"
index 5b2f73e2d9..510979c9cf 100644
--- "a/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\345\217\257\350\203\275\346\234\211\345\207\240\344\270\252\347\226\221\351\227\256\357\274\237.md"
+++ "b/problems/\345\211\215\345\272\217/\345\205\263\344\272\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\357\274\214\345\217\257\350\203\275\346\234\211\345\207\240\344\270\252\347\226\221\351\227\256\357\274\237.md"
@@ -10,9 +10,9 @@
# 空间复杂度分析
-* [关于时间复杂度,你不知道的都在这里!](https://mp.weixin.qq.com/s/LWBfehW1gMuEnXtQjJo-sw)
-* [O(n)的算法居然超时了,此时的n究竟是多大?](https://mp.weixin.qq.com/s/73ryNsuPFvBQkt6BbhNzLA)
-* [通过一道面试题目,讲一讲递归算法的时间复杂度!](https://mp.weixin.qq.com/s/I6ZXFbw09NR31F5CJR_geQ)
+* [关于时间复杂度,你不知道的都在这里!](https://programmercarl.com/前序/关于时间复杂度,你不知道的都在这里!.html)
+* [O(n)的算法居然超时了,此时的n究竟是多大?](https://programmercarl.com/前序/On的算法居然超时了,此时的n究竟是多大?.html)
+* [通过一道面试题目,讲一讲递归算法的时间复杂度!](https://programmercarl.com/前序/通过一道面试题目,讲一讲递归算法的时间复杂度!.html)
那么一直还没有讲空间复杂度,所以打算陆续来补上,内容不难,大家可以读一遍文章就有整体的了解了。
diff --git "a/problems/\345\211\215\345\272\217/\345\212\233\346\211\243\344\270\212\347\232\204\344\273\243\347\240\201\346\203\263\345\234\250\346\234\254\345\234\260\347\274\226\350\257\221\350\277\220\350\241\214\357\274\237.md" "b/problems/\345\211\215\345\272\217/\345\212\233\346\211\243\344\270\212\347\232\204\344\273\243\347\240\201\346\203\263\345\234\250\346\234\254\345\234\260\347\274\226\350\257\221\350\277\220\350\241\214\357\274\237.md"
index a0fcbcd825..970af7ffc6 100644
--- "a/problems/\345\211\215\345\272\217/\345\212\233\346\211\243\344\270\212\347\232\204\344\273\243\347\240\201\346\203\263\345\234\250\346\234\254\345\234\260\347\274\226\350\257\221\350\277\220\350\241\214\357\274\237.md"
+++ "b/problems/\345\211\215\345\272\217/\345\212\233\346\211\243\344\270\212\347\232\204\344\273\243\347\240\201\346\203\263\345\234\250\346\234\254\345\234\260\347\274\226\350\257\221\350\277\220\350\241\214\357\274\237.md"
@@ -23,7 +23,7 @@
其实挺简单的,大家看一遍就会了。
-我拿我们刚讲过的这道题[动态规划:使用最小花费爬楼梯](https://mp.weixin.qq.com/s/djZB9gkyLFAKcQcSvKDorA)来做示范。
+我拿我们刚讲过的这道题[动态规划:使用最小花费爬楼梯](https://programmercarl.com/0746.使用最小花费爬楼梯.html)来做示范。
力扣746. 使用最小花费爬楼梯,完整的可以在直接本地运行的C++代码如下:
diff --git "a/problems/\345\211\215\345\272\217/\346\235\255\345\267\236\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" "b/problems/\345\211\215\345\272\217/\346\235\255\345\267\236\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md"
index aebf5779b0..326a176b73 100644
--- "a/problems/\345\211\215\345\272\217/\346\235\255\345\267\236\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md"
+++ "b/problems/\345\211\215\345\272\217/\346\235\255\345\267\236\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md"
@@ -67,11 +67,10 @@
* 大搜车(总部)中国领先的汽车交易服务供应商
* 二更(总部)自媒体
* 丁香园(总部)
-
## 总结
-杭州距离上海非常近,难免不了和上海做对比,上海是金融之都,如果看了[上海有这些互联网公司,你都知道么?](https://mp.weixin.qq.com/s/iW4_rXQzc0fJDuSmPTUVdQ)就会发现上海互联网也是仅次于北京的。
+杭州距离上海非常近,难免不了和上海做对比,上海是金融之都,如果看了[上海有这些互联网公司,你都知道么?](https://programmercarl.com/前序/上海互联网公司总结.html)就会发现上海互联网也是仅次于北京的。
而杭州是阿里的大本营,到处都有阿里的影子,虽然有网易在,但是也基本是盖过去了,很多中小公司也都是阿里某某高管出来创业的。
diff --git "a/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" "b/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md"
index b6c79f2506..27b9d7ccd6 100644
--- "a/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md"
+++ "b/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md"
@@ -9,7 +9,7 @@
# 递归算法的时间与空间复杂度分析!
-之前在[通过一道面试题目,讲一讲递归算法的时间复杂度!](https://mp.weixin.qq.com/s/I6ZXFbw09NR31F5CJR_geQ)中详细讲解了递归算法的时间复杂度,但没有讲空间复杂度。
+之前在[通过一道面试题目,讲一讲递归算法的时间复杂度!](https://programmercarl.com/前序/通过一道面试题目,讲一讲递归算法的时间复杂度!.html)中详细讲解了递归算法的时间复杂度,但没有讲空间复杂度。
本篇讲通过求斐波那契数列和二分法再来深入分析一波递归算法的时间和空间复杂度,细心看完,会刷新对递归的认知!
From 48ab781c4e6c3d8c6ddf9610f5adda300884b291 Mon Sep 17 00:00:00 2001
From: ironartisan
Date: Sat, 28 Aug 2021 09:39:16 +0800
Subject: [PATCH 0113/3468] =?UTF-8?q?=E4=BC=98=E5=8C=960122.=E4=B9=B0?=
=?UTF-8?q?=E5=8D=96=E8=82=A1=E7=A5=A8=E7=9A=84=E6=9C=80=E4=BD=B3=E6=97=B6?=
=?UTF-8?q?=E6=9C=BAII=20Java=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...234\200\344\275\263\346\227\266\346\234\272II.md" | 12 +++---------
1 file changed, 3 insertions(+), 9 deletions(-)
diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md"
index ff1b6d4a9d..29aa5b837f 100644
--- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md"
+++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md"
@@ -139,17 +139,11 @@ Java:
// 贪心思路
class Solution {
public int maxProfit(int[] prices) {
- int sum = 0;
- int profit = 0;
- int buy = prices[0];
+ int result = 0;
for (int i = 1; i < prices.length; i++) {
- profit = prices[i] - buy;
- if (profit > 0) {
- sum += profit;
- }
- buy = prices[i];
+ result += Math.max(prices[i] - prices[i - 1], 0);
}
- return sum;
+ return result;
}
}
```
From 3fcf18b0489295c81d11524945ad7f494a8decc2 Mon Sep 17 00:00:00 2001
From: YDLIN <1924723909@qq.com>
Date: Sat, 28 Aug 2021 11:03:51 +0800
Subject: [PATCH 0114/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=89=91=E6=8C=87O?=
=?UTF-8?q?ffer=2005.=E6=9B=BF=E6=8D=A2=E7=A9=BA=E6=A0=BC=20Swift=E7=89=88?=
=?UTF-8?q?=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...77\346\215\242\347\251\272\346\240\274.md" | 43 +++++++++++++++++++
1 file changed, 43 insertions(+)
diff --git "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md" "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md"
index 3294a16bf3..479073199c 100644
--- "a/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md"
+++ "b/problems/\345\211\221\346\214\207Offer05.\346\233\277\346\215\242\347\251\272\346\240\274.md"
@@ -264,6 +264,49 @@ javaScript:
};
```
+Swift:
+
+```swift
+func replaceSpace(_ s: String) -> String {
+ var strArr = Array(s)
+ var count = 0
+
+ // 统计空格的个数
+ for i in strArr {
+ if i == " " {
+ count += 1
+ }
+ }
+ // left 指向旧数组的最后一个元素
+ var left = strArr.count - 1
+ // right 指向扩容后数组的最后一个元素(这里还没对数组进行实际上的扩容)
+ var right = strArr.count + count * 2 - 1
+
+ // 实际对数组扩容
+ for _ in 0..<(count * 2) {
+ strArr.append(" ")
+ }
+
+ while left < right {
+ if strArr[left] == " " {
+ strArr[right] = "0"
+ strArr[right - 1] = "2"
+ strArr[right - 2] = "%"
+ left -= 1
+ right -= 3
+ } else {
+ strArr[right] = strArr[left]
+ left -= 1
+ right -= 1
+ }
+ }
+
+ return String(strArr)
+}
+```
+
+
+
-----------------------
From 54e4f43853f132f74ce7b8300e392e44a77c97ad Mon Sep 17 00:00:00 2001
From: XuDaHaoRen <1547794387@qq.com>
Date: Sat, 28 Aug 2021 12:00:54 +0800
Subject: [PATCH 0115/3468] =?UTF-8?q?=E5=91=A8=E6=80=BB=E7=BB=93=EF=BC=9A?=
=?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91+=E5=A4=8D=E6=9D=82=E5=BA=A6?=
=?UTF-8?q?=E8=BF=9E=E6=8E=A5=E6=9B=BF=E6=8D=A2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...50\346\234\253\346\200\273\347\273\223.md" | 14 ++++-----
...50\346\234\253\346\200\273\347\273\223.md" | 20 ++++++-------
...50\346\234\253\346\200\273\347\273\223.md" | 30 +++++++++----------
...50\346\234\253\346\200\273\347\273\223.md" | 26 ++++++++--------
...50\346\234\253\346\200\273\347\273\223.md" | 10 +++----
...23\347\263\273\345\210\227\344\270\200.md" | 28 ++++++++---------
6 files changed, 64 insertions(+), 64 deletions(-)
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20200927\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20200927\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md"
index f81cc6bb71..5a7e398aca 100644
--- "a/problems/\345\221\250\346\200\273\347\273\223/20200927\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md"
+++ "b/problems/\345\221\250\346\200\273\347\273\223/20200927\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md"
@@ -7,7 +7,7 @@
## 周一
-本周我们开始讲解了二叉树,在[关于二叉树,你该了解这些!](https://mp.weixin.qq.com/s/_ymfWYvTNd2GvWvC5HOE4A)中讲解了二叉树的理论基础。
+本周我们开始讲解了二叉树,在[关于二叉树,你该了解这些!](https://programmercarl.com/二叉树理论基础.html)中讲解了二叉树的理论基础。
有同学会把红黑树和二叉平衡搜索树弄分开了,其实红黑树就是一种二叉平衡搜索树,这两个树不是独立的,所以C++中map、multimap、set、multiset的底层实现机制是二叉平衡搜索树,再具体一点是红黑树。
@@ -48,9 +48,9 @@ morris遍历是二叉树遍历算法的超强进阶算法,morris遍历可以
## 周二
-在[二叉树:一入递归深似海,从此offer是路人](https://mp.weixin.qq.com/s/PwVIfxDlT3kRgMASWAMGhA)中讲到了递归三要素,以及前中后序的递归写法。
+在[二叉树:一入递归深似海,从此offer是路人](https://programmercarl.com/二叉树的递归遍历.html)中讲到了递归三要素,以及前中后序的递归写法。
-文章中我给出了leetcode上三道二叉树的前中后序题目,但是看完[二叉树:一入递归深似海,从此offer是路人](https://mp.weixin.qq.com/s/PwVIfxDlT3kRgMASWAMGhA),依然可以解决n叉树的前后序遍历,在leetcode上分别是
+文章中我给出了leetcode上三道二叉树的前中后序题目,但是看完[二叉树:一入递归深似海,从此offer是路人](https://programmercarl.com/二叉树的递归遍历.html),依然可以解决n叉树的前后序遍历,在leetcode上分别是
* 589. N叉树的前序遍历
* 590. N叉树的后序遍历
@@ -58,7 +58,7 @@ morris遍历是二叉树遍历算法的超强进阶算法,morris遍历可以
## 周三
-在[二叉树:听说递归能做的,栈也能做!](https://mp.weixin.qq.com/s/c_zCrGHIVlBjUH_hJtghCg)中我们开始用栈来实现递归的写法,也就是所谓的迭代法。
+在[二叉树:听说递归能做的,栈也能做!](https://programmercarl.com/二叉树的迭代遍历.html)中我们开始用栈来实现递归的写法,也就是所谓的迭代法。
细心的同学发现文中前后序遍历空节点是否入栈写法是不同的
@@ -121,7 +121,7 @@ public:
## 周四
-在[二叉树:前中后序迭代方式的写法就不能统一一下么?](https://mp.weixin.qq.com/s/WKg0Ty1_3SZkztpHubZPRg)中我们使用空节点作为标记,给出了统一的前中后序迭代法。
+在[二叉树:前中后序迭代方式的写法就不能统一一下么?](https://programmercarl.com/二叉树的统一迭代法.html)中我们使用空节点作为标记,给出了统一的前中后序迭代法。
此时又多了一种前中后序的迭代写法,那么有同学问了:前中后序迭代法是不是一定要统一来写,这样才算是规范。
@@ -131,7 +131,7 @@ public:
## 周五
-在[二叉树:层序遍历登场!](https://mp.weixin.qq.com/s/Gb3BjakIKGNpup2jYtTzog)中我们介绍了二叉树的另一种遍历方式(图论中广度优先搜索在二叉树上的应用)即:层序遍历。
+在[二叉树:层序遍历登场!](https://programmercarl.com/0102.二叉树的层序遍历.html)中我们介绍了二叉树的另一种遍历方式(图论中广度优先搜索在二叉树上的应用)即:层序遍历。
看完这篇文章,去leetcode上怒刷五题,文章中 编号107题目的样例图放错了(原谅我匆忙之间总是手抖),但不影响大家理解。
@@ -141,7 +141,7 @@ public:
## 周六
-在[二叉树:你真的会翻转二叉树么?](https://mp.weixin.qq.com/s/6gY1MiXrnm-khAAJiIb5Bg)中我们把翻转二叉树这么一道简单又经典的问题,充分的剖析了一波,相信就算做过这道题目的同学,看完本篇之后依然有所收获!
+在[二叉树:你真的会翻转二叉树么?](https://programmercarl.com/0226.翻转二叉树.html)中我们把翻转二叉树这么一道简单又经典的问题,充分的剖析了一波,相信就算做过这道题目的同学,看完本篇之后依然有所收获!
**文中我指的是递归的中序遍历是不行的,因为使用递归的中序遍历,某些节点的左右孩子会翻转两次。**
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201003\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201003\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md"
index db89fc827b..a0b8c2dd3c 100644
--- "a/problems/\345\221\250\346\200\273\347\273\223/20201003\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md"
+++ "b/problems/\345\221\250\346\200\273\347\273\223/20201003\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md"
@@ -7,7 +7,7 @@
## 周一
-本周刚开始我们讲解了判断二叉树是否对称的写法, [二叉树:我对称么?](https://mp.weixin.qq.com/s/Kgf0gjvlDlNDfKIH2b1Oxg)。
+本周刚开始我们讲解了判断二叉树是否对称的写法, [二叉树:我对称么?](https://programmercarl.com/0101.对称二叉树.html)。
这道题目的本质是要比较两个树(这两个树是根节点的左右子树),遍历两棵树而且要比较内侧和外侧节点,所以准确的来说是一个树的遍历顺序是左右中,一个树的遍历顺序是右左中。
@@ -17,7 +17,7 @@
* 100.相同的树
* 572.另一个树的子树
-**[二叉树:我对称么?](https://mp.weixin.qq.com/s/Kgf0gjvlDlNDfKIH2b1Oxg)中的递归法和迭代法只需要稍作修改其中一个树的遍历顺序,便可刷了100.相同的树。**
+**[二叉树:我对称么?](https://programmercarl.com/0101.对称二叉树.html)中的递归法和迭代法只需要稍作修改其中一个树的遍历顺序,便可刷了100.相同的树。**
100.相同的树的递归代码如下:
@@ -102,11 +102,11 @@ public:
## 周二
-在[二叉树:看看这些树的最大深度](https://mp.weixin.qq.com/s/guKwV-gSNbA1CcbvkMtHBg)中,我们讲解了如何求二叉树的最大深度。
+在[二叉树:看看这些树的最大深度](https://programmercarl.com/0104.二叉树的最大深度.html)中,我们讲解了如何求二叉树的最大深度。
本题可以使用前序,也可以使用后序遍历(左右中),使用前序求的就是深度,使用后序呢求的是高度。
-**而根节点的高度就是二叉树的最大深度**,所以本题中我们通过后序求的根节点高度来求的二叉树最大深度,所以[二叉树:看看这些树的最大深度](https://mp.weixin.qq.com/s/guKwV-gSNbA1CcbvkMtHBg)中使用的是后序遍历。
+**而根节点的高度就是二叉树的最大深度**,所以本题中我们通过后序求的根节点高度来求的二叉树最大深度,所以[二叉树:看看这些树的最大深度](https://programmercarl.com/0104.二叉树的最大深度.html)中使用的是后序遍历。
本题当然也可以使用前序,代码如下:(**充分表现出求深度回溯的过程**)
```CPP
@@ -169,7 +169,7 @@ public:
## 周三
-在[二叉树:看看这些树的最小深度](https://mp.weixin.qq.com/s/BH8-gPC3_QlqICDg7rGSGA)中,我们讲解如何求二叉树的最小深度, 这道题目要是稍不留心很容易犯错。
+在[二叉树:看看这些树的最小深度](https://programmercarl.com/0111.二叉树的最小深度.html)中,我们讲解如何求二叉树的最小深度, 这道题目要是稍不留心很容易犯错。
**注意这里最小深度是从根节点到最近叶子节点的最短路径上的节点数量。注意是叶子节点。**
@@ -177,19 +177,19 @@ public:
**求二叉树的最小深度和求二叉树的最大深度的差别主要在于处理左右孩子不为空的逻辑。**
-注意到这一点之后 递归法和迭代法 都可以参照[二叉树:看看这些树的最大深度](https://mp.weixin.qq.com/s/guKwV-gSNbA1CcbvkMtHBg)写出来。
+注意到这一点之后 递归法和迭代法 都可以参照[二叉树:看看这些树的最大深度](https://programmercarl.com/0104.二叉树的最大深度.html)写出来。
## 周四
-我们在[二叉树:我有多少个节点?](https://mp.weixin.qq.com/s/2_eAjzw-D0va9y4RJgSmXw)中,讲解了如何求二叉树的节点数量。
+我们在[二叉树:我有多少个节点?](https://programmercarl.com/0222.完全二叉树的节点个数.html)中,讲解了如何求二叉树的节点数量。
-这一天是十一长假的第一天,又是双节,所以简单一些,只要把之前两篇[二叉树:看看这些树的最大深度](https://mp.weixin.qq.com/s/guKwV-gSNbA1CcbvkMtHBg), [二叉树:看看这些树的最小深度](https://mp.weixin.qq.com/s/BH8-gPC3_QlqICDg7rGSGA)都认真看了的话,这道题目可以分分钟刷掉了。
+这一天是十一长假的第一天,又是双节,所以简单一些,只要把之前两篇[二叉树:看看这些树的最大深度](https://programmercarl.com/0104.二叉树的最大深度.html), [二叉树:看看这些树的最小深度](https://programmercarl.com/0111.二叉树的最小深度.html)都认真看了的话,这道题目可以分分钟刷掉了。
估计此时大家对这一类求二叉树节点数量以及求深度应该非常熟练了。
## 周五
-在[二叉树:我平衡么?](https://mp.weixin.qq.com/s/isUS-0HDYknmC0Rr4R8mww)中讲解了如何判断二叉树是否是平衡二叉树
+在[二叉树:我平衡么?](https://programmercarl.com/0110.平衡二叉树.html)中讲解了如何判断二叉树是否是平衡二叉树
今天讲解一道判断平衡二叉树的题目,其实 方法上我们之前讲解深度的时候都讲过了,但是这次我们通过这道题目彻底搞清楚二叉树高度与深度的问题,以及对应的遍历方式。
@@ -212,7 +212,7 @@ public:
## 周六
-在[二叉树:找我的所有路径?](https://mp.weixin.qq.com/s/Osw4LQD2xVUnCJ-9jrYxJA)中正式涉及到了回溯,很多同学过了这道题目,可能都不知道自己使用了回溯,其实回溯和递归都是相伴相生的。最后我依然给出了迭代法的版本。
+在[二叉树:找我的所有路径?](https://programmercarl.com/0257.二叉树的所有路径.html)中正式涉及到了回溯,很多同学过了这道题目,可能都不知道自己使用了回溯,其实回溯和递归都是相伴相生的。最后我依然给出了迭代法的版本。
我在题解中第一个版本的代码会把回溯的过程充分体现出来,如果大家直接看简洁的代码版本,很可能就会忽略的回溯的存在。
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201010\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201010\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md"
index 7b1e7f68ad..913ad963ee 100644
--- "a/problems/\345\221\250\346\200\273\347\273\223/20201010\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md"
+++ "b/problems/\345\221\250\346\200\273\347\273\223/20201010\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md"
@@ -4,7 +4,7 @@
## 周一
-在[二叉树:以为使用了递归,其实还隐藏着回溯](https://mp.weixin.qq.com/s/ivLkHzWdhjQQD1rQWe6zWA)中,通过leetcode [257.二叉树的所有路径这道题目](https://mp.weixin.qq.com/s/Osw4LQD2xVUnCJ-9jrYxJA),讲解了递归如何隐藏着回溯,一些代码会把回溯的过程都隐藏了起来了,甚至刷过这道题的同学可能都不知道自己用了回溯。
+在[二叉树:以为使用了递归,其实还隐藏着回溯](https://programmercarl.com/二叉树中递归带着回溯.html)中,通过leetcode [257.二叉树的所有路径这道题目](https://programmercarl.com/0257.二叉树的所有路径.html),讲解了递归如何隐藏着回溯,一些代码会把回溯的过程都隐藏了起来了,甚至刷过这道题的同学可能都不知道自己用了回溯。
文章中第一版代码把每一个细节都展示了输出来了,大家可以清晰的看到回溯的过程。
@@ -15,7 +15,7 @@
## 周二
-在文章[二叉树:做了这么多题目了,我的左叶子之和是多少?](https://mp.weixin.qq.com/s/gBAgmmFielojU5Wx3wqFTA) 中提供了另一个判断节点属性的思路,平时我们习惯了使用通过节点的左右孩子判断本节点的属性,但发现使用这个思路无法判断左叶子。
+在文章[二叉树:做了这么多题目了,我的左叶子之和是多少?](https://programmercarl.com/0404.左叶子之和.html) 中提供了另一个判断节点属性的思路,平时我们习惯了使用通过节点的左右孩子判断本节点的属性,但发现使用这个思路无法判断左叶子。
此时需要相连的三层之间构成的约束条件,也就是要通过节点的父节点以及孩子节点来判断本节点的属性。
@@ -24,7 +24,7 @@
## 周三
-在[二叉树:我的左下角的值是多少?](https://mp.weixin.qq.com/s/MH2gbLvzQ91jHPKqiub0Nw)中的题目如果使用递归的写法还是有点难度的,层次遍历反而很简单。
+在[二叉树:我的左下角的值是多少?](https://programmercarl.com/0513.找树左下角的值.html)中的题目如果使用递归的写法还是有点难度的,层次遍历反而很简单。
题目其实就是要在树的**最后一行**找到**最左边的值**。
@@ -32,26 +32,26 @@
在这篇文章中,我们使用递归算法实实在在的求了一次深度,然后使用靠左的遍历,保证求得靠左的最大深度,而且又一次使用了回溯。
-如果对二叉树的高度与深度又有点模糊了,在看这里[二叉树:我平衡么?](https://mp.weixin.qq.com/s/isUS-0HDYknmC0Rr4R8mww),回忆一下吧。
+如果对二叉树的高度与深度又有点模糊了,在看这里[二叉树:我平衡么?](https://programmercarl.com/0110.平衡二叉树.html),回忆一下吧。
-[二叉树:我的左下角的值是多少?](https://mp.weixin.qq.com/s/MH2gbLvzQ91jHPKqiub0Nw)中把我们之前讲过的内容都过了一遍,此外,还用前序遍历的技巧求得了靠左的最大深度。
+[二叉树:我的左下角的值是多少?](https://programmercarl.com/0513.找树左下角的值.html)中把我们之前讲过的内容都过了一遍,此外,还用前序遍历的技巧求得了靠左的最大深度。
**求二叉树的各种最值,就想应该采用什么样的遍历顺序,确定了遍历循序,其实就和数组求最值一样容易了。**
## 周四
-在[二叉树:递归函数究竟什么时候需要返回值,什么时候不要返回值?](https://mp.weixin.qq.com/s/6TWAVjxQ34kVqROWgcRFOg)中通过两道题目,彻底说清楚递归函数的返回值问题。
+在[二叉树:递归函数究竟什么时候需要返回值,什么时候不要返回值?](https://programmercarl.com/0112.路径总和.html)中通过两道题目,彻底说清楚递归函数的返回值问题。
一般情况下:**如果需要搜索整颗二叉树,那么递归函数就不要返回值,如果要搜索其中一条符合条件的路径,递归函数就需要返回值,因为遇到符合条件的路径了就要及时返回。**
特别是有些时候 递归函数的返回值是bool类型,一些同学会疑惑为啥要加这个,其实就是为了找到一条边立刻返回。
-其实还有一种就是后序遍历需要根据左右递归的返回值推出中间节点的状态,这种需要有返回值,例如[222.完全二叉树](https://mp.weixin.qq.com/s/2_eAjzw-D0va9y4RJgSmXw),[110.平衡二叉树](https://mp.weixin.qq.com/s/isUS-0HDYknmC0Rr4R8mww),这几道我们之前也讲过。
+其实还有一种就是后序遍历需要根据左右递归的返回值推出中间节点的状态,这种需要有返回值,例如[222.完全二叉树](https://programmercarl.com/0222.完全二叉树的节点个数.html),[110.平衡二叉树](https://programmercarl.com/0110.平衡二叉树.html),这几道我们之前也讲过。
## 周五
-之前都是讲解遍历二叉树,这次该构造二叉树了,在[二叉树:构造二叉树登场!](https://mp.weixin.qq.com/s/7r66ap2s-shvVvlZxo59xg)中,我们通过前序和中序,后序和中序,构造了唯一的一颗二叉树。
+之前都是讲解遍历二叉树,这次该构造二叉树了,在[二叉树:构造二叉树登场!](https://programmercarl.com/0106.从中序与后序遍历序列构造二叉树.html)中,我们通过前序和中序,后序和中序,构造了唯一的一颗二叉树。
**构造二叉树有三个注意的点:**
@@ -65,7 +65,7 @@
## 周六
-知道了如何构造二叉树,那么使用一个套路就可以解决文章[二叉树:构造一棵最大的二叉树](https://mp.weixin.qq.com/s/1iWJV6Aov23A7xCF4nV88w)中的问题。
+知道了如何构造二叉树,那么使用一个套路就可以解决文章[二叉树:构造一棵最大的二叉树](https://programmercarl.com/0654.最大二叉树.html)中的问题。
**注意类似用数组构造二叉树的题目,每次分隔尽量不要定义新的数组,而是通过下表索引直接在原数组上操作,这样可以节约时间和空间上的开销。**
@@ -77,12 +77,12 @@
本周我们深度讲解了如下知识点:
-1. [递归中如何隐藏着回溯](https://mp.weixin.qq.com/s/ivLkHzWdhjQQD1rQWe6zWA)
-2. [如何通过三层关系确定左叶子](https://mp.weixin.qq.com/s/gBAgmmFielojU5Wx3wqFTA)
-3. [如何通过二叉树深度来判断左下角的值](https://mp.weixin.qq.com/s/MH2gbLvzQ91jHPKqiub0Nw)
-4. [递归函数究竟什么时候需要返回值,什么时候不要返回值?](https://mp.weixin.qq.com/s/6TWAVjxQ34kVqROWgcRFOg)
-5. [前序和中序,后序和中序构造唯一二叉树](https://mp.weixin.qq.com/s/7r66ap2s-shvVvlZxo59xg)
-6. [使用数组构造某一特性的二叉树](https://mp.weixin.qq.com/s/1iWJV6Aov23A7xCF4nV88w)
+1. [递归中如何隐藏着回溯](https://programmercarl.com/二叉树中递归带着回溯.html)
+2. [如何通过三层关系确定左叶子](https://programmercarl.com/0404.左叶子之和.html)
+3. [如何通过二叉树深度来判断左下角的值](https://programmercarl.com/0513.找树左下角的值.html)
+4. [递归函数究竟什么时候需要返回值,什么时候不要返回值?](https://programmercarl.com/0112.路径总和.html)
+5. [前序和中序,后序和中序构造唯一二叉树](https://programmercarl.com/0106.从中序与后序遍历序列构造二叉树.html)
+6. [使用数组构造某一特性的二叉树](https://programmercarl.com/0654.最大二叉树.html)
**如果大家一路跟下来,一定收获满满,如果周末不做这个总结,大家可能都不知道自己收获满满,啊哈!**
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201017\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201017\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md"
index c061a48e87..4b219834bc 100644
--- "a/problems/\345\221\250\346\200\273\347\273\223/20201017\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md"
+++ "b/problems/\345\221\250\346\200\273\347\273\223/20201017\344\272\214\345\217\211\346\240\221\345\221\250\346\234\253\346\200\273\347\273\223.md"
@@ -6,9 +6,9 @@
## 周一
-在[二叉树:合并两个二叉树](https://mp.weixin.qq.com/s/3f5fbjOFaOX_4MXzZ97LsQ)中讲解了如何合并两个二叉树,平时我们都习惯了操作一个二叉树,一起操作两个树可能还有点陌生。
+在[二叉树:合并两个二叉树](https://programmercarl.com/0617.合并二叉树.html)中讲解了如何合并两个二叉树,平时我们都习惯了操作一个二叉树,一起操作两个树可能还有点陌生。
-其实套路是一样,只不过一起操作两个树的指针,我们之前讲过求 [二叉树:我对称么?](https://mp.weixin.qq.com/s/Kgf0gjvlDlNDfKIH2b1Oxg)的时候,已经初步涉及到了 一起遍历两颗二叉树了。
+其实套路是一样,只不过一起操作两个树的指针,我们之前讲过求 [二叉树:我对称么?](https://programmercarl.com/0101.对称二叉树.html)的时候,已经初步涉及到了 一起遍历两颗二叉树了。
**迭代法中,一般一起操作两个树都是使用队列模拟类似层序遍历,同时处理两个树的节点,这种方式最好理解,如果用模拟递归的思路的话,要复杂一些。**
@@ -16,7 +16,7 @@
周二开始讲解一个新的树,二叉搜索树,开始要换一个思路了,如果没有利用好二叉搜索树的特性,就容易把简单题做成了难题了。
-学习[二叉搜索树的特性](https://mp.weixin.qq.com/s/vsKrWRlETxCVsiRr8v_hHg),还是比较容易的。
+学习[二叉搜索树的特性](https://programmercarl.com/0700.二叉搜索树中的搜索.html),还是比较容易的。
大多是二叉搜索树的题目,其实都离不开中序遍历,因为这样就是有序的。
@@ -24,7 +24,7 @@
## 周三
-了解了二搜索树的特性之后, 开始验证[一颗二叉树是不是二叉搜索树](https://mp.weixin.qq.com/s/8odY9iUX5eSi0eRFSXFD4Q)。
+了解了二搜索树的特性之后, 开始验证[一颗二叉树是不是二叉搜索树](https://programmercarl.com/0098.验证二叉搜索树.html)。
首先在此强调一下二叉搜索树的特性:
@@ -46,15 +46,15 @@
**在二叉树中通过两个前后指针作比较,会经常用到**。
-本文[二叉树:我是不是一棵二叉搜索树](https://mp.weixin.qq.com/s/8odY9iUX5eSi0eRFSXFD4Q)中迭代法中为什么没有周一那篇那么简洁了呢,因为本篇是验证二叉搜索树,前提默认它是一棵普通二叉树,所以还是要回归之前老办法。
+本文[二叉树:我是不是一棵二叉搜索树](https://programmercarl.com/0098.验证二叉搜索树.html)中迭代法中为什么没有周一那篇那么简洁了呢,因为本篇是验证二叉搜索树,前提默认它是一棵普通二叉树,所以还是要回归之前老办法。
## 周四
-了解了[二叉搜索树](https://mp.weixin.qq.com/s/vsKrWRlETxCVsiRr8v_hHg),并且知道[如何判断二叉搜索树](https://mp.weixin.qq.com/s/8odY9iUX5eSi0eRFSXFD4Q),本篇就很简单了。
+了解了[二叉搜索树](https://programmercarl.com/0700.二叉搜索树中的搜索.html),并且知道[如何判断二叉搜索树](https://programmercarl.com/0098.验证二叉搜索树.html),本篇就很简单了。
**要知道二叉搜索树和中序遍历是好朋友!**
-在[二叉树:搜索树的最小绝对差](https://mp.weixin.qq.com/s/Hwzml6698uP3qQCC1ctUQQ)中强调了要利用搜索树的特性,把这道题目想象成在一个有序数组上求两个数最小差值,这就是一道送分题了。
+在[二叉树:搜索树的最小绝对差](https://programmercarl.com/0530.二叉搜索树的最小绝对差.html)中强调了要利用搜索树的特性,把这道题目想象成在一个有序数组上求两个数最小差值,这就是一道送分题了。
**需要明确:在有序数组求任意两数最小值差等价于相邻两数的最小值差**。
@@ -64,7 +64,7 @@
此时大家应该知道遇到二叉搜索树,就想是有序数组,那么在二叉搜索树中求二叉搜索树众数就很简单了。
-在[二叉树:我的众数是多少?](https://mp.weixin.qq.com/s/KSAr6OVQIMC-uZ8MEAnGHg)中我给出了如果是普通二叉树,应该如何求众数的集合,然后进一步讲解了二叉搜索树应该如何求众数集合。
+在[二叉树:我的众数是多少?](https://programmercarl.com/0501.二叉搜索树中的众数.html)中我给出了如果是普通二叉树,应该如何求众数的集合,然后进一步讲解了二叉搜索树应该如何求众数集合。
在求众数集合的时候有一个技巧,因为题目中众数是可以有多个的,所以一般的方法需要遍历两遍才能求出众数的集合。
@@ -74,7 +74,7 @@
## 周六
-在[二叉树:公共祖先问题](https://mp.weixin.qq.com/s/n6Rk3nc_X3TSkhXHrVmBTQ)中,我们开始讲解如何在二叉树中求公共祖先的问题,本来是打算和二叉搜索树一起讲的,但发现篇幅过长,所以先讲二叉树的公共祖先问题。
+在[二叉树:公共祖先问题](https://programmercarl.com/0236.二叉树的最近公共祖先.html)中,我们开始讲解如何在二叉树中求公共祖先的问题,本来是打算和二叉搜索树一起讲的,但发现篇幅过长,所以先讲二叉树的公共祖先问题。
**如果找到一个节点,发现左子树出现结点p,右子树出现节点q,或者 左子树出现结点q,右子树出现节点p,那么该节点就是节点p和q的最近公共祖先。**
@@ -92,13 +92,13 @@
## 总结
-本周我们讲了[如何合并两个二叉树](https://mp.weixin.qq.com/s/3f5fbjOFaOX_4MXzZ97LsQ),了解了如何操作两个二叉树。
+本周我们讲了[如何合并两个二叉树](https://programmercarl.com/0617.合并二叉树.html),了解了如何操作两个二叉树。
-然后开始另一种树:二叉搜索树,了解[二叉搜索树的特性](https://mp.weixin.qq.com/s/vsKrWRlETxCVsiRr8v_hHg),然后[判断一棵二叉树是不是二叉搜索树](https://mp.weixin.qq.com/s/8odY9iUX5eSi0eRFSXFD4Q)。
+然后开始另一种树:二叉搜索树,了解[二叉搜索树的特性](https://programmercarl.com/0700.二叉搜索树中的搜索.html),然后[判断一棵二叉树是不是二叉搜索树](https://programmercarl.com/0098.验证二叉搜索树.html)。
-了解以上知识之后,就开始利用其特性,做一些二叉搜索树上的题目,[求最小绝对差](https://mp.weixin.qq.com/s/Hwzml6698uP3qQCC1ctUQQ),[求众数集合](https://mp.weixin.qq.com/s/KSAr6OVQIMC-uZ8MEAnGHg)。
+了解以上知识之后,就开始利用其特性,做一些二叉搜索树上的题目,[求最小绝对差](https://programmercarl.com/0530.二叉搜索树的最小绝对差.html),[求众数集合](https://programmercarl.com/0501.二叉搜索树中的众数.html)。
-接下来,开始求二叉树与二叉搜索树的公共祖先问题,单篇篇幅原因,先单独介绍[普通二叉树如何求最近公共祖先](https://mp.weixin.qq.com/s/n6Rk3nc_X3TSkhXHrVmBTQ)。
+接下来,开始求二叉树与二叉搜索树的公共祖先问题,单篇篇幅原因,先单独介绍[普通二叉树如何求最近公共祖先](https://programmercarl.com/0236.二叉树的最近公共祖先.html)。
现在已经讲过了几种二叉树了,二叉树,二叉平衡树,完全二叉树,二叉搜索树,后面还会有平衡二叉搜索树。 那么一些同学难免会有混乱了,我针对如下三个问题,帮大家在捋顺一遍:
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201210\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201210\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220\345\221\250\346\234\253\346\200\273\347\273\223.md"
index 8fe13f0be4..02bfbd8324 100644
--- "a/problems/\345\221\250\346\200\273\347\273\223/20201210\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220\345\221\250\346\234\253\346\200\273\347\273\223.md"
+++ "b/problems/\345\221\250\346\200\273\347\273\223/20201210\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220\345\221\250\346\234\253\346\200\273\347\273\223.md"
@@ -15,7 +15,7 @@
# 周一
-在[程序员的简历应该这么写!!(附简历模板)](https://mp.weixin.qq.com/s/nCTUzuRTBo1_R_xagVszsA)中以我自己的总结经验为例讲一讲大家应该如何写简历。
+在[程序员的简历应该这么写!!(附简历模板)](https://programmercarl.com/前序/程序员简历.html)中以我自己的总结经验为例讲一讲大家应该如何写简历。
主要有如下几点:
@@ -49,7 +49,7 @@
# 周二
-在[关于时间复杂度,你不知道的都在这里!](https://mp.weixin.qq.com/s/LWBfehW1gMuEnXtQjJo-sw)中详细讲解了时间复杂度,很多被大家忽略的内容,在文中都做了详细的解释。
+在[关于时间复杂度,你不知道的都在这里!](https://programmercarl.com/前序/关于时间复杂度,你不知道的都在这里!.html)中详细讲解了时间复杂度,很多被大家忽略的内容,在文中都做了详细的解释。
文中涉及如下问题:
@@ -61,7 +61,7 @@
这些问题大家可能懵懵懂懂的了解一些,但一细问又答不上来。
-相信看完本篇[关于时间复杂度,你不知道的都在这里!](https://mp.weixin.qq.com/s/LWBfehW1gMuEnXtQjJo-sw),以上问题大家就理解的清晰多了。
+相信看完本篇[关于时间复杂度,你不知道的都在这里!](https://programmercarl.com/前序/关于时间复杂度,你不知道的都在这里!.html),以上问题大家就理解的清晰多了。
文中最后还运用以上知识通过一道简单的题目具体分析了一下其时间复杂度,给出两种方法究竟谁最优。
@@ -70,7 +70,7 @@
# 周三
-在[O(n)的算法居然超时了,此时的n究竟是多大?](https://mp.weixin.qq.com/s/73ryNsuPFvBQkt6BbhNzLA)中介绍了大家在leetcode上提交代码经常遇到的一个问题-超时!
+在[O(n)的算法居然超时了,此时的n究竟是多大?](https://programmercarl.com/前序/On的算法居然超时了,此时的n究竟是多大?.html)中介绍了大家在leetcode上提交代码经常遇到的一个问题-超时!
估计很多录友知道算法超时了,但没有注意过 O(n)的算法,如果1s内出结果,这个n究竟是多大?
@@ -85,7 +85,7 @@
# 周四
-在[通过一道面试题目,讲一讲递归算法的时间复杂度!](https://mp.weixin.qq.com/s/I6ZXFbw09NR31F5CJR_geQ)中,讲一讲如果计算递归算法的时间复杂度。
+在[通过一道面试题目,讲一讲递归算法的时间复杂度!](https://programmercarl.com/前序/通过一道面试题目,讲一讲递归算法的时间复杂度!.html)中,讲一讲如果计算递归算法的时间复杂度。
递归的时间复杂度等于**递归的次数 * 每次递归中的操作次数**。
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/\344\272\214\345\217\211\346\240\221\351\230\266\346\256\265\346\200\273\347\273\223\347\263\273\345\210\227\344\270\200.md" "b/problems/\345\221\250\346\200\273\347\273\223/\344\272\214\345\217\211\346\240\221\351\230\266\346\256\265\346\200\273\347\273\223\347\263\273\345\210\227\344\270\200.md"
index c8235ff18b..595f367d4d 100644
--- "a/problems/\345\221\250\346\200\273\347\273\223/\344\272\214\345\217\211\346\240\221\351\230\266\346\256\265\346\200\273\347\273\223\347\263\273\345\210\227\344\270\200.md"
+++ "b/problems/\345\221\250\346\200\273\347\273\223/\344\272\214\345\217\211\346\240\221\351\230\266\346\256\265\346\200\273\347\273\223\347\263\273\345\210\227\344\270\200.md"
@@ -4,15 +4,15 @@
**注意这个周末总结和系列总结还是不一样的(二叉树还远没有结束),这个总结是针对留言疑问以及刷题群里讨论内容的归纳。**
-1. [关于二叉树,你该了解这些!](https://mp.weixin.qq.com/s/q_eKfL8vmSbSFcptZ3aeRA)
-2. [二叉树:一入递归深似海,从此offer是路人](https://mp.weixin.qq.com/s/Ww60X5mIKWdMQV4cN3ejOA)
-3. [二叉树:听说递归能做的,栈也能做!](https://mp.weixin.qq.com/s/OH7aCVJ5-Gi32PkNCoZk4A)
-4. [二叉树:前中后序迭代方式的写法就不能统一一下么?](https://mp.weixin.qq.com/s/ATQMPCpBlaAgrqdLDMVPZA)
-5. [二叉树:层序遍历登场!](https://mp.weixin.qq.com/s/4-bDKi7SdwfBGRm9FYduiA)
-6. [二叉树:你真的会翻转二叉树么?](https://mp.weixin.qq.com/s/jG0MgYR9DoUMYcRRF7magw)
+1. [关于二叉树,你该了解这些!](https://programmercarl.com/二叉树理论基础.html)
+2. [二叉树:一入递归深似海,从此offer是路人](https://programmercarl.com/二叉树的递归遍历.html)
+3. [二叉树:听说递归能做的,栈也能做!](https://programmercarl.com/二叉树的迭代遍历.html)
+4. [二叉树:前中后序迭代方式的写法就不能统一一下么?](https://programmercarl.com/二叉树的统一迭代法.html)
+5. [二叉树:层序遍历登场!](https://programmercarl.com/0102.二叉树的层序遍历.html)
+6. [二叉树:你真的会翻转二叉树么?](https://programmercarl.com/0226.翻转二叉树.html)
-## [关于二叉树,你该了解这些!](https://mp.weixin.qq.com/s/q_eKfL8vmSbSFcptZ3aeRA)
+## [关于二叉树,你该了解这些!](https://programmercarl.com/二叉树理论基础.html)
有同学会把红黑树和二叉平衡搜索树弄分开了,其实红黑树就是一种二叉平衡搜索树,这两个树不是独立的,所以C++中map、multimap、set、multiset的底层实现机制是二叉平衡搜索树,再具体一点是红黑树。
@@ -51,18 +51,18 @@ a->right = NULL;
morris遍历是二叉树遍历算法的超强进阶算法,morris遍历可以将非递归遍历中的空间复杂度降为O(1),感兴趣大家就去查一查学习学习,比较小众,面试几乎不会考。我其实也没有研究过,就不做过多介绍了。
-## [二叉树的递归遍历](https://mp.weixin.qq.com/s/Ww60X5mIKWdMQV4cN3ejOA)
+## [二叉树的递归遍历](https://programmercarl.com/二叉树的递归遍历.html)
-在[二叉树:一入递归深似海,从此offer是路人](https://mp.weixin.qq.com/s/Ww60X5mIKWdMQV4cN3ejOA)中讲到了递归三要素,以及前中后序的递归写法。
+在[二叉树:一入递归深似海,从此offer是路人](https://programmercarl.com/二叉树的递归遍历.html)中讲到了递归三要素,以及前中后序的递归写法。
-文章中我给出了leetcode上三道二叉树的前中后序题目,但是看完[二叉树:一入递归深似海,从此offer是路人](https://mp.weixin.qq.com/s/Ww60X5mIKWdMQV4cN3ejOA),依然可以解决n叉树的前后序遍历,在leetcode上分别是
+文章中我给出了leetcode上三道二叉树的前中后序题目,但是看完[二叉树:一入递归深似海,从此offer是路人](https://programmercarl.com/二叉树的递归遍历.html),依然可以解决n叉树的前后序遍历,在leetcode上分别是
* 589. N叉树的前序遍历
* 590. N叉树的后序遍历
大家可以再去把这两道题目做了。
-## [二叉树的非递归遍历](https://mp.weixin.qq.com/s/OH7aCVJ5-Gi32PkNCoZk4A)
+## [二叉树的非递归遍历](https://programmercarl.com/二叉树的迭代遍历.html)
细心的同学发现文中前后序遍历空节点是入栈的,其实空节点入不入栈都差不多,但感觉空节点不入栈确实清晰一些,符合文中动画的演示。
@@ -125,7 +125,7 @@ public:
## 周四
-在[二叉树:前中后序迭代方式的写法就不能统一一下么?](https://mp.weixin.qq.com/s/WKg0Ty1_3SZkztpHubZPRg)中我们使用空节点作为标记,给出了统一的前中后序迭代法。
+在[二叉树:前中后序迭代方式的写法就不能统一一下么?](https://programmercarl.com/二叉树的统一迭代法.html)中我们使用空节点作为标记,给出了统一的前中后序迭代法。
此时又多了一种前中后序的迭代写法,那么有同学问了:前中后序迭代法是不是一定要统一来写,这样才算是规范。
@@ -135,7 +135,7 @@ public:
## 周五
-在[二叉树:层序遍历登场!](https://mp.weixin.qq.com/s/Gb3BjakIKGNpup2jYtTzog)中我们介绍了二叉树的另一种遍历方式(图论中广度优先搜索在二叉树上的应用)即:层序遍历。
+在[二叉树:层序遍历登场!](https://programmercarl.com/0102.二叉树的层序遍历.html)中我们介绍了二叉树的另一种遍历方式(图论中广度优先搜索在二叉树上的应用)即:层序遍历。
看完这篇文章,去leetcode上怒刷五题,文章中 编号107题目的样例图放错了(原谅我匆忙之间总是手抖),但不影响大家理解。
@@ -145,7 +145,7 @@ public:
## 周六
-在[二叉树:你真的会翻转二叉树么?](https://mp.weixin.qq.com/s/6gY1MiXrnm-khAAJiIb5Bg)中我们把翻转二叉树这么一道简单又经典的问题,充分的剖析了一波,相信就算做过这道题目的同学,看完本篇之后依然有所收获!
+在[二叉树:你真的会翻转二叉树么?](https://programmercarl.com/0226.翻转二叉树.html)中我们把翻转二叉树这么一道简单又经典的问题,充分的剖析了一波,相信就算做过这道题目的同学,看完本篇之后依然有所收获!
**文中我指的是递归的中序遍历是不行的,因为使用递归的中序遍历,某些节点的左右孩子会翻转两次。**
From 7799a7712b82e8ec3404733c3ababcda59d39be7 Mon Sep 17 00:00:00 2001
From: ArthurP
Date: Sat, 28 Aug 2021 19:05:02 +0800
Subject: [PATCH 0116/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200704.=E4=BA=8C?=
=?UTF-8?q?=E5=88=86=E6=9F=A5=E6=89=BE.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
---
...14\345\210\206\346\237\245\346\211\276.md" | 29 ++++++++++++++++++-
1 file changed, 28 insertions(+), 1 deletion(-)
diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md"
index f2af7daa8b..495f736753 100644
--- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md"
+++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md"
@@ -374,7 +374,7 @@ func search(nums: [Int], target: Int) -> Int {
} else if target > nums[middle] {
// 当目标在区间右侧,就需要更新左边的边界值,新区间为[middle + 1, right]
left = middle + 1
- } else {
+ } else {
// 当目标就是在中间,则返回中间值的下标
return middle
}
@@ -450,6 +450,33 @@ impl Solution {
}
```
+**C:**
+```c
+int search(int* nums, int numsSize, int target){
+ int left = 0;
+ int right = numsSize-1;
+ int middle = 0;
+ //若left小于等于right,说明区间中元素不为0
+ while(left<=right) {
+ //更新查找下标middle的值
+ middle = (left+right)/2;
+ //此时target可能会在[left,middle-1]区间中
+ if(nums[middle] > target) {
+ right = middle-1;
+ }
+ //此时target可能会在[middle+1,right]区间中
+ else if(nums[middle] < target) {
+ left = middle+1;
+ }
+ //当前下标元素等于target值时,返回middle
+ else if(nums[middle] == target){
+ return middle;
+ }
+ }
+ //若未找到target元素,返回-1
+ return -1;
+}
+```
-----------------------
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
From fe89ae7b7da7d90b96d3c10b4a556bb622fc40cf Mon Sep 17 00:00:00 2001
From: XuDaHaoRen <1547794387@qq.com>
Date: Sat, 28 Aug 2021 19:57:50 +0800
Subject: [PATCH 0117/3468] =?UTF-8?q?=E5=9B=9E=E6=BA=AF+=E8=B4=AA=E5=BF=83?=
=?UTF-8?q?=E5=91=A8=E6=80=BB=E7=BB=93=E8=BF=9E=E6=8E=A5=E6=9B=BF=E6=8D=A2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...50\346\234\253\346\200\273\347\273\223.md" | 24 +++++++++----------
...50\346\234\253\346\200\273\347\273\223.md" | 24 +++++++++----------
...50\346\234\253\346\200\273\347\273\223.md" | 16 ++++++-------
...50\346\234\253\346\200\273\347\273\223.md" | 20 ++++++++--------
...50\346\234\253\346\200\273\347\273\223.md" | 13 +++++-----
...50\346\234\253\346\200\273\347\273\223.md" | 14 +++++------
...50\346\234\253\346\200\273\347\273\223.md" | 14 +++++------
7 files changed, 62 insertions(+), 63 deletions(-)
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201030\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201030\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md"
index 54cdc3b5c5..3a432bee81 100644
--- "a/problems/\345\221\250\346\200\273\347\273\223/20201030\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md"
+++ "b/problems/\345\221\250\346\200\273\347\273\223/20201030\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md"
@@ -13,7 +13,7 @@
本周我们正式开始了回溯算法系列,那么首先当然是概述。
-在[关于回溯算法,你该了解这些!](https://mp.weixin.qq.com/s/gjSgJbNbd1eAA5WkA-HeWw)中介绍了什么是回溯,回溯法的效率,回溯法解决的问题以及回溯法模板。
+在[关于回溯算法,你该了解这些!](https://programmercarl.com/回溯算法理论基础.html)中介绍了什么是回溯,回溯法的效率,回溯法解决的问题以及回溯法模板。
**回溯是递归的副产品,只要有递归就会有回溯**。
@@ -31,14 +31,14 @@
回溯法确实不好理解,所以需要把回溯法抽象为一个图形来理解就容易多了,每一道回溯法的题目都可以抽象为树形结构。
-针对很多同学都写不好回溯,我在[关于回溯算法,你该了解这些!](https://mp.weixin.qq.com/s/gjSgJbNbd1eAA5WkA-HeWw)用回溯三部曲,分析了回溯算法,并给出了回溯法的模板。
+针对很多同学都写不好回溯,我在[关于回溯算法,你该了解这些!](https://programmercarl.com/回溯算法理论基础.html)用回溯三部曲,分析了回溯算法,并给出了回溯法的模板。
这个模板会伴随整个回溯法系列!
## 周二
-在[回溯算法:求组合问题!](https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ)中,我们开始用回溯法解决第一道题目,组合问题。
+在[回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)中,我们开始用回溯法解决第一道题目,组合问题。
我在文中开始的时候给大家列举k层for循环例子,进而得出都是同样是暴利解法,为什么要用回溯法。
@@ -48,19 +48,19 @@
## 周三
-针对[回溯算法:求组合问题!](https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ)还可以做剪枝的操作。
+针对[回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)还可以做剪枝的操作。
-在[回溯算法:组合问题再剪剪枝](https://mp.weixin.qq.com/s/Ri7spcJMUmph4c6XjPWXQA)中把回溯法代码做了剪枝优化,在文中我依然把问题抽象为一个树形结构,大家可以一目了然剪的究竟是哪里。
+在[回溯算法:组合问题再剪剪枝](https://programmercarl.com/0077.组合优化.html)中把回溯法代码做了剪枝优化,在文中我依然把问题抽象为一个树形结构,大家可以一目了然剪的究竟是哪里。
**剪枝精髓是:for循环在寻找起点的时候要有一个范围,如果这个起点到集合终止之间的元素已经不够 题目要求的k个元素了,就没有必要搜索了**。
## 周四
-在[回溯算法:求组合总和!](https://mp.weixin.qq.com/s/HX7WW6ixbFZJASkRnCTC3w)中,相当于 [回溯算法:求组合问题!](https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ)加了一个元素总和的限制。
+在[回溯算法:求组合总和!](https://programmercarl.com/0216.组合总和III.html)中,相当于 [回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)加了一个元素总和的限制。
整体思路还是一样的,本题的剪枝会好想一些,即:**已选元素总和如果已经大于n(题中要求的和)了,那么往后遍历就没有意义了,直接剪掉**。
-在本题中,依然还可以有一个剪枝,就是[回溯算法:组合问题再剪剪枝](https://mp.weixin.qq.com/s/Ri7spcJMUmph4c6XjPWXQA)中提到的,对for循环选择的起始范围的剪枝。
+在本题中,依然还可以有一个剪枝,就是[回溯算法:组合问题再剪剪枝](https://programmercarl.com/0077.组合优化.html)中提到的,对for循环选择的起始范围的剪枝。
所以,剪枝的代码,可以把for循环,加上 `i <= 9 - (k - path.size()) + 1` 的限制!
@@ -68,11 +68,11 @@
## 周五
-在[回溯算法:电话号码的字母组合](https://mp.weixin.qq.com/s/e2ua2cmkE_vpYjM3j6HY0A)中,开始用多个集合来求组合,还是熟悉的模板题目,但是有一些细节。
+在[回溯算法:电话号码的字母组合](https://programmercarl.com/0017.电话号码的字母组合.html)中,开始用多个集合来求组合,还是熟悉的模板题目,但是有一些细节。
-例如这里for循环,可不像是在 [回溯算法:求组合问题!](https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ)和[回溯算法:求组合总和!](https://mp.weixin.qq.com/s/HX7WW6ixbFZJASkRnCTC3w)中从startIndex开始遍历的。
+例如这里for循环,可不像是在 [回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)和[回溯算法:求组合总和!](https://programmercarl.com/0216.组合总和III.html)中从startIndex开始遍历的。
-**因为本题每一个数字代表的是不同集合,也就是求不同集合之间的组合,而[回溯算法:求组合问题!](https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ)和[回溯算法:求组合总和!](https://mp.weixin.qq.com/s/HX7WW6ixbFZJASkRnCTC3w)都是是求同一个集合中的组合!**
+**因为本题每一个数字代表的是不同集合,也就是求不同集合之间的组合,而[回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)和[回溯算法:求组合总和!](https://programmercarl.com/0216.组合总和III.html)都是是求同一个集合中的组合!**
如果大家在现场面试的时候,一定要注意各种输入异常的情况,例如本题输入1 * #按键。
@@ -82,9 +82,9 @@
因为之前链表系列没有写总结,虽然链表系列已经是两个月前的事情,但还是有必要补一下。
-所以给出[链表:总结篇!](https://mp.weixin.qq.com/s/vK0JjSTHfpAbs8evz5hH8A),这里对之前链表理论基础和经典题目进行了总结。
+所以给出[链表:总结篇!](https://programmercarl.com/链表总结篇.html),这里对之前链表理论基础和经典题目进行了总结。
-同时对[链表:环找到了,那入口呢?](https://mp.weixin.qq.com/s/_QVP3IkRZWx9zIpQRgajzA)中求环入口的问题又进行了补充证明,可以说把环形链表的方方面面都讲的很通透了,大家如果没有做过环形链表的题目一定要去做一做。
+同时对[链表:环找到了,那入口呢?](https://programmercarl.com/0142.环形链表II.html)中求环入口的问题又进行了补充证明,可以说把环形链表的方方面面都讲的很通透了,大家如果没有做过环形链表的题目一定要去做一做。
## 总结
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201107\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201107\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md"
index 66036f641d..71bf62de05 100644
--- "a/problems/\345\221\250\346\200\273\347\273\223/20201107\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md"
+++ "b/problems/\345\221\250\346\200\273\347\273\223/20201107\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md"
@@ -6,17 +6,17 @@
## 周一
-在[回溯算法:求组合总和(二)](https://mp.weixin.qq.com/s/FLg8G6EjVcxBjwCbzpACPw)中讲解的组合总和问题,和以前的组合问题还都不一样。
+在[回溯算法:求组合总和(二)](https://programmercarl.com/0039.组合总和.html)中讲解的组合总和问题,和以前的组合问题还都不一样。
-本题和[回溯算法:求组合问题!](https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ),[回溯算法:求组合总和!](https://mp.weixin.qq.com/s/HX7WW6ixbFZJASkRnCTC3w)和区别是:本题没有数量要求,可以无限重复,但是有总和的限制,所以间接的也是有个数的限制。
+本题和[回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html),[回溯算法:求组合总和!](https://programmercarl.com/0216.组合总和III.html)和区别是:本题没有数量要求,可以无限重复,但是有总和的限制,所以间接的也是有个数的限制。
不少录友都是看到可以重复选择,就义无反顾的把startIndex去掉了。
**本题还需要startIndex来控制for循环的起始位置,对于组合问题,什么时候需要startIndex呢?**
-我举过例子,如果是一个集合来求组合的话,就需要startIndex,例如:[回溯算法:求组合问题!](https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ),[回溯算法:求组合总和!](https://mp.weixin.qq.com/s/HX7WW6ixbFZJASkRnCTC3w)。
+我举过例子,如果是一个集合来求组合的话,就需要startIndex,例如:[回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html),[回溯算法:求组合总和!](https://programmercarl.com/0216.组合总和III.html)。
-如果是多个集合取组合,各个集合之间相互不影响,那么就不用startIndex,例如:[回溯算法:电话号码的字母组合](https://mp.weixin.qq.com/s/e2ua2cmkE_vpYjM3j6HY0A)
+如果是多个集合取组合,各个集合之间相互不影响,那么就不用startIndex,例如:[回溯算法:电话号码的字母组合](https://programmercarl.com/0017.电话号码的字母组合.html)
**注意以上我只是说求组合的情况,如果是排列问题,又是另一套分析的套路,后面我再讲解排列的时候就重点介绍**。
@@ -30,13 +30,13 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target;
**在求和问题中,排序之后加剪枝是常见的套路!**
-在[回溯算法:求组合总和(二)](https://mp.weixin.qq.com/s/FLg8G6EjVcxBjwCbzpACPw)第一个树形结构没有画出startIndex的作用,**这里这里纠正一下,准确的树形结构如图所示:**
+在[回溯算法:求组合总和(二)](https://programmercarl.com/0039.组合总和.html)第一个树形结构没有画出startIndex的作用,**这里这里纠正一下,准确的树形结构如图所示:**

## 周二
-在[回溯算法:求组合总和(三)](https://mp.weixin.qq.com/s/_1zPYk70NvHsdY8UWVGXmQ)中依旧讲解组合总和问题,本题集合元素会有重复,但要求解集不能包含重复的组合。
+在[回溯算法:求组合总和(三)](https://programmercarl.com/0040.组合总和II.html)中依旧讲解组合总和问题,本题集合元素会有重复,但要求解集不能包含重复的组合。
**所以难就难在去重问题上了**。
@@ -60,7 +60,7 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target;
## 周三
-在[回溯算法:分割回文串](https://mp.weixin.qq.com/s/Pb1epUTbU8fHIht-g_MS5Q)中,我们开始讲解切割问题,虽然最后代码看起来好像是一道模板题,但是从分析到学会套用这个模板,是比较难的。
+在[回溯算法:分割回文串](https://programmercarl.com/0131.分割回文串.html)中,我们开始讲解切割问题,虽然最后代码看起来好像是一道模板题,但是从分析到学会套用这个模板,是比较难的。
我列出如下几个难点:
@@ -85,9 +85,9 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target;
## 周四
-如果没有做过[回溯算法:分割回文串](https://mp.weixin.qq.com/s/Pb1epUTbU8fHIht-g_MS5Q)的话,[回溯算法:复原IP地址](https://mp.weixin.qq.com/s/v--VmA8tp9vs4bXCqHhBuA)这道题目应该是比较难的。
+如果没有做过[回溯算法:分割回文串](https://programmercarl.com/0131.分割回文串.html)的话,[回溯算法:复原IP地址](https://programmercarl.com/0093.复原IP地址.html)这道题目应该是比较难的。
-复原IP照[回溯算法:分割回文串](https://mp.weixin.qq.com/s/Pb1epUTbU8fHIht-g_MS5Q)就多了一些限制,例如只能分四段,而且还是更改字符串,插入逗点。
+复原IP照[回溯算法:分割回文串](https://programmercarl.com/0131.分割回文串.html)就多了一些限制,例如只能分四段,而且还是更改字符串,插入逗点。
树形图如下:
@@ -109,7 +109,7 @@ if (s.size() > 12) return result; // 剪枝
## 周五
-在[回溯算法:求子集问题!](https://mp.weixin.qq.com/s/NNRzX-vJ_pjK4qxohd_LtA)中讲解了子集问题,**在树形结构中子集问题是要收集所有节点的结果,而组合问题是收集叶子节点的结果**。
+在[回溯算法:求子集问题!](https://programmercarl.com/0078.子集.html)中讲解了子集问题,**在树形结构中子集问题是要收集所有节点的结果,而组合问题是收集叶子节点的结果**。
如图:
@@ -135,13 +135,13 @@ if (startIndex >= nums.size()) { // 终止条件可以不加
## 周六
-早起的哈希表系列没有总结,所以[哈希表:总结篇!(每逢总结必经典)](https://mp.weixin.qq.com/s/1s91yXtarL-PkX07BfnwLg)如约而至。
+早起的哈希表系列没有总结,所以[哈希表:总结篇!(每逢总结必经典)](https://programmercarl.com/哈希表总结.html)如约而至。
可能之前大家做过很多哈希表的题目,但是没有串成线,总结篇来帮你串成线,捋顺哈希表的整个脉络。
大家对什么时候各种set与map比较疑惑,想深入了解红黑树,哈希之类的。
-**如果真的只是想清楚什么时候使用各种set与map,不用看那么多,把[关于哈希表,你该了解这些!](https://mp.weixin.qq.com/s/g8N6WmoQmsCUw3_BaWxHZA)看了就够了**。
+**如果真的只是想清楚什么时候使用各种set与map,不用看那么多,把[关于哈希表,你该了解这些!](https://programmercarl.com/哈希表理论基础.html)看了就够了**。
## 总结
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201112\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201112\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md"
index 9ca3cff15c..3d019cf2d1 100644
--- "a/problems/\345\221\250\346\200\273\347\273\223/20201112\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md"
+++ "b/problems/\345\221\250\346\200\273\347\273\223/20201112\345\233\236\346\272\257\345\221\250\346\234\253\346\200\273\347\273\223.md"
@@ -4,9 +4,9 @@
## 周一
-在[回溯算法:求子集问题(二)](https://mp.weixin.qq.com/s/WJ4JNDRJgsW3eUN72Hh3uQ)中,开始针对子集问题进行去重。
+在[回溯算法:求子集问题(二)](https://programmercarl.com/0090.子集II.html)中,开始针对子集问题进行去重。
-本题就是[回溯算法:求子集问题!](https://mp.weixin.qq.com/s/NNRzX-vJ_pjK4qxohd_LtA)的基础上加上了去重,去重我们在[回溯算法:求组合总和(三)](https://mp.weixin.qq.com/s/_1zPYk70NvHsdY8UWVGXmQ)也讲过了。
+本题就是[回溯算法:求子集问题!](https://programmercarl.com/0078.子集.html)的基础上加上了去重,去重我们在[回溯算法:求组合总和(三)](https://programmercarl.com/0040.组合总和II.html)也讲过了。
所以本题对大家应该并不难。
@@ -16,18 +16,18 @@
## 周二
-在[回溯算法:递增子序列](https://mp.weixin.qq.com/s/ePxOtX1ATRYJb2Jq7urzHQ)中,处处都能看到子集的身影,但处处是陷阱,值得好好琢磨琢磨!
+在[回溯算法:递增子序列](https://programmercarl.com/0491.递增子序列.html)中,处处都能看到子集的身影,但处处是陷阱,值得好好琢磨琢磨!
树形结构如下:

-[回溯算法:递增子序列](https://mp.weixin.qq.com/s/ePxOtX1ATRYJb2Jq7urzHQ)留言区大家有很多疑问,主要还是和[回溯算法:求子集问题(二)](https://mp.weixin.qq.com/s/WJ4JNDRJgsW3eUN72Hh3uQ)混合在了一起。
+[回溯算法:递增子序列](https://programmercarl.com/0491.递增子序列.html)留言区大家有很多疑问,主要还是和[回溯算法:求子集问题(二)](https://programmercarl.com/0090.子集II.html)混合在了一起。
详细在[本周小结!(回溯算法系列三)续集](https://mp.weixin.qq.com/s/kSMGHc_YpsqL2j-jb_E_Ag)中给出了介绍!
## 周三
-我们已经分析了组合问题,分割问题,子集问题,那么[回溯算法:排列问题!](https://mp.weixin.qq.com/s/SCOjeMX1t41wcvJq49GhMw) 又不一样了。
+我们已经分析了组合问题,分割问题,子集问题,那么[回溯算法:排列问题!](https://programmercarl.com/0046.全排列.html) 又不一样了。
排列是有序的,也就是说[1,2] 和[2,1] 是两个集合,这和之前分析的子集以及组合所不同的地方。
@@ -43,7 +43,7 @@
## 周四
-排列问题也要去重了,在[回溯算法:排列问题(二)](https://mp.weixin.qq.com/s/9L8h3WqRP_h8LLWNT34YlA)中又一次强调了“树层去重”和“树枝去重”。
+排列问题也要去重了,在[回溯算法:排列问题(二)](https://programmercarl.com/0047.全排列II.html)中又一次强调了“树层去重”和“树枝去重”。
树形结构如下:
@@ -87,9 +87,9 @@
## 总结
-本周我们对[子集问题进行了去重](https://mp.weixin.qq.com/s/WJ4JNDRJgsW3eUN72Hh3uQ),然后介绍了和子集问题非常像的[递增子序列](https://mp.weixin.qq.com/s/ePxOtX1ATRYJb2Jq7urzHQ),如果还保持惯性思维,这道题就可以掉坑里。
+本周我们对[子集问题进行了去重](https://programmercarl.com/0090.子集II.html),然后介绍了和子集问题非常像的[递增子序列](https://programmercarl.com/0491.递增子序列.html),如果还保持惯性思维,这道题就可以掉坑里。
-接着介绍了[排列问题!](https://mp.weixin.qq.com/s/SCOjeMX1t41wcvJq49GhMw),以及对[排列问题如何进行去重](https://mp.weixin.qq.com/s/9L8h3WqRP_h8LLWNT34YlA)。
+接着介绍了[排列问题!](https://programmercarl.com/0046.全排列.html),以及对[排列问题如何进行去重](https://programmercarl.com/0047.全排列II.html)。
最后我补充了子集问题,排列问题和组合问题的性能分析,给大家提供了回溯算法复杂度的分析思路。
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201126\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201126\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md"
index ea50499196..5671cdbdc1 100644
--- "a/problems/\345\221\250\346\200\273\347\273\223/20201126\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md"
+++ "b/problems/\345\221\250\346\200\273\347\273\223/20201126\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md"
@@ -3,7 +3,7 @@
## 周一
-本周正式开始了贪心算法,在[关于贪心算法,你该了解这些!](https://mp.weixin.qq.com/s/O935TaoHE9Eexwe_vSbRAg)中,我们介绍了什么是贪心以及贪心的套路。
+本周正式开始了贪心算法,在[关于贪心算法,你该了解这些!](https://programmercarl.com/贪心算法理论基础.html)中,我们介绍了什么是贪心以及贪心的套路。
**贪心的本质是选择每一阶段的局部最优,从而达到全局最优。**
@@ -25,7 +25,7 @@
## 周二
-在[贪心算法:分发饼干](https://mp.weixin.qq.com/s/YSuLIAYyRGlyxbp9BNC1uw)中讲解了贪心算法的第一道题目。
+在[贪心算法:分发饼干](https://programmercarl.com/0455.分发饼干.html)中讲解了贪心算法的第一道题目。
这道题目很明显能看出来是用贪心,也是入门好题。
@@ -39,7 +39,7 @@
所有还是小饼干优先先喂饱小胃口更好一些,也比较直观。
-一些录友不清楚[贪心算法:分发饼干](https://mp.weixin.qq.com/s/YSuLIAYyRGlyxbp9BNC1uw)中时间复杂度是怎么来的?
+一些录友不清楚[贪心算法:分发饼干](https://programmercarl.com/0455.分发饼干.html)中时间复杂度是怎么来的?
就是快排O(nlogn),遍历O(n),加一起就是还是O(nlogn)。
@@ -47,7 +47,7 @@
接下来就要上一点难度了,要不然大家会误以为贪心算法就是常识判断一下就行了。
-在[贪心算法:摆动序列](https://mp.weixin.qq.com/s/Xytl05kX8LZZ1iWWqjMoHA)中,需要计算最长摇摆序列。
+在[贪心算法:摆动序列](https://programmercarl.com/0376.摆动序列.html)中,需要计算最长摇摆序列。
其实就是让序列有尽可能多的局部峰值。
@@ -62,13 +62,13 @@
## 周四
-在[贪心算法:最大子序和](https://mp.weixin.qq.com/s/DrjIQy6ouKbpletQr0g1Fg)中,详细讲解了用贪心的方式来求最大子序列和,其实这道题目是一道动态规划的题目。
+在[贪心算法:最大子序和](https://programmercarl.com/0053.最大子序和.html)中,详细讲解了用贪心的方式来求最大子序列和,其实这道题目是一道动态规划的题目。
**贪心的思路为局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。从而推出全局最优:选取最大“连续和”**
代码很简单,但是思路却比较难。还需要反复琢磨。
-针对[贪心算法:最大子序和](https://mp.weixin.qq.com/s/DrjIQy6ouKbpletQr0g1Fg)文章中给出的贪心代码如下;
+针对[贪心算法:最大子序和](https://programmercarl.com/0053.最大子序和.html)文章中给出的贪心代码如下;
```
class Solution {
public:
@@ -95,17 +95,17 @@ public:
## 总结
-本周我们讲解了[贪心算法的理论基础](https://mp.weixin.qq.com/s/O935TaoHE9Eexwe_vSbRAg),了解了贪心本质:局部最优推出全局最优。
+本周我们讲解了[贪心算法的理论基础](https://programmercarl.com/贪心算法理论基础.html),了解了贪心本质:局部最优推出全局最优。
-然后讲解了第一道题目[分发饼干](https://mp.weixin.qq.com/s/YSuLIAYyRGlyxbp9BNC1uw),还是比较基础的,可能会给大家一种贪心算法比较简单的错觉,因为贪心有时候接近于常识。
+然后讲解了第一道题目[分发饼干](https://programmercarl.com/0455.分发饼干.html),还是比较基础的,可能会给大家一种贪心算法比较简单的错觉,因为贪心有时候接近于常识。
其实我还准备一些简单的贪心题目,甚至网上很多都质疑这些题目是不是贪心算法。这些题目我没有立刻发出来,因为真的会让大家感觉贪心过于简单,而忽略了贪心的本质:局部最优和全局最优两个关键点。
**所以我在贪心系列难度会有所交替,难的题目在于拓展思路,简单的题目在于分析清楚其贪心的本质,后续我还会发一些简单的题目来做贪心的分析。**
-在[摆动序列](https://mp.weixin.qq.com/s/Xytl05kX8LZZ1iWWqjMoHA)中大家就初步感受到贪心没那么简单了。
+在[摆动序列](https://programmercarl.com/0376.摆动序列.html)中大家就初步感受到贪心没那么简单了。
-本周最后是[最大子序和](https://mp.weixin.qq.com/s/DrjIQy6ouKbpletQr0g1Fg),这道题目要用贪心的方式做出来,就比较有难度,都知道负数加上正数之后会变小,但是这道题目依然会让很多人搞混淆,其关键在于:**不能让“连续和”为负数的时候加上下一个元素,而不是 不让“连续和”加上一个负数**。这块真的需要仔细体会!
+本周最后是[最大子序和](https://programmercarl.com/0053.最大子序和.html),这道题目要用贪心的方式做出来,就比较有难度,都知道负数加上正数之后会变小,但是这道题目依然会让很多人搞混淆,其关键在于:**不能让“连续和”为负数的时候加上下一个元素,而不是 不让“连续和”加上一个负数**。这块真的需要仔细体会!
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201203\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201203\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md"
index a82c5d4a25..23b0b7cf25 100644
--- "a/problems/\345\221\250\346\200\273\347\273\223/20201203\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md"
+++ "b/problems/\345\221\250\346\200\273\347\273\223/20201203\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md"
@@ -6,7 +6,7 @@
一说到股票问题,一般都会想到动态规划,其实有时候贪心更有效!
-在[贪心算法:买卖股票的最佳时机II](https://mp.weixin.qq.com/s/VsTFA6U96l18Wntjcg3fcg)中,讲到只能多次买卖一支股票,如何获取最大利润。
+在[贪心算法:买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II.html)中,讲到只能多次买卖一支股票,如何获取最大利润。
**这道题目理解利润拆分是关键点!** 不要整块的去看,而是把整体利润拆为每天的利润,就很容易想到贪心了。
@@ -20,7 +20,7 @@
## 周二
-在[贪心算法:跳跃游戏](https://mp.weixin.qq.com/s/606_N9j8ACKCODoCbV1lSA)中是给你一个数组看能否跳到终点。
+在[贪心算法:跳跃游戏](https://programmercarl.com/0055.跳跃游戏.html)中是给你一个数组看能否跳到终点。
本题贪心的关键是:**不用拘泥于每次究竟跳几步,而是看覆盖范围,覆盖范围内一定是可以跳过来的,不用管是怎么跳的**。
@@ -37,7 +37,7 @@
## 周三
-这道题目:[贪心算法:跳跃游戏II](https://mp.weixin.qq.com/s/kJBcsJ46DKCSjT19pxrNYg)可就有点难了。
+这道题目:[贪心算法:跳跃游戏II](https://programmercarl.com/0045.跳跃游戏II.html)可就有点难了。
本题解题关键在于:**以最小的步数增加最大的覆盖范围,直到覆盖范围覆盖了终点**。
@@ -49,7 +49,7 @@
注意:**图中的移动下标是到当前这步覆盖的最远距离(下标2的位置),此时没有到终点,只能增加第二步来扩大覆盖范围**。
-在[贪心算法:跳跃游戏II](https://mp.weixin.qq.com/s/kJBcsJ46DKCSjT19pxrNYg)中我给出了两个版本的代码。
+在[贪心算法:跳跃游戏II](https://programmercarl.com/0045.跳跃游戏II.html)中我给出了两个版本的代码。
其实本质都是超过当前覆盖范围,步数就加一,但版本一需要考虑当前覆盖最远距离下标是不是数组终点的情况。
@@ -67,7 +67,7 @@
## 周四
-这道题目:[贪心算法:K次取反后最大化的数组和](https://mp.weixin.qq.com/s/dMTzBBVllRm_Z0aaWvYazA)就比较简单了,哈哈,用简单题来讲一讲贪心的思想。
+这道题目:[贪心算法:K次取反后最大化的数组和](https://programmercarl.com/1005.K次取反后最大化的数组和.html)就比较简单了,哈哈,用简单题来讲一讲贪心的思想。
**这里其实用了两次贪心!**
@@ -77,8 +77,7 @@
第二次贪心:局部最优:只找数值最小的正整数进行反转,当前数值可以达到最大(例如正整数数组{5, 3, 1},反转1 得到-1 比 反转5得到的-5 大多了),全局最优:整个 数组和 达到最大。
-
-[贪心算法:K次取反后最大化的数组和](https://mp.weixin.qq.com/s/dMTzBBVllRm_Z0aaWvYazA)中的代码,最后while处理K的时候,其实直接判断奇偶数就可以了,文中给出的方式太粗暴了,哈哈,Carl大意了。
+[贪心算法:K次取反后最大化的数组和](https://programmercarl.com/1005.K次取反后最大化的数组和.html)中的代码,最后while处理K的时候,其实直接判断奇偶数就可以了,文中给出的方式太粗暴了,哈哈,Carl大意了。
例外一位录友留言给出一个很好的建议,因为文中是使用快排,仔细看题,**题目中限定了数据范围是正负一百,所以可以使用桶排序**,这样时间复杂度就可以优化为O(n)了。但可能代码要复杂一些了。
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201217\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201217\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md"
index 4363027c9f..4d12f92a88 100644
--- "a/problems/\345\221\250\346\200\273\347\273\223/20201217\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md"
+++ "b/problems/\345\221\250\346\200\273\347\273\223/20201217\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md"
@@ -6,7 +6,7 @@
## 周一
-在[贪心算法:加油站](https://mp.weixin.qq.com/s/aDbiNuEZIhy6YKgQXvKELw)中给出每一个加油站的汽油和开到这个加油站的消耗,问汽车能不能开一圈。
+在[贪心算法:加油站](https://programmercarl.com/0134.加油站.html)中给出每一个加油站的汽油和开到这个加油站的消耗,问汽车能不能开一圈。
这道题目咋眼一看,感觉是一道模拟题,模拟一下汽车从每一个节点出发看看能不能开一圈,时间复杂度是O(n^2)。
@@ -28,7 +28,7 @@
## 周二
-在[贪心算法:分发糖果](https://mp.weixin.qq.com/s/8MwlgFfvaNYmjGwjuMlETQ)中我们第一次接触了需要考虑两个维度的情况。
+在[贪心算法:分发糖果](https://programmercarl.com/0135.分发糖果.html)中我们第一次接触了需要考虑两个维度的情况。
例如这道题,是先考虑左边呢,还是考虑右边呢?
@@ -54,7 +54,7 @@
## 周三
-在[贪心算法:柠檬水找零](https://mp.weixin.qq.com/s/0kT4P-hzY7H6Ae0kjQqnZg)中我们模拟了买柠檬水找零的过程。
+在[贪心算法:柠檬水找零](https://programmercarl.com/0860.柠檬水找零.html)中我们模拟了买柠檬水找零的过程。
这道题目刚一看,可能会有点懵,这要怎么找零才能保证完整全部账单的找零呢?
@@ -72,11 +72,11 @@
## 周四
-在[贪心算法:根据身高重建队列](https://mp.weixin.qq.com/s/-2TgZVdOwS-DvtbjjDEbfw)中,我们再一次遇到了需要考虑两个维度的情况。
+在[贪心算法:根据身高重建队列](https://programmercarl.com/0406.根据身高重建队列.html)中,我们再一次遇到了需要考虑两个维度的情况。
-之前我们已经做过一道类似的了就是[贪心算法:分发糖果](https://mp.weixin.qq.com/s/8MwlgFfvaNYmjGwjuMlETQ),但本题比分发糖果难不少!
+之前我们已经做过一道类似的了就是[贪心算法:分发糖果](https://programmercarl.com/0135.分发糖果.html),但本题比分发糖果难不少!
-[贪心算法:根据身高重建队列](https://mp.weixin.qq.com/s/-2TgZVdOwS-DvtbjjDEbfw)中依然是要确定一边,然后在考虑另一边,两边一起考虑一定会蒙圈。
+[贪心算法:根据身高重建队列](https://programmercarl.com/0406.根据身高重建队列.html)中依然是要确定一边,然后在考虑另一边,两边一起考虑一定会蒙圈。
那么本题先确定k还是先确定h呢,也就是究竟先按h排序呢,还先按照k排序呢?
@@ -92,7 +92,7 @@
「代码随想录」里已经讲了十一道贪心题目了,大家可以发现在每一道题目的讲解中,我都是把什么是局部最优,和什么是全局最优说清楚。
-虽然有时候感觉贪心就是常识,但如果真正是常识性的题目,其实是模拟题,就不是贪心算法了!例如[贪心算法:加油站](https://mp.weixin.qq.com/s/aDbiNuEZIhy6YKgQXvKELw)中的贪心方法一,其实我就认为不是贪心算法,而是直接从全局最优的角度上来模拟,因为方法里没有体现局部最优的过程。
+虽然有时候感觉贪心就是常识,但如果真正是常识性的题目,其实是模拟题,就不是贪心算法了!例如[贪心算法:加油站](https://programmercarl.com/0134.加油站.html)中的贪心方法一,其实我就认为不是贪心算法,而是直接从全局最优的角度上来模拟,因为方法里没有体现局部最优的过程。
而且大家也会发现,贪心并没有想象中的那么简单,贪心往往妙的出其不意,触不及防!哈哈
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20201224\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20201224\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md"
index a82433cf36..097ae9edd7 100644
--- "a/problems/\345\221\250\346\200\273\347\273\223/20201224\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md"
+++ "b/problems/\345\221\250\346\200\273\347\273\223/20201224\350\264\252\345\277\203\345\221\250\346\234\253\346\200\273\347\273\223.md"
@@ -4,7 +4,7 @@
## 周一
-在[贪心算法:用最少数量的箭引爆气球](https://mp.weixin.qq.com/s/HxVAJ6INMfNKiGwI88-RFw)中,我们开始讲解了重叠区间问题,用最少的弓箭射爆所有气球,其本质就是找到最大的重叠区间。
+在[贪心算法:用最少数量的箭引爆气球](https://programmercarl.com/0452.用最少数量的箭引爆气球.html)中,我们开始讲解了重叠区间问题,用最少的弓箭射爆所有气球,其本质就是找到最大的重叠区间。
按照左边界经行排序后,如果气球重叠了,重叠气球中右边边界的最小值 之前的区间一定需要一个弓箭
@@ -16,7 +16,7 @@
## 周二
-在[贪心算法:无重叠区间](https://mp.weixin.qq.com/s/oFOEoW-13Bm4mik-aqAOmw)中要去掉最少的区间,来让所有区间没有重叠。
+在[贪心算法:无重叠区间](https://programmercarl.com/0435.无重叠区间.html)中要去掉最少的区间,来让所有区间没有重叠。
我来按照右边界排序,从左向右记录非交叉区间的个数。最后用区间总数减去非交叉区间的个数就是需要移除的区间个数了。
@@ -24,11 +24,11 @@

-细心的同学就发现了,此题和 [贪心算法:用最少数量的箭引爆气球](https://mp.weixin.qq.com/s/HxVAJ6INMfNKiGwI88-RFw)非常像。
+细心的同学就发现了,此题和 [贪心算法:用最少数量的箭引爆气球](https://programmercarl.com/0452.用最少数量的箭引爆气球.html)非常像。
弓箭的数量就相当于是非交叉区间的数量,只要把弓箭那道题目代码里射爆气球的判断条件加个等号(认为[0,1][1,2]不是相邻区间),然后用总区间数减去弓箭数量 就是要移除的区间数量了。
-把[贪心算法:用最少数量的箭引爆气球](https://mp.weixin.qq.com/s/HxVAJ6INMfNKiGwI88-RFw)代码稍做修改,别可以AC本题。
+把[贪心算法:用最少数量的箭引爆气球](https://programmercarl.com/0452.用最少数量的箭引爆气球.html)代码稍做修改,别可以AC本题。
修改后的C++代码如下:
```CPP
@@ -58,7 +58,7 @@ public:
## 周三
-[贪心算法:划分字母区间](https://mp.weixin.qq.com/s/pdX4JwV1AOpc_m90EcO2Hw)中我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。
+[贪心算法:划分字母区间](https://programmercarl.com/0763.划分字母区间.html)中我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。
这道题目leetcode上标的是贪心,其实我不认识是贪心,因为没感受到局部最优和全局最优的关系。
@@ -76,7 +76,7 @@ public:
## 周四
-[贪心算法:合并区间](https://mp.weixin.qq.com/s/royhzEM5tOkUFwUGrNStpw)中要合并所有重叠的区间。
+[贪心算法:合并区间](https://programmercarl.com/0056.合并区间.html)中要合并所有重叠的区间。
相信如果录友们前几天区间问题的题目认真练习了,今天题目就应该算简单一些了。
@@ -95,7 +95,7 @@ public:
其实很多区间的合并操作看起来都是常识,其实贪心算法有时候就是常识,哈哈,但也别小看了贪心算法。
-在[贪心算法:合并区间](https://mp.weixin.qq.com/s/royhzEM5tOkUFwUGrNStpw)中就说过,对于贪心算法,很多同学都是:「如果能凭常识直接做出来,就会感觉不到自己用了贪心, 一旦第一直觉想不出来, 可能就一直想不出来了」。
+在[贪心算法:合并区间](https://programmercarl.com/0056.合并区间.html)中就说过,对于贪心算法,很多同学都是:「如果能凭常识直接做出来,就会感觉不到自己用了贪心, 一旦第一直觉想不出来, 可能就一直想不出来了」。
所以还是要多看多做多练习!
From 3107ba208c7f0872018053e3dab987c7eb3dd057 Mon Sep 17 00:00:00 2001
From: ArthurP
Date: Sat, 28 Aug 2021 20:47:20 +0800
Subject: [PATCH 0118/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200968.=E7=9B=91?=
=?UTF-8?q?=E6=8E=A7=E4=BA=8C=E5=8F=89=E6=A0=91.md=20C=E8=AF=AD=E8=A8=80?=
=?UTF-8?q?=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...47\344\272\214\345\217\211\346\240\221.md" | 39 +++++++++++++++++++
1 file changed, 39 insertions(+)
diff --git "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md"
index c715279a67..737e92a064 100644
--- "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md"
+++ "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md"
@@ -406,6 +406,45 @@ var minCameraCover = function(root) {
};
```
+C:
+```c
+/*
+**函数后序遍历二叉树。判断一个结点状态时,根据其左右孩子结点的状态进行判断
+**状态:0为没有被摄像头覆盖到。1为此结点处应设置摄像头。2为此结点已被摄像头覆盖
+*/
+int traversal(struct TreeNode* node, int* ans) {
+ //递归结束条件:传入结点为NULL,假设此结点能被摄像头覆盖。这样方便与对叶子结点的判断,将叶子结点设为0
+ if(!node)
+ return 2;
+ //后序遍历二叉树,记录左右孩子的状态。根据左右孩子状态更新结点自身状态
+ int left = traversal(node->left, ans);
+ int right = traversal(node->right, ans);
+
+ //若左右孩子都可以被摄像头覆盖,将父亲结点状态设为0
+ if(left == 2 && right == 2) {
+ return 0;
+ }
+ //若左右孩子有一个结点状态为没有被覆盖(0),则将父亲结点状态设置为摄像头
+ if(left == 0 || right == 0) {
+ (*ans)++;
+ return 1;
+ }
+ //若左右孩子有一个为摄像头,证明父亲结点可以被覆盖。将父亲结点状态变为2
+ if(left == 1 || right == 1)
+ return 2;
+ //逻辑不会走到-1,语句不会执行
+ return -1;
+}
+
+int minCameraCover(struct TreeNode* root){
+ int ans = 0;
+
+ //在对整个二叉树遍历后。头结点可能未被覆盖,这时候如果函数返回值为0,证明头结点未被覆盖。说明头结点也需要添置摄像头,ans++
+ if(traversal(root, &ans) == 0)
+ ans++;
+ return ans;
+}
+```
-----------------------
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
From d7cadd601f1cd665780108bcdc5974480c7d7907 Mon Sep 17 00:00:00 2001
From: ArthurP
Date: Sat, 28 Aug 2021 20:51:26 +0800
Subject: [PATCH 0119/3468] =?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=AE=9E=E7=8E=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...\200\344\275\263\346\227\266\346\234\272II.md" | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md" "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md"
index 29aa5b837f..bd837eeafa 100644
--- "a/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md"
+++ "b/problems/0122.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272II.md"
@@ -229,6 +229,21 @@ var maxProfit = function(prices) {
};
```
+C:
+```c
+int maxProfit(int* prices, int pricesSize){
+ int result = 0;
+ int i;
+ //从第二个元素开始遍历数组,与之前的元素进行比较
+ for(i = 1; i < pricesSize; ++i) {
+ //若该元素比前面元素大,则说明有利润。代表买入
+ if(prices[i] > prices[i-1])
+ result+= prices[i]-prices[i-1];
+ }
+ return result;
+}
+```
+
-----------------------
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
* B站视频:[代码随想录](https://space.bilibili.com/525438321)
From 417d5b80bfb58654c13b70c08d83d2a22add3a61 Mon Sep 17 00:00:00 2001
From: ArthurP
Date: Sat, 28 Aug 2021 22:56:15 +0800
Subject: [PATCH 0120/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200134.=E5=8A=A0?=
=?UTF-8?q?=E6=B2=B9=E7=AB=99.md=20C=E8=AF=AD=E8=A8=80=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...4.\345\212\240\346\262\271\347\253\231.md" | 24 +++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" "b/problems/0134.\345\212\240\346\262\271\347\253\231.md"
index 0befd0853c..ff54fbc6f5 100644
--- "a/problems/0134.\345\212\240\346\262\271\347\253\231.md"
+++ "b/problems/0134.\345\212\240\346\262\271\347\253\231.md"
@@ -283,6 +283,30 @@ var canCompleteCircuit = function(gas, cost) {
};
```
+C:
+```c
+int canCompleteCircuit(int* gas, int gasSize, int* cost, int costSize){
+ int curSum = 0;
+ int i;
+ int min = INT_MAX;
+ for(i = 0; i < gasSize; i++) {
+ int diff = gas[i] - cost[i];
+ curSum += diff;
+ if(min > curSum)
+ min = curSum;
+ }
+ if(curSum < 0)
+ return -1;
+ if(min >= 0)
+ return 0;
+ for(i = gasSize - 1; i >= 0; i--) {
+ min+=(gas[i]-cost[i]);
+ if(min >= 0)
+ return i;
+ }
+ return 0;
+}
+```
-----------------------
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
From b69b899b682b4c434d5d17e336eda68a3629b70e Mon Sep 17 00:00:00 2001
From: XuDaHaoRen <1547794387@qq.com>
Date: Sun, 29 Aug 2021 08:38:13 +0800
Subject: [PATCH 0121/3468] =?UTF-8?q?=E2=80=98=E5=91=A8=E6=80=BB=E7=BB=93?=
=?UTF-8?q?=E8=BF=9E=E6=8E=A5=E6=9B=BF=E6=8D=A2=E5=AE=8C=E6=88=90?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...50\346\234\253\346\200\273\347\273\223.md" | 10 +++++-----
...50\346\234\253\346\200\273\347\273\223.md" | 12 +++++------
...50\346\234\253\346\200\273\347\273\223.md" | 10 +++++-----
...50\346\234\253\346\200\273\347\273\223.md" | 12 +++++------
...50\346\234\253\346\200\273\347\273\223.md" | 20 +++++++++----------
...50\346\234\253\346\200\273\347\273\223.md" | 12 +++++------
...50\346\234\253\346\200\273\347\273\223.md" | 18 ++++++++---------
7 files changed, 47 insertions(+), 47 deletions(-)
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20210107\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20210107\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md"
index 67957f059e..b4baa4adb0 100644
--- "a/problems/\345\221\250\346\200\273\347\273\223/20210107\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md"
+++ "b/problems/\345\221\250\346\200\273\347\273\223/20210107\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md"
@@ -3,7 +3,7 @@
## 周一
-在[关于动态规划,你该了解这些!](https://mp.weixin.qq.com/s/ocZwfPlCWrJtVGACqFNAag)中我们讲解了动态规划的基础知识。
+在[关于动态规划,你该了解这些!](https://programmercarl.com/动态规划理论基础.html)中我们讲解了动态规划的基础知识。
首先讲一下动规和贪心的区别,其实大家不用太强调理论上的区别,做做题,就感受出来了。
@@ -33,13 +33,13 @@
## 周二
-这道题目[动态规划:斐波那契数](https://mp.weixin.qq.com/s/ko0zLJplF7n_4TysnPOa_w)是当之无愧的动规入门题。
+这道题目[动态规划:斐波那契数](https://programmercarl.com/0509.斐波那契数.html)是当之无愧的动规入门题。
简单题,我们就是用来了解方法论的,用动规五部曲走一遍,题目其实已经把递推公式,和dp数组如何初始化都给我们了。
## 周三
-[动态规划:爬楼梯](https://mp.weixin.qq.com/s/Ohop0jApSII9xxOMiFhGIw) 这道题目其实就是斐波那契数列。
+[动态规划:爬楼梯](https://programmercarl.com/0070.爬楼梯.html) 这道题目其实就是斐波那契数列。
但正常思考过程应该是推导完递推公式之后,发现这是斐波那契,而不是上来就知道这是斐波那契。
@@ -98,11 +98,11 @@ public:
这道绝佳的面试题我没有用过,如果录友们有面试别人的需求,就把这个套路拿去吧,哈哈哈。
-我在[通过一道面试题目,讲一讲递归算法的时间复杂度!](https://mp.weixin.qq.com/s/I6ZXFbw09NR31F5CJR_geQ)中,以我自己面试别人的真实经历,通过求x的n次方 这么简单的题目,就可以考察候选人对算法性能以及递归的理解深度,录友们可以看看,绝对有收获!
+我在[通过一道面试题目,讲一讲递归算法的时间复杂度!](https://programmercarl.com/前序/通过一道面试题目,讲一讲递归算法的时间复杂度!.html)中,以我自己面试别人的真实经历,通过求x的n次方 这么简单的题目,就可以考察候选人对算法性能以及递归的理解深度,录友们可以看看,绝对有收获!
## 周四
-这道题目[动态规划:使用最小花费爬楼梯](https://mp.weixin.qq.com/s/djZB9gkyLFAKcQcSvKDorA)就是在爬台阶的基础上加了一个花费,
+这道题目[动态规划:使用最小花费爬楼梯](https://programmercarl.com/0746.使用最小花费爬楼梯.html)就是在爬台阶的基础上加了一个花费,
这道题描述也确实有点魔幻。
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20210114\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20210114\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md"
index a49e037021..039f3596df 100644
--- "a/problems/\345\221\250\346\200\273\347\273\223/20210114\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md"
+++ "b/problems/\345\221\250\346\200\273\347\273\223/20210114\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md"
@@ -1,7 +1,7 @@
## 周一
-[动态规划:不同路径](https://mp.weixin.qq.com/s/MGgGIt4QCpFMROE9X9he_A)中求从出发点到终点有几种路径,只能向下或者向右移动一步。
+[动态规划:不同路径](https://programmercarl.com/0062.不同路径.html)中求从出发点到终点有几种路径,只能向下或者向右移动一步。
我们提供了三种方法,但重点讲解的还是动规,也是需要重点掌握的。
@@ -35,7 +35,7 @@ for (int i = 1; i < m; i++) {
## 周二
-[动态规划:不同路径还不够,要有障碍!](https://mp.weixin.qq.com/s/lhqF0O4le9-wvalptOVOww)相对于[动态规划:不同路径](https://mp.weixin.qq.com/s/MGgGIt4QCpFMROE9X9he_A)添加了障碍。
+[动态规划:不同路径还不够,要有障碍!](https://programmercarl.com/0063.不同路径II.html)相对于[动态规划:不同路径](https://programmercarl.com/0062.不同路径.html)添加了障碍。
dp[i][j]定义依然是:表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。
@@ -78,7 +78,7 @@ for (int i = 1; i < m; i++) {
## 周三
-[动态规划:整数拆分,你要怎么拆?](https://mp.weixin.qq.com/s/cVbyHrsWH_Rfzlj-ESr01A)给出一个整数,问有多少种拆分的方法。
+[动态规划:整数拆分,你要怎么拆?](https://programmercarl.com/0343.整数拆分.html)给出一个整数,问有多少种拆分的方法。
这道题目就有点难度了,题目中dp我也给出了两种方法,但通过两种方法的比较可以看出,对dp数组定义的理解,以及dp数组初始化的重要性。
@@ -121,7 +121,7 @@ for (int i = 3; i <= n ; i++) {
**或者也可以理解j是拆分i的第一个整数**。
-[动态规划:整数拆分,你要怎么拆?](https://mp.weixin.qq.com/s/cVbyHrsWH_Rfzlj-ESr01A)总结里,我也给出了递推公式dp[i] = max(dp[i], dp[i - j] * dp[j])这种写法。
+[动态规划:整数拆分,你要怎么拆?](https://programmercarl.com/0343.整数拆分.html)总结里,我也给出了递推公式dp[i] = max(dp[i], dp[i - j] * dp[j])这种写法。
对于这种写法,一位录友总结的很好,意思就是:如果递推公式是dp[i-j] * dp[j],这样就相当于强制把一个数至少拆分成四份。
@@ -129,7 +129,7 @@ dp[i-j]至少是两个数的乘积,dp[j]又至少是两个数的乘积,但
## 周四
-[动态规划:不同的二叉搜索树](https://mp.weixin.qq.com/s/8VE8pDrGxTf8NEVYBDwONw)给出n个不同的节点求能组成多少个不同二叉搜索树。
+[动态规划:不同的二叉搜索树](https://programmercarl.com/0096.不同的二叉搜索树.html)给出n个不同的节点求能组成多少个不同二叉搜索树。
这道题目还是比较难的,想到用动态规划的方法就很不容易了!
@@ -145,7 +145,7 @@ n为5时候的dp数组状态如图:
## 总结
-本周题目已经开始点难度了,特别是[动态规划:不同的二叉搜索树](https://mp.weixin.qq.com/s/8VE8pDrGxTf8NEVYBDwONw)这道题目,明显感觉阅读量很低,可能是因为确实有点难吧。
+本周题目已经开始点难度了,特别是[动态规划:不同的二叉搜索树](https://programmercarl.com/0096.不同的二叉搜索树.html)这道题目,明显感觉阅读量很低,可能是因为确实有点难吧。
我现在也陷入了纠结,题目一简单,就会有录友和我反馈说题目太简单了,题目一难,阅读量就特别低。
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20210121\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20210121\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md"
index bffe47fb40..e9427142d6 100644
--- "a/problems/\345\221\250\346\200\273\347\273\223/20210121\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md"
+++ "b/problems/\345\221\250\346\200\273\347\273\223/20210121\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md"
@@ -7,7 +7,7 @@
## 周一
-[动态规划:关于01背包问题,你该了解这些!](https://mp.weixin.qq.com/s/FwIiPPmR18_AJO5eiidT6w)中,我们开始介绍了背包问题。
+[动态规划:关于01背包问题,你该了解这些!](https://programmercarl.com/背包理论基础01背包-1.html)中,我们开始介绍了背包问题。
首先对于背包的所有问题中,01背包是最最基础的,其他背包也是在01背包的基础上稍作变化。
@@ -75,7 +75,7 @@ for(int i = 1; i < weight.size(); i++) { // 遍历物品
## 周二
-[动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://mp.weixin.qq.com/s/M4uHxNVKRKm5HPjkNZBnFA)中把01背包的一维dp数组(滚动数组)实现详细讲解了一遍。
+[动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html)中把01背包的一维dp数组(滚动数组)实现详细讲解了一遍。
分析一下和二维dp数组有什么区别,在初始化和遍历顺序上又有什么差异?
@@ -125,7 +125,7 @@ for(int i = 0; i < weight.size(); i++) { // 遍历物品
## 周三
-[动态规划:416. 分割等和子集](https://mp.weixin.qq.com/s/sYw3QtPPQ5HMZCJcT4EaLQ)中我们开始用01背包来解决问题。
+[动态规划:416. 分割等和子集](https://programmercarl.com/0416.分割等和子集.html)中我们开始用01背包来解决问题。
只有确定了如下四点,才能把01背包问题套到本题上来。
@@ -138,11 +138,11 @@ for(int i = 0; i < weight.size(); i++) { // 遍历物品
## 周四
-[动态规划:1049. 最后一块石头的重量 II](https://mp.weixin.qq.com/s/WbwAo3jaUaNJjvhHgq0BGg)这道题目其实和[动态规划:416. 分割等和子集](https://mp.weixin.qq.com/s/sYw3QtPPQ5HMZCJcT4EaLQ)是非常像的。
+[动态规划:1049. 最后一块石头的重量 II](https://programmercarl.com/1049.最后一块石头的重量II.html)这道题目其实和[动态规划:416. 分割等和子集](https://programmercarl.com/0416.分割等和子集.html)是非常像的。
本题其实就是尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成01背包问题了。
-[动态规划:416. 分割等和子集](https://mp.weixin.qq.com/s/sYw3QtPPQ5HMZCJcT4EaLQ)相当于是求背包是否正好装满,而本题是求背包最多能装多少。
+[动态规划:416. 分割等和子集](https://programmercarl.com/0416.分割等和子集.html)相当于是求背包是否正好装满,而本题是求背包最多能装多少。
这两道题目是对dp[target]的处理方式不同。这也考验的对dp[i]定义的理解。
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20210128\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20210128\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md"
index bea4cc6001..06193a7019 100644
--- "a/problems/\345\221\250\346\200\273\347\273\223/20210128\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md"
+++ "b/problems/\345\221\250\346\200\273\347\273\223/20210128\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md"
@@ -2,7 +2,7 @@
## 周一
-[动态规划:目标和!](https://mp.weixin.qq.com/s/2pWmaohX75gwxvBENS-NCw)要求在数列之间加入+ 或者 -,使其和为S。
+[动态规划:目标和!](https://programmercarl.com/0494.目标和.html)要求在数列之间加入+ 或者 -,使其和为S。
所有数的总和为sum,假设加法的总和为x,那么可以推出x = (S + sum) / 2。
@@ -39,7 +39,7 @@ dp数组状态变化如下:
## 周二
-这道题目[动态规划:一和零!](https://mp.weixin.qq.com/s/x-u3Dsp76DlYqtCe0xEKJw)算有点难度。
+这道题目[动态规划:一和零!](https://programmercarl.com/0474.一和零.html)算有点难度。
**不少同学都以为是多重背包,其实这是一道标准的01背包**。
@@ -78,7 +78,7 @@ dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);
此时01背包我们就讲完了,正式开始完全背包。
-在[动态规划:关于完全背包,你该了解这些!](https://mp.weixin.qq.com/s/akwyxlJ4TLvKcw26KB9uJw)中我们讲解了完全背包的理论基础。
+在[动态规划:关于完全背包,你该了解这些!](https://programmercarl.com/背包问题理论基础完全背包.html)中我们讲解了完全背包的理论基础。
其实完全背包和01背包区别就是完全背包的物品是无限数量。
@@ -100,7 +100,7 @@ for(int i = 0; i < weight.size(); i++) { // 遍历物品
**那么为什么要先遍历物品,在遍历背包呢?** (灵魂拷问)
-其实对于纯完全背包,先遍历物品,再遍历背包 与 先遍历背包,再遍历物品都是可以的。我在文中[动态规划:关于完全背包,你该了解这些!](https://mp.weixin.qq.com/s/akwyxlJ4TLvKcw26KB9uJw)也给出了详细的解释。
+其实对于纯完全背包,先遍历物品,再遍历背包 与 先遍历背包,再遍历物品都是可以的。我在文中[动态规划:关于完全背包,你该了解这些!](https://programmercarl.com/背包问题理论基础完全背包.html)也给出了详细的解释。
这个细节是很多同学忽略掉的点,其实也不算细节了,**相信不少同学在写背包的时候,两层for循环的先后循序搞不清楚,靠感觉来的**。
@@ -110,7 +110,7 @@ for(int i = 0; i < weight.size(); i++) { // 遍历物品
## 周四
-在[动态规划:给你一些零钱,你要怎么凑?](https://mp.weixin.qq.com/s/PlowDsI4WMBOzf3q80AksQ)中就是给你一堆零钱(零钱个数无限),为凑成amount的组合数有几种。
+在[动态规划:给你一些零钱,你要怎么凑?](https://programmercarl.com/0518.零钱兑换II.html)中就是给你一堆零钱(零钱个数无限),为凑成amount的组合数有几种。
**注意这里组合数和排列数的区别!**
@@ -134,7 +134,7 @@ for(int i = 0; i < weight.size(); i++) { // 遍历物品
其实这是一种错觉,或者说对动规理解的不够深入!
-我在动规专题开篇介绍[关于动态规划,你该了解这些!](https://mp.weixin.qq.com/s/ocZwfPlCWrJtVGACqFNAag)中就强调了 **递推公式仅仅是 动规五部曲里的一小部分, dp数组的定义、初始化、遍历顺序,哪一点没有搞透的话,即使知道递推公式,遇到稍稍难一点的动规题目立刻会感觉写不出来了**。
+我在动规专题开篇介绍[关于动态规划,你该了解这些!](https://programmercarl.com/动态规划理论基础.html)中就强调了 **递推公式仅仅是 动规五部曲里的一小部分, dp数组的定义、初始化、遍历顺序,哪一点没有搞透的话,即使知道递推公式,遇到稍稍难一点的动规题目立刻会感觉写不出来了**。
此时相信大家对动规五部曲也有更深的理解了,同样也验证了Carl之前讲过的:**简单题是用来学习方法论的,而遇到难题才体现出方法论的重要性!**
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20210204\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20210204\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md"
index d2417f8fc2..310092988b 100644
--- "a/problems/\345\221\250\346\200\273\347\273\223/20210204\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md"
+++ "b/problems/\345\221\250\346\200\273\347\273\223/20210204\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md"
@@ -2,7 +2,7 @@
## 周一
-[动态规划:377. 组合总和 Ⅳ](https://mp.weixin.qq.com/s/Iixw0nahJWQgbqVNk8k6gA)中给定一个由正整数组成且不存在重复数字的数组,找出和为给定目标正整数的组合的个数(顺序不同的序列被视作不同的组合)。
+[动态规划:377. 组合总和 Ⅳ](https://programmercarl.com/0377.组合总和Ⅳ.html)中给定一个由正整数组成且不存在重复数字的数组,找出和为给定目标正整数的组合的个数(顺序不同的序列被视作不同的组合)。
题目面试虽然是组合,但又强调顺序不同的序列被视作不同的组合,其实这道题目求的是排列数!
@@ -10,7 +10,7 @@
这个和前上周讲的组合问题又不一样,关键就体现在遍历顺序上!
-在[动态规划:518.零钱兑换II](https://mp.weixin.qq.com/s/PlowDsI4WMBOzf3q80AksQ) 中就已经讲过了。
+在[动态规划:518.零钱兑换II](https://programmercarl.com/0518.零钱兑换II.html) 中就已经讲过了。
**如果求组合数就是外层for循环遍历物品,内层for遍历背包**。
@@ -40,7 +40,7 @@ public:
## 周二
-爬楼梯之前我们已经做过了,就是斐波那契数列,很好解,但[动态规划:70. 爬楼梯进阶版(完全背包)](https://mp.weixin.qq.com/s/e_wacnELo-2PG76EjrUakA)中我们进阶了一下。
+爬楼梯之前我们已经做过了,就是斐波那契数列,很好解,但[动态规划:70. 爬楼梯进阶版(完全背包)](https://programmercarl.com/0070.爬楼梯完全背包版本.html)中我们进阶了一下。
改为:每次可以爬 1 、 2、.....、m 个台阶。问有多少种不同的方法可以爬到楼顶呢?
@@ -53,7 +53,7 @@ public:
**此时大家应该发现这就是一个完全背包问题了!**
-和昨天的题目[动态规划:377. 组合总和 Ⅳ](https://mp.weixin.qq.com/s/Iixw0nahJWQgbqVNk8k6gA)基本就是一道题了,遍历顺序也是一样一样的!
+和昨天的题目[动态规划:377. 组合总和 Ⅳ](https://programmercarl.com/0377.组合总和Ⅳ.html)基本就是一道题了,遍历顺序也是一样一样的!
代码如下:
```CPP
@@ -77,7 +77,7 @@ public:
## 周三
-[动态规划:322.零钱兑换](https://mp.weixin.qq.com/s/dyk-xNilHzNtVdPPLObSeQ)给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数(每种硬币的数量是无限的)。
+[动态规划:322.零钱兑换](https://programmercarl.com/0322.零钱兑换.html)给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数(每种硬币的数量是无限的)。
这里我们都知道这是完全背包。
@@ -137,10 +137,10 @@ public:
## 周四
-[动态规划:279.完全平方数](https://mp.weixin.qq.com/s/VfJT78p7UGpDZsapKF_QJQ)给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少(平方数可以重复使用)。
+[动态规划:279.完全平方数](https://programmercarl.com/0279.完全平方数.html)给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少(平方数可以重复使用)。
-如果按顺序把前面的文章都看了,这道题目就是简单题了。 dp[i]的定义,递推公式,初始化,遍历顺序,都是和[动态规划:322. 零钱兑换](https://mp.weixin.qq.com/s/dyk-xNilHzNtVdPPLObSeQ) 一样一样的。
+如果按顺序把前面的文章都看了,这道题目就是简单题了。 dp[i]的定义,递推公式,初始化,遍历顺序,都是和[动态规划:322. 零钱兑换](https://programmercarl.com/0322.零钱兑换.html) 一样一样的。
要是没有前面的基础上来做这道题,那这道题目就有点难度了。
@@ -193,9 +193,9 @@ public:
我这里做一下总结:
-求组合数:[动态规划:518.零钱兑换II](https://mp.weixin.qq.com/s/PlowDsI4WMBOzf3q80AksQ)
-求排列数:[动态规划:377. 组合总和 Ⅳ](https://mp.weixin.qq.com/s/Iixw0nahJWQgbqVNk8k6gA)、[动态规划:70. 爬楼梯进阶版(完全背包)](https://mp.weixin.qq.com/s/e_wacnELo-2PG76EjrUakA)
-求最小数:[动态规划:322. 零钱兑换](https://mp.weixin.qq.com/s/dyk-xNilHzNtVdPPLObSeQ)、[动态规划:279.完全平方数](https://mp.weixin.qq.com/s/VfJT78p7UGpDZsapKF_QJQ)
+求组合数:[动态规划:518.零钱兑换II](https://programmercarl.com/0518.零钱兑换II.html)
+求排列数:[动态规划:377. 组合总和 Ⅳ](https://programmercarl.com/0377.组合总和Ⅳ.html)、[动态规划:70. 爬楼梯进阶版(完全背包)](https://programmercarl.com/0070.爬楼梯完全背包版本.html)
+求最小数:[动态规划:322. 零钱兑换](https://programmercarl.com/0322.零钱兑换.html)、[动态规划:279.完全平方数](https://programmercarl.com/0279.完全平方数.html)
此时我们就已经把完全背包的遍历顺序研究的透透的了!
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20210225\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20210225\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md"
index ea3c551565..ae8b480024 100644
--- "a/problems/\345\221\250\346\200\273\347\273\223/20210225\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md"
+++ "b/problems/\345\221\250\346\200\273\347\273\223/20210225\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md"
@@ -3,7 +3,7 @@
## 周一
-[动态规划:开始打家劫舍!](https://mp.weixin.qq.com/s/UZ31WdLEEFmBegdgLkJ8Dw)中就是给一个数组相邻之间不能连着偷,如果偷才能得到最大金钱。
+[动态规划:开始打家劫舍!](https://programmercarl.com/0198.打家劫舍.html)中就是给一个数组相邻之间不能连着偷,如果偷才能得到最大金钱。
1. 确定dp数组含义
@@ -35,7 +35,7 @@ dp[1] = max(nums[0], nums[1]);
## 周二
-[动态规划:继续打家劫舍!](https://mp.weixin.qq.com/s/kKPx4HpH3RArbRcxAVHbeQ)就是数组成环了,然后相邻的不能连着偷。
+[动态规划:继续打家劫舍!](https://programmercarl.com/0213.打家劫舍II.html)就是数组成环了,然后相邻的不能连着偷。
这里主要考虑清楚三种情况:
@@ -61,11 +61,11 @@ dp[1] = max(nums[0], nums[1]);
所以我在本文重点强调了情况一二三是“考虑”的范围,而具体房间偷与不偷交给递推公式去抉择。
-剩下的就和[动态规划:开始打家劫舍!](https://mp.weixin.qq.com/s/UZ31WdLEEFmBegdgLkJ8Dw)是一个逻辑了。
+剩下的就和[动态规划:开始打家劫舍!](https://programmercarl.com/0198.打家劫舍.html)是一个逻辑了。
## 周三
-[动态规划:还要打家劫舍!](https://mp.weixin.qq.com/s/BOJ1lHsxbQxUZffXlgglEQ)这次是在一颗二叉树上打家劫舍了,条件还是一样的,相临的不能偷。
+[动态规划:还要打家劫舍!](https://programmercarl.com/0337.打家劫舍III.html)这次是在一颗二叉树上打家劫舍了,条件还是一样的,相临的不能偷。
这道题目是树形DP的入门题目,其实树形DP其实就是在树上进行递推公式的推导,没有什么神秘的。
@@ -184,14 +184,14 @@ return {val2, val1};
因为平时我们习惯了在一维数组或者二维数组上推导公式,一下子换成了树,就需要对树的遍历方式足够了解!
-大家还记不记得我在讲解贪心专题的时候,讲到这道题目:[贪心算法:我要监控二叉树!](https://mp.weixin.qq.com/s/kCxlLLjWKaE6nifHC3UL2Q),这也是贪心算法在树上的应用。**那我也可以把这个算法起一个名字,叫做树形贪心**,哈哈哈
+大家还记不记得我在讲解贪心专题的时候,讲到这道题目:[贪心算法:我要监控二叉树!](https://programmercarl.com/0968.监控二叉树.html),这也是贪心算法在树上的应用。**那我也可以把这个算法起一个名字,叫做树形贪心**,哈哈哈
“树形贪心”词汇从此诞生,来自「代码随想录」
## 周四
-[动态规划:买卖股票的最佳时机](https://mp.weixin.qq.com/s/keWo5qYJY4zmHn3amfXdfQ) 一段时间,只能买买一次,问最大收益。
+[动态规划:买卖股票的最佳时机](https://programmercarl.com/0121.买卖股票的最佳时机.html) 一段时间,只能买买一次,问最大收益。
这里我给出了三中解法:
diff --git "a/problems/\345\221\250\346\200\273\347\273\223/20210304\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md" "b/problems/\345\221\250\346\200\273\347\273\223/20210304\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md"
index 9fea624422..dad9884dda 100644
--- "a/problems/\345\221\250\346\200\273\347\273\223/20210304\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md"
+++ "b/problems/\345\221\250\346\200\273\347\273\223/20210304\345\212\250\350\247\204\345\221\250\346\234\253\346\200\273\347\273\223.md"
@@ -3,9 +3,9 @@
## 周一
-[动态规划:买卖股票的最佳时机II](https://mp.weixin.qq.com/s/d4TRWFuhaY83HPa6t5ZL-w)中股票可以买买多了次!
+[动态规划:买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II(动态规划).html)中股票可以买买多了次!
-这也是和[121. 买卖股票的最佳时机](https://mp.weixin.qq.com/s/keWo5qYJY4zmHn3amfXdfQ)的唯一区别(注意只有一只股票,所以再次购买前要出售掉之前的股票)
+这也是和[121. 买卖股票的最佳时机](https://programmercarl.com/0121.买卖股票的最佳时机.html)的唯一区别(注意只有一只股票,所以再次购买前要出售掉之前的股票)
重点在于递推公式公式的不同。
@@ -22,7 +22,7 @@ dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);
dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]);
```
-大家可以发现本题和[121. 买卖股票的最佳时机](https://mp.weixin.qq.com/s/keWo5qYJY4zmHn3amfXdfQ)的代码几乎一样,唯一的区别在:
+大家可以发现本题和[121. 买卖股票的最佳时机](https://programmercarl.com/0121.买卖股票的最佳时机.html)的代码几乎一样,唯一的区别在:
```
dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);
@@ -32,7 +32,7 @@ dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);
## 周二
-[动态规划:买卖股票的最佳时机III](https://mp.weixin.qq.com/s/Sbs157mlVDtAR0gbLpdKzg)中最多只能完成两笔交易。
+[动态规划:买卖股票的最佳时机III](https://programmercarl.com/0123.买卖股票的最佳时机III.html)中最多只能完成两笔交易。
**这意味着可以买卖一次,可以买卖两次,也可以不买卖**。
@@ -85,9 +85,9 @@ dp[0][4] = 0;
## 周三
-[动态规划:买卖股票的最佳时机IV](https://mp.weixin.qq.com/s/jtxZJWAo2y5sUsW647Z5cw)最多可以完成 k 笔交易。
+[动态规划:买卖股票的最佳时机IV](https://programmercarl.com/0188.买卖股票的最佳时机IV.html)最多可以完成 k 笔交易。
-相对于上一道[动态规划:123.买卖股票的最佳时机III](https://mp.weixin.qq.com/s/Sbs157mlVDtAR0gbLpdKzg),本题需要通过前两次的交易,来类比前k次的交易
+相对于上一道[动态规划:123.买卖股票的最佳时机III](https://programmercarl.com/0123.买卖股票的最佳时机III.html),本题需要通过前两次的交易,来类比前k次的交易
1. 确定dp数组以及下标的含义
@@ -117,7 +117,7 @@ for (int j = 0; j < 2 * k - 1; j += 2) {
}
```
-**本题和[动态规划:123.买卖股票的最佳时机III](https://mp.weixin.qq.com/s/Sbs157mlVDtAR0gbLpdKzg)最大的区别就是这里要类比j为奇数是买,偶数是卖剩的状态**。
+**本题和[动态规划:123.买卖股票的最佳时机III](https://programmercarl.com/0123.买卖股票的最佳时机III.html)最大的区别就是这里要类比j为奇数是买,偶数是卖剩的状态**。
3. dp数组如何初始化
@@ -147,9 +147,9 @@ for (int j = 1; j < 2 * k; j += 2) {
## 周四
-[动态规划:最佳买卖股票时机含冷冻期](https://mp.weixin.qq.com/s/IgC0iWWCDpYL9ZbTHGHgfw)尽可能地完成更多的交易(多次买卖一支股票),但有冷冻期,冷冻期为1天
+[动态规划:最佳买卖股票时机含冷冻期](https://programmercarl.com/0309.最佳买卖股票时机含冷冻期.html)尽可能地完成更多的交易(多次买卖一支股票),但有冷冻期,冷冻期为1天
-相对于[动态规划:122.买卖股票的最佳时机II](https://mp.weixin.qq.com/s/d4TRWFuhaY83HPa6t5ZL-w),本题加上了一个冷冻期
+相对于[动态规划:122.买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II(动态规划).html),本题加上了一个冷冻期
**本题则需要第三个状态:不持有股票(冷冻期)的最多现金**。
From f5654657fcfb15fd4a2129787249cf8e32d92fae Mon Sep 17 00:00:00 2001
From: XuDaHaoRen <1547794387@qq.com>
Date: Sun, 29 Aug 2021 08:53:47 +0800
Subject: [PATCH 0122/3468] =?UTF-8?q?=E5=89=8D=E4=B8=80=E6=AC=A1=E9=83=A8?=
=?UTF-8?q?=E5=88=86=E8=AF=AF=E5=88=A0=E4=BB=A3=E7=A0=81=E8=BF=9E=E6=8E=A5?=
=?UTF-8?q?=E6=9B=BF=E6=8D=A2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...37\345\210\227\345\256\236\347\216\260\346\240\210.md" | 4 ++--
...10\345\256\236\347\216\260\351\230\237\345\210\227.md" | 2 +-
...14\345\205\250\345\271\263\346\226\271\346\225\260.md" | 8 ++++----
...15\350\275\254\345\255\227\347\254\246\344\270\262.md" | 6 +++---
...60\347\273\204\347\232\204\344\272\244\351\233\206.md" | 4 ++--
...\350\275\254\345\255\227\347\254\246\344\270\262II.md" | 4 ++--
...76\345\270\270\347\224\250\345\255\227\347\254\246.md" | 8 ++++----
...70\351\202\273\351\207\215\345\244\215\351\241\271.md" | 4 ++--
8 files changed, 20 insertions(+), 20 deletions(-)
diff --git "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md"
index ccf93f1fbd..afa563e3ed 100644
--- "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md"
+++ "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md"
@@ -12,7 +12,7 @@
# 225. 用队列实现栈
-https://leetcode-cn.com/problems/implement-stack-using-queues/
+[力扣题目链接](https://leetcode-cn.com/problems/implement-stack-using-queues/)
使用队列实现栈的下列操作:
@@ -34,7 +34,7 @@ https://leetcode-cn.com/problems/implement-stack-using-queues/
有的同学可能疑惑这种题目有什么实际工程意义,**其实很多算法题目主要是对知识点的考察和教学意义远大于其工程实践的意义,所以面试题也是这样!**
-刚刚做过[栈与队列:我用栈来实现队列怎么样?](https://mp.weixin.qq.com/s/Cj6R0qu8rFA7Et9V_ZMjCA)的同学可能依然想着用一个输入队列,一个输出队列,就可以模拟栈的功能,仔细想一下还真不行!
+刚刚做过[栈与队列:我用栈来实现队列怎么样?](https://programmercarl.com/0232.用栈实现队列.html)的同学可能依然想着用一个输入队列,一个输出队列,就可以模拟栈的功能,仔细想一下还真不行!
**队列模拟栈,其实一个队列就够了**,那么我们先说一说两个队列来实现栈的思路。
diff --git "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md"
index e8bb877e20..a4a73603f6 100644
--- "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md"
+++ "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md"
@@ -11,7 +11,7 @@
# 232.用栈实现队列
-https://leetcode-cn.com/problems/implement-queue-using-stacks/
+[力扣题目链接](https://leetcode-cn.com/problems/implement-queue-using-stacks/)
使用栈实现队列的下列操作:
diff --git "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md" "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md"
index 3c0f0414e0..865669c242 100644
--- "a/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md"
+++ "b/problems/0279.\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.md"
@@ -9,7 +9,7 @@
## 279.完全平方数
-题目地址:https://leetcode-cn.com/problems/perfect-squares/
+[力扣题目链接](https://leetcode-cn.com/problems/perfect-squares/)
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
@@ -36,7 +36,7 @@
**我来把题目翻译一下:完全平方数就是物品(可以无限件使用),凑个正整数n就是背包,问凑满这个背包最少有多少物品?**
-感受出来了没,这么浓厚的完全背包氛围,而且和昨天的题目[动态规划:322. 零钱兑换](https://mp.weixin.qq.com/s/dyk-xNilHzNtVdPPLObSeQ)就是一样一样的!
+感受出来了没,这么浓厚的完全背包氛围,而且和昨天的题目[动态规划:322. 零钱兑换](https://programmercarl.com/0322.零钱兑换.html)就是一样一样的!
动规五部曲分析如下:
@@ -70,7 +70,7 @@ dp[0]表示 和为0的完全平方数的最小数量,那么dp[0]一定是0。
如果求排列数就是外层for遍历背包,内层for循环遍历物品。
-在[动态规划:322. 零钱兑换](https://mp.weixin.qq.com/s/dyk-xNilHzNtVdPPLObSeQ)中我们就深入探讨了这个问题,本题也是一样的,是求最小数!
+在[动态规划:322. 零钱兑换](https://programmercarl.com/0322.零钱兑换.html)中我们就深入探讨了这个问题,本题也是一样的,是求最小数!
**所以本题外层for遍历背包,里层for遍历物品,还是外层for遍历物品,内层for遍历背包,都是可以的!**
@@ -146,7 +146,7 @@ public:
## 总结
-如果大家认真做了昨天的题目[动态规划:322. 零钱兑换](https://mp.weixin.qq.com/s/dyk-xNilHzNtVdPPLObSeQ),今天这道就非常简单了,一样的套路一样的味道。
+如果大家认真做了昨天的题目[动态规划:322. 零钱兑换](https://programmercarl.com/0322.零钱兑换.html),今天这道就非常简单了,一样的套路一样的味道。
但如果没有按照「代码随想录」的题目顺序来做的话,做动态规划或者做背包问题,上来就做这道题,那还是挺难的!
diff --git "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md"
index 8925d0e17a..a5f18d58bf 100644
--- "a/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md"
+++ "b/problems/0344.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262.md"
@@ -12,7 +12,7 @@
# 344.反转字符串
-https://leetcode-cn.com/problems/reverse-string/
+[力扣题目链接](https://leetcode-cn.com/problems/reverse-string/)
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
@@ -55,7 +55,7 @@ https://leetcode-cn.com/problems/reverse-string/
接下来再来讲一下如何解决反转字符串的问题。
-大家应该还记得,我们已经讲过了[206.反转链表](https://mp.weixin.qq.com/s/ckEvIVGcNLfrz6OLOMoT0A)。
+大家应该还记得,我们已经讲过了[206.反转链表](https://programmercarl.com/0206.翻转链表.html)。
在反转链表中,使用了双指针的方法。
@@ -63,7 +63,7 @@ https://leetcode-cn.com/problems/reverse-string/
因为字符串也是一种数组,所以元素在内存中是连续分布,这就决定了反转链表和反转字符串方式上还是有所差异的。
-如果对数组和链表原理不清楚的同学,可以看这两篇,[关于链表,你该了解这些!](https://mp.weixin.qq.com/s/fDGMmLrW7ZHlzkzlf_dZkw),[必须掌握的数组理论知识](https://mp.weixin.qq.com/s/c2KABb-Qgg66HrGf8z-8Og)。
+如果对数组和链表原理不清楚的同学,可以看这两篇,[关于链表,你该了解这些!](https://programmercarl.com/链表理论基础.html),[必须掌握的数组理论知识](https://programmercarl.com/数组理论基础.html)。
对于字符串,我们定义两个指针(也可以说是索引下表),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。
diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md"
index 62abf6399f..3efeff5fc9 100644
--- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md"
+++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md"
@@ -14,7 +14,7 @@
## 349. 两个数组的交集
-https://leetcode-cn.com/problems/intersection-of-two-arrays/
+[力扣题目链接](https://leetcode-cn.com/problems/intersection-of-two-arrays/)
题意:给定两个数组,编写一个函数来计算它们的交集。
@@ -32,7 +32,7 @@ https://leetcode-cn.com/problems/intersection-of-two-arrays/
这道题用暴力的解法时间复杂度是O(n^2),那来看看使用哈希法进一步优化。
-那么用数组来做哈希表也是不错的选择,例如[242. 有效的字母异位词](https://mp.weixin.qq.com/s/ffS8jaVFNUWyfn_8T31IdA)
+那么用数组来做哈希表也是不错的选择,例如[242. 有效的字母异位词](https://programmercarl.com/0242.有效的字母异位词.html)
但是要注意,**使用数组来做哈希的题目,是因为题目都限制了数值的大小。**
diff --git "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md" "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md"
index 914fba2379..da1cad2d96 100644
--- "a/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md"
+++ "b/problems/0541.\345\217\215\350\275\254\345\255\227\347\254\246\344\270\262II.md"
@@ -12,7 +12,7 @@
# 541. 反转字符串II
-https://leetcode-cn.com/problems/reverse-string-ii/
+[力扣题目链接](https://leetcode-cn.com/problems/reverse-string-ii/)
给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。
@@ -65,7 +65,7 @@ public:
};
```
-那么我们也可以实现自己的reverse函数,其实和题目[344. 反转字符串](https://mp.weixin.qq.com/s/_rNm66OJVl92gBDIbGpA3w)道理是一样的。
+那么我们也可以实现自己的reverse函数,其实和题目[344. 反转字符串](https://programmercarl.com/0344.反转字符串.html)道理是一样的。
下面我实现的reverse函数区间是左闭右闭区间,代码如下:
diff --git "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md"
index c165f9859a..f7d323aa28 100644
--- "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md"
+++ "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md"
@@ -10,7 +10,7 @@
# 1002. 查找常用字符
-https://leetcode-cn.com/problems/find-common-characters/
+[力扣题目链接](https://leetcode-cn.com/problems/find-common-characters/)
给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。
@@ -23,7 +23,7 @@ https://leetcode-cn.com/problems/find-common-characters/
【示例二】
输入:["cool","lock","cook"]
输出:["c","o"]
-
+
# 思路
@@ -40,9 +40,9 @@ https://leetcode-cn.com/problems/find-common-characters/
可以看出这是指数级别的时间复杂度,非常高,而且代码实现也不容易,因为要统计 重复的字符,还要适当的替换或者去重。
-那我们还是哈希法吧。如果对哈希法不了解,可以看这篇:[关于哈希表,你该了解这些!](https://mp.weixin.qq.com/s/RSUANESA_tkhKhYe3ZR8Jg)。
+那我们还是哈希法吧。如果对哈希法不了解,可以看这篇:[关于哈希表,你该了解这些!](https://programmercarl.com/哈希表理论基础.html)。
-如果对用数组来做哈希法不了解的话,可以看这篇:[把数组当做哈希表来用,很巧妙!](https://mp.weixin.qq.com/s/ffS8jaVFNUWyfn_8T31IdA)。
+如果对用数组来做哈希法不了解的话,可以看这篇:[把数组当做哈希表来用,很巧妙!](https://programmercarl.com/0242.有效的字母异位词.html)。
了解了哈希法,理解了数组在哈希法中的应用之后,可以来看解题思路了。
diff --git "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md" "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md"
index b60a8d1d9f..b88fd6184f 100644
--- "a/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md"
+++ "b/problems/1047.\345\210\240\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204\346\211\200\346\234\211\347\233\270\351\202\273\351\207\215\345\244\215\351\241\271.md"
@@ -13,7 +13,7 @@
# 1047. 删除字符串中的所有相邻重复项
-https://leetcode-cn.com/problems/remove-all-adjacent-duplicates-in-string/
+[力扣题目链接](https://leetcode-cn.com/problems/remove-all-adjacent-duplicates-in-string/)
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
@@ -26,7 +26,7 @@ https://leetcode-cn.com/problems/remove-all-adjacent-duplicates-in-string/
* 输入:"abbaca"
* 输出:"ca"
* 解释:例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。
-
+
提示:
* 1 <= S.length <= 20000
From 6333521adf7e6204a55dbb2c1f831429f688c4ea Mon Sep 17 00:00:00 2001
From: ArthurP
Date: Sun, 29 Aug 2021 10:28:15 +0800
Subject: [PATCH 0123/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200452.=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=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
---
...25\347\210\206\346\260\224\347\220\203.md" | 24 +++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md"
index 7b8130f027..a2168dfc30 100644
--- "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md"
+++ "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md"
@@ -218,6 +218,30 @@ var findMinArrowShots = function(points) {
};
```
+C:
+```c
+int cmp(const void *a,const void *b)
+{
+ return ((*((int**)a))[0] > (*((int**)b))[0]);
+}
+
+int findMinArrowShots(int** points, int pointsSize, int* pointsColSize){
+ //将points数组作升序排序
+ qsort(points, pointsSize, sizeof(points[0]),cmp);
+
+ int arrowNum = 1;
+ int i = 1;
+ for(i = 1; i < pointsSize; i++) {
+ //若前一个气球与当前气球不重叠,证明需要增加箭的数量
+ if(points[i][0] > points[i-1][1])
+ arrowNum++;
+ else
+ //若前一个气球与当前气球重叠,判断并最小的x_end
+ points[i][1] = points[i][1] > points[i-1][1] ? points[i-1][1] : points[i][1];
+ }
+ return arrowNum;
+}
+```
-----------------------
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
From d327806115b66777e8e19ee27af10d4491b7a609 Mon Sep 17 00:00:00 2001
From: ArthurP
Date: Sun, 29 Aug 2021 10:37:39 +0800
Subject: [PATCH 0124/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200134.=E5=8A=A0?=
=?UTF-8?q?=E6=B2=B9=E7=AB=99.md=20C=E8=AF=AD=E8=A8=80=E7=89=88=E6=9C=AC?=
=?UTF-8?q?=E6=B3=A8=E9=87=8A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
"problems/0134.\345\212\240\346\262\271\347\253\231.md" | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" "b/problems/0134.\345\212\240\346\262\271\347\253\231.md"
index ff54fbc6f5..ff3bc8b265 100644
--- "a/problems/0134.\345\212\240\346\262\271\347\253\231.md"
+++ "b/problems/0134.\345\212\240\346\262\271\347\253\231.md"
@@ -289,21 +289,26 @@ int canCompleteCircuit(int* gas, int gasSize, int* cost, int costSize){
int curSum = 0;
int i;
int min = INT_MAX;
+ //遍历整个数组。计算出每站的用油差。并将其与最小累加量比较
for(i = 0; i < gasSize; i++) {
int diff = gas[i] - cost[i];
curSum += diff;
- if(min > curSum)
+ if(curSum < min)
min = curSum;
}
+ //若汽油总数为负数,代表无法跑完一环。返回-1
if(curSum < 0)
return -1;
+ //若min大于等于0,说明每一天加油量比用油量多。因此从0出发即可
if(min >= 0)
return 0;
+ //若累加最小值为负,则找到一个非零元素(加油量大于出油量)出发。返回坐标
for(i = gasSize - 1; i >= 0; i--) {
min+=(gas[i]-cost[i]);
if(min >= 0)
return i;
}
+ //逻辑上不会返回这个0
return 0;
}
```
From cbdc4bd369541f15f504d71c4203a452a7e9ca65 Mon Sep 17 00:00:00 2001
From: ArthurP
Date: Sun, 29 Aug 2021 10:40:41 +0800
Subject: [PATCH 0125/3468] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200452.=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=20C=E8=AF=AD=E8=A8=80=E7=89=88?=
=?UTF-8?q?=E6=9C=AC=E6=B3=A8=E9=87=8A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md" "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md"
index a2168dfc30..0714155885 100644
--- "a/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md"
+++ "b/problems/0452.\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.md"
@@ -236,7 +236,7 @@ int findMinArrowShots(int** points, int pointsSize, int* pointsColSize){
if(points[i][0] > points[i-1][1])
arrowNum++;
else
- //若前一个气球与当前气球重叠,判断并最小的x_end
+ //若前一个气球与当前气球重叠,判断并更新最小的x_end
points[i][1] = points[i][1] > points[i-1][1] ? points[i-1][1] : points[i][1];
}
return arrowNum;
From b4858a21cdf7a154e84fd3825b031740a7a6db08 Mon Sep 17 00:00:00 2001
From: ironartisan
Date: Sun, 29 Aug 2021 10:58:53 +0800
Subject: [PATCH 0126/3468] =?UTF-8?q?=E4=BF=AE=E5=A4=8D1005.K=E5=8F=96?=
=?UTF-8?q?=E5=8F=8D=E5=90=8E=E6=9C=80=E5=A4=A7=E5=8C=96=E7=9A=84=E6=95=B0?=
=?UTF-8?q?=E7=BB=84=E5=92=8CJava=E4=BB=A3=E7=A0=81K=E4=B9=A6=E5=86=99?=
=?UTF-8?q?=E9=94=99=E8=AF=AF=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...\226\347\232\204\346\225\260\347\273\204\345\222\214.md" | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md"
index 8bdd0f4111..b9973b5f7e 100644
--- "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md"
+++ "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md"
@@ -110,13 +110,13 @@ class Solution {
int len = nums.length;
for (int i = 0; i < len; i++) {
//从前向后遍历,遇到负数将其变为正数,同时K--
- if (nums[i] < 0 && k > 0) {
+ if (nums[i] < 0 && K > 0) {
nums[i] = -nums[i];
- k--;
+ K--;
}
}
// 如果K还大于0,那么反复转变数值最小的元素,将K用完
- if (k % 2 == 1) nums[len - 1] = -nums[len - 1];
+ if (K % 2 == 1) nums[len - 1] = -nums[len - 1];
int result = 0;
for (int a : nums) {
result += a;
From 051c2c5c3e6e77c757ffb94ba2e8f24f21243cc2 Mon Sep 17 00:00:00 2001
From: ironartisan
Date: Sun, 29 Aug 2021 11:02:52 +0800
Subject: [PATCH 0127/3468] =?UTF-8?q?=E4=BF=AE=E5=A4=8D1005.K=E5=8F=96?=
=?UTF-8?q?=E5=8F=8D=E5=90=8E=E6=9C=80=E5=A4=A7=E5=8C=96=E7=9A=84=E6=95=B0?=
=?UTF-8?q?=E7=BB=84=E5=92=8CJava=E4=BB=A3=E7=A0=81K=E4=B9=A6=E5=86=99?=
=?UTF-8?q?=E9=94=99=E8=AF=AF=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md"
index b9973b5f7e..0a0c8d6250 100644
--- "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md"
+++ "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md"
@@ -112,7 +112,7 @@ class Solution {
//从前向后遍历,遇到负数将其变为正数,同时K--
if (nums[i] < 0 && K > 0) {
nums[i] = -nums[i];
- K--;
+ K--;
}
}
// 如果K还大于0,那么反复转变数值最小的元素,将K用完
From 615139b74d11f47116b8b1e08e04936ba6184d72 Mon Sep 17 00:00:00 2001
From: ironartisan
Date: Sun, 29 Aug 2021 18:55:36 +0800
Subject: [PATCH 0128/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A00046.=E5=85=A8?=
=?UTF-8?q?=E6=8E=92=E5=88=97=E6=96=B0=E8=A7=A3=E6=B3=95Java=E4=BB=A3?=
=?UTF-8?q?=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...6.\345\205\250\346\216\222\345\210\227.md" | 26 +++++++++++++++++++
1 file changed, 26 insertions(+)
diff --git "a/problems/0046.\345\205\250\346\216\222\345\210\227.md" "b/problems/0046.\345\205\250\346\216\222\345\210\227.md"
index df9394eb6f..001c249e37 100644
--- "a/problems/0046.\345\205\250\346\216\222\345\210\227.md"
+++ "b/problems/0046.\345\205\250\346\216\222\345\210\227.md"
@@ -183,6 +183,32 @@ class Solution {
}
}
```
+```java
+// 解法2:通过判断path中是否存在数字,排除已经选择的数字
+class Solution {
+ List> result = new ArrayList<>();
+ LinkedList path = new LinkedList<>();
+ public List> permute(int[] nums) {
+ if (nums.length == 0) return result;
+ backtrack(nums, path);
+ return result;
+ }
+ public void backtrack(int[] nums, LinkedList path) {
+ if (path.size() == nums.length) {
+ result.add(new ArrayList<>(path));
+ }
+ for (int i =0; i < nums.length; i++) {
+ // 如果path中已有,则跳过
+ if (path.contains(nums[i])) {
+ continue;
+ }
+ path.add(nums[i]);
+ backtrack(nums, path);
+ path.removeLast();
+ }
+ }
+}
+```
Python:
```python3
From a7d3ab675a0835b23c956cdf9acaf627fc7c4148 Mon Sep 17 00:00:00 2001
From: hailincai
Date: Sun, 29 Aug 2021 07:16:16 -0400
Subject: [PATCH 0129/3468] =?UTF-8?q?Update=200337.=E6=89=93=E5=AE=B6?=
=?UTF-8?q?=E5=8A=AB=E8=88=8DIII.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
fix了一些md中的typo
---
....\346\211\223\345\256\266\345\212\253\350\210\215III.md" | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md" "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md"
index 2a69ac5682..dfb8ba57cb 100644
--- "a/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md"
+++ "b/problems/0337.\346\211\223\345\256\266\345\212\253\350\210\215III.md"
@@ -29,7 +29,7 @@
与198.打家劫舍,213.打家劫舍II一样,关键是要讨论当前节点抢还是不抢。
-如果抢了当前节点,两个孩子就不是动,如果没抢当前节点,就可以考虑抢左右孩子(**注意这里说的是“考虑”**)
+如果抢了当前节点,两个孩子就不能动,如果没抢当前节点,就可以考虑抢左右孩子(**注意这里说的是“考虑”**)
### 暴力递归
@@ -91,7 +91,7 @@ public:
### 动态规划
-在上面两种方法,其实对一个节点 投与不投得到的最大金钱都没有做记录,而是需要实时计算。
+在上面两种方法,其实对一个节点 偷与不偷得到的最大金钱都没有做记录,而是需要实时计算。
而动态规划其实就是使用状态转移容器来记录状态的变化,这里可以使用一个长度为2的数组,记录当前节点偷与不偷所得到的的最大金钱。
@@ -121,7 +121,7 @@ vector robTree(TreeNode* cur) {
2. 确定终止条件
-在遍历的过程中,如果遇到空间点的话,很明显,无论偷还是不偷都是0,所以就返回
+在遍历的过程中,如果遇到空节点的话,很明显,无论偷还是不偷都是0,所以就返回
```
if (cur == NULL) return vector{0, 0};
```
From 15ca61a880747f6afbc2c20e8c1520652cf5ea15 Mon Sep 17 00:00:00 2001
From: hailincai
Date: Sun, 29 Aug 2021 07:37:38 -0400
Subject: [PATCH 0130/3468] =?UTF-8?q?Update=201005.K=E6=AC=A1=E5=8F=96?=
=?UTF-8?q?=E5=8F=8D=E5=90=8E=E6=9C=80=E5=A4=A7=E5=8C=96=E7=9A=84=E6=95=B0?=
=?UTF-8?q?=E7=BB=84=E5=92=8C.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
保持Java代码的一致性,使用stream api来返回累加结果。
---
...226\347\232\204\346\225\260\347\273\204\345\222\214.md" | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
diff --git "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md" "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md"
index 8bdd0f4111..30718b1395 100644
--- "a/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md"
+++ "b/problems/1005.K\346\254\241\345\217\226\345\217\215\345\220\216\346\234\200\345\244\247\345\214\226\347\232\204\346\225\260\347\273\204\345\222\214.md"
@@ -117,11 +117,8 @@ class Solution {
}
// 如果K还大于0,那么反复转变数值最小的元素,将K用完
if (k % 2 == 1) nums[len - 1] = -nums[len - 1];
- int result = 0;
- for (int a : nums) {
- result += a;
- }
- return result;
+
+ return Arrays.stream(nums).sum();
}
}
```
From e1cc87ad9f86d20826339e3badb07c313d32130b Mon Sep 17 00:00:00 2001
From: XuDaHaoRen <1547794387@qq.com>
Date: Sun, 29 Aug 2021 20:33:53 +0800
Subject: [PATCH 0131/3468] =?UTF-8?q?=E5=89=A9=E4=BD=99=E4=BB=A3=E7=A0=81?=
=?UTF-8?q?=E8=AF=AF=E5=88=A0=E6=96=87=E4=BB=B6=E6=9B=BF=E6=8D=A2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...76\345\274\217\346\261\202\345\200\274.md" | 29 +++++++++++--------
...07\345\255\220\345\272\217\345\210\227.md" | 6 ++--
2 files changed, 20 insertions(+), 15 deletions(-)
diff --git "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md" "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md"
index bcde7d5ba4..3665210906 100644
--- "a/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md"
+++ "b/problems/0150.\351\200\206\346\263\242\345\205\260\350\241\250\350\276\276\345\274\217\346\261\202\345\200\274.md"
@@ -13,7 +13,7 @@
# 150. 逆波兰表达式求值
-https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/
+[力扣题目链接](https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/)
根据 逆波兰表示法,求表达式的值。
@@ -23,7 +23,7 @@ https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/
整数除法只保留整数部分。
给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
-
+
示例 1:
* 输入: ["2", "1", "+", "3", " * "]
@@ -37,16 +37,21 @@ https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/
示例 3:
* 输入: ["10", "6", "9", "3", "+", "-11", " * ", "/", " * ", "17", "+", "5", "+"]
+
* 输出: 22
+
* 解释:该算式转化为常见的中缀算术表达式为:
+
+ ```
((10 * (6 / ((9 + 3) * -11))) + 17) + 5
-= ((10 * (6 / (12 * -11))) + 17) + 5
-= ((10 * (6 / -132)) + 17) + 5
-= ((10 * 0) + 17) + 5
-= (0 + 17) + 5
-= 17 + 5
-= 22
-
+ = ((10 * (6 / (12 * -11))) + 17) + 5
+ = ((10 * (6 / -132)) + 17) + 5
+ = ((10 * 0) + 17) + 5
+ = (0 + 17) + 5
+ = 17 + 5
+ = 22
+ ```
+
逆波兰表达式:是一种后缀表达式,所谓后缀就是指算符写在后面。
@@ -62,7 +67,7 @@ https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/
# 思路
-在上一篇文章中[1047.删除字符串中的所有相邻重复项](https://mp.weixin.qq.com/s/1-x6r1wGA9mqIHW5LrMvBg)提到了 递归就是用栈来实现的。
+在上一篇文章中[1047.删除字符串中的所有相邻重复项](https://programmercarl.com/1047.删除字符串中的所有相邻重复项.html)提到了 递归就是用栈来实现的。
所以**栈与递归之间在某种程度上是可以转换的!** 这一点我们在后续讲解二叉树的时候,会更详细的讲解到。
@@ -70,12 +75,12 @@ https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/
但我们没有必要从二叉树的角度去解决这个问题,只要知道逆波兰表达式是用后续遍历的方式把二叉树序列化了,就可以了。
-在进一步看,本题中每一个子表达式要得出一个结果,然后拿这个结果再进行运算,那么**这岂不就是一个相邻字符串消除的过程,和[1047.删除字符串中的所有相邻重复项](https://mp.weixin.qq.com/s/1-x6r1wGA9mqIHW5LrMvBg)中的对对碰游戏是不是就非常像了。**
+在进一步看,本题中每一个子表达式要得出一个结果,然后拿这个结果再进行运算,那么**这岂不就是一个相邻字符串消除的过程,和[1047.删除字符串中的所有相邻重复项](https://programmercarl.com/1047.删除字符串中的所有相邻重复项.html)中的对对碰游戏是不是就非常像了。**
如动画所示:

-相信看完动画大家应该知道,这和[1047. 删除字符串中的所有相邻重复项](https://mp.weixin.qq.com/s/1-x6r1wGA9mqIHW5LrMvBg)是差不错的,只不过本题不要相邻元素做消除了,而是做运算!
+相信看完动画大家应该知道,这和[1047. 删除字符串中的所有相邻重复项](https://programmercarl.com/1047.删除字符串中的所有相邻重复项.html)是差不错的,只不过本题不要相邻元素做消除了,而是做运算!
C++代码如下:
diff --git "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md"
index 0ac6e78440..f9145f4c3b 100644
--- "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md"
+++ "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md"
@@ -8,13 +8,13 @@
## 300.最长递增子序列
-题目链接:https://leetcode-cn.com/problems/longest-increasing-subsequence/
+[力扣题目链接](https://leetcode-cn.com/problems/longest-increasing-subsequence/)
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
-
+
示例 1:
输入:nums = [10,9,2,5,3,7,101,18]
输出:4
@@ -27,7 +27,7 @@
示例 3:
输入:nums = [7,7,7,7,7,7,7]
输出:1
-
+
提示:
* 1 <= nums.length <= 2500
From 976379c7f28de998cd2a475c4d693978b55ea03a Mon Sep 17 00:00:00 2001
From: bourne-3 <595962708@qq.com>
Date: Sun, 29 Aug 2021 20:43:26 +0800
Subject: [PATCH 0132/3468] =?UTF-8?q?0234-=E5=9B=9E=E6=96=87=E9=93=BE?=
=?UTF-8?q?=E8=A1=A8Java=E5=AE=9E=E7=8E=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...36\346\226\207\351\223\276\350\241\250.md" | 71 +++++++++++++++++++
1 file changed, 71 insertions(+)
diff --git "a/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md" "b/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md"
index 04015a7f52..631d2f6bfa 100644
--- "a/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md"
+++ "b/problems/0234.\345\233\236\346\226\207\351\223\276\350\241\250.md"
@@ -144,6 +144,75 @@ public:
## Java
```java
+// 方法一,使用数组
+class Solution {
+ public boolean isPalindrome(ListNode head) {
+ int len = 0;
+ // 统计链表长度
+ ListNode cur = head;
+ while (cur != null) {
+ len++;
+ cur = cur.next;
+ }
+ cur = head;
+ int[] res = new int[len];
+ // 将元素加到数组之中
+ for (int i = 0; i < res.length; i++){
+ res[i] = cur.val;
+ cur = cur.next;
+ }
+ // 比较回文
+ for (int i = 0, j = len - 1; i < j; i++, j--){
+ if (res[i] != res[j]){
+ return false;
+ }
+ }
+ return true;
+ }
+}
+
+// 方法二,快慢指针
+class Solution {
+ public boolean isPalindrome(ListNode head) {
+ // 如果为空或者仅有一个节点,返回true
+ if (head == null && head.next == null) return true;
+ ListNode slow = head;
+ ListNode fast = head;
+ ListNode pre = head;
+ while (fast != null && fast.next != null){
+ pre = slow; // 记录slow的前一个结点
+ slow = slow.next;
+ fast = fast.next.next;
+ }
+ pre.next = null; // 分割两个链表
+
+ // 前半部分
+ ListNode cur1 = head;
+ // 后半部分。这里使用了反转链表
+ ListNode cur2 = reverseList(slow);
+
+ while (cur1 != null){
+ if (cur1.val != cur2.val) return false;
+
+ // 注意要移动两个结点
+ cur1 = cur1.next;
+ cur2 = cur2.next;
+ }
+ return true;
+ }
+ ListNode reverseList(ListNode head){
+ // 反转链表
+ ListNode tmp = null;
+ ListNode pre = null;
+ while (head != null){
+ tmp = head.next;
+ head.next = pre;
+ pre = head;
+ head = tmp;
+ }
+ return pre;
+ }
+}
```
## Python
@@ -209,11 +278,13 @@ class Solution:
## Go
```go
+
```
## JavaScript
```js
+
```
From 1e9572b005dcd8ac3b15a472187df05d47832136 Mon Sep 17 00:00:00 2001
From: XuDaHaoRen <1547794387@qq.com>
Date: Sun, 29 Aug 2021 21:04:58 +0800
Subject: [PATCH 0133/3468] =?UTF-8?q?=E8=BF=9E=E6=8E=A5=E5=90=88=E5=B9=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...345\205\254\345\217\270\346\200\273\347\273\223.md" | 2 +-
...347\256\227\346\263\225\346\250\241\346\235\277.md" | 10 +++++-----
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git "a/problems/\345\211\215\345\272\217/\345\271\277\345\267\236\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md" "b/problems/\345\211\215\345\272\217/\345\271\277\345\267\236\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md"
index 3cc18c8e2c..ae41c89972 100644
--- "a/problems/\345\211\215\345\272\217/\345\271\277\345\267\236\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md"
+++ "b/problems/\345\211\215\345\272\217/\345\271\277\345\267\236\344\272\222\350\201\224\347\275\221\345\205\254\345\217\270\346\200\273\347\273\223.md"
@@ -51,7 +51,7 @@
## 总结
-同在广东省,难免不了要和深圳对比,大家如果看了这篇:[深圳原来有这么多互联网公司,你都知道么?](https://mp.weixin.qq.com/s/3VJHF2zNohBwDBxARFIn-Q)就能感受到鲜明的对比了。
+同在广东省,难免不了要和深圳对比,大家如果看了这篇:[深圳原来有这么多互联网公司,你都知道么?](https://programmercarl.com/前序/深圳互联网公司总结.html)就能感受到鲜明的对比了。
广州大厂高端岗位其实比较少,本土只有微信和网易,微信呢毕竟还是腾讯的分部,而网易被很多人认为是杭州企业,其实网易总部在广州。
diff --git "a/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md" "b/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md"
index 8f6b053e94..b56678ab8c 100644
--- "a/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md"
+++ "b/problems/\347\256\227\346\263\225\346\250\241\346\235\277.md"
@@ -174,7 +174,7 @@ vector postorderTraversal(TreeNode* root) {
```
### 广度优先遍历(队列)
-相关题解:[0102.二叉树的层序遍历](https://github.com/youngyangyang04/leetcode/blob/master/problems/0102.二叉树的层序遍历.md)
+相关题解:[0102.二叉树的层序遍历](https://programmercarl.com/0102.二叉树的层序遍历.html)
```
vector> levelOrder(TreeNode* root) {
@@ -202,13 +202,13 @@ vector> levelOrder(TreeNode* root) {
可以直接解决如下题目:
-* [0102.二叉树的层序遍历](https://github.com/youngyangyang04/leetcode/blob/master/problems/0102.二叉树的层序遍历.md)
+* [0102.二叉树的层序遍历](https://programmercarl.com/0102.二叉树的层序遍历.html)
* [0199.二叉树的右视图](https://github.com/youngyangyang04/leetcode/blob/master/problems/0199.二叉树的右视图.md)
* [0637.二叉树的层平均值](https://github.com/youngyangyang04/leetcode/blob/master/problems/0637.二叉树的层平均值.md)
-* [0104.二叉树的最大深度 (迭代法)](https://github.com/youngyangyang04/leetcode/blob/master/problems/0104.二叉树的最大深度.md)
+* [0104.二叉树的最大深度 (迭代法)](https://programmercarl.com/0104.二叉树的最大深度.html)
-* [0111.二叉树的最小深度(迭代法)]((https://github.com/youngyangyang04/leetcode/blob/master/problems/0111.二叉树的最小深度.md))
-* [0222.完全二叉树的节点个数(迭代法)](https://github.com/youngyangyang04/leetcode/blob/master/problems/0222.完全二叉树的节点个数.md)
+* [0111.二叉树的最小深度(迭代法)](https://programmercarl.com/0111.二叉树的最小深度.html)
+* [0222.完全二叉树的节点个数(迭代法)](https://programmercarl.com/0222.完全二叉树的节点个数.html)
### 二叉树深度
From 4e2fbce1b2314cf90f2d9f0f149b85a381349e30 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E4=BD=99=E6=9D=9C=E6=9E=97?=
Date: Sun, 29 Aug 2021 23:15:42 +0800
Subject: [PATCH 0134/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A00151.=E7=BF=BB?=
=?UTF-8?q?=E8=BD=AC=E5=AD=97=E7=AC=A6=E4=B8=B2=E9=87=8C=E7=9A=84=E5=8D=95?=
=?UTF-8?q?=E8=AF=8D=20Swift=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...14\347\232\204\345\215\225\350\257\215.md" | 79 +++++++++++++++++++
1 file changed, 79 insertions(+)
diff --git "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md" "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md"
index 84e348a965..c4a9c7e0dc 100644
--- "a/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md"
+++ "b/problems/0151.\347\277\273\350\275\254\345\255\227\347\254\246\344\270\262\351\207\214\347\232\204\345\215\225\350\257\215.md"
@@ -467,6 +467,85 @@ function reverse(strArr, start, end) {
}
```
+Swift:
+
+```swift
+func reverseWords(_ s: String) -> String {
+ var stringArr = removeSpace(s)
+ reverseString(&stringArr, startIndex: 0, endIndex: stringArr.count - 1)
+ reverseWord(&stringArr)
+ return String(stringArr)
+}
+
+/// 1、移除多余的空格(前后所有的空格,中间只留一个空格)
+func removeSpace(_ s: String) -> [Character] {
+ let ch = Array(s)
+ var left = 0
+ var right = ch.count - 1
+ // 忽略字符串前面的所有空格
+ while ch[left] == " " {
+ left += 1
+ }
+ // 忽略字符串后面的所有空格
+ while ch[right] == " " {
+ right -= 1
+ }
+
+ // 接下来就是要处理中间的多余空格
+ var lastArr = Array()
+ while left <= right {
+ // 准备加到新字符串当中的字符
+ let char = ch[left]
+ // 新的字符串的最后一个字符;或者原字符串中,准备加到新字符串的那个字符;这两个字符当中,只要有一个不是空格,就可以加到新的字符串当中
+ if char != " " || lastArr[lastArr.count - 1] != " " {
+ lastArr.append(char)
+ }
+
+ left += 1
+ }
+ return lastArr
+}
+
+/// 2、反转整个字符串
+func reverseString(_ s: inout [Character], startIndex: Int, endIndex: Int) {
+ var start = startIndex
+ var end = endIndex
+ while start < end {
+ (s[start], s[end]) = (s[end], s[start])
+ start += 1
+ end -= 1
+ }
+}
+
+/// 3、再次将字符串里面的单词反转
+func reverseWord(_ s: inout [Character]) {
+ var start = 0
+ var end = 0
+ var entry = false
+
+ for i in 0..
Date: Mon, 30 Aug 2021 10:07:49 +0800
Subject: [PATCH 0135/3468] Update
---
README.md | 3 +-
...25\350\257\215\346\216\245\351\276\231.md" | 150 ++++++++++++++++++
...54\345\205\261\347\245\226\345\205\210.md" | 26 ++-
...4.\347\233\256\346\240\207\345\222\214.md" | 7 +-
...55\347\232\204\344\274\227\346\225\260.md" | 86 +++-------
...16\346\234\254\351\241\271\347\233\256.md" | 4 +
...47\241\20001\350\203\214\345\214\205-1.md" | 2 +-
7 files changed, 198 insertions(+), 80 deletions(-)
create mode 100644 "problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md"
diff --git a/README.md b/README.md
index 267d794e26..8a3574fa3d 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-👉 推荐 [在线阅读](http://programmercarl.com/) (Github在国内访问经常不稳定)
+👉 推荐 [在线阅读](http://programmercarl.com/) (Github在国内访问经常不稳定)
👉 推荐 [Gitee同步](https://gitee.com/programmercarl/leetcode-master)
> 1. **介绍**:本项目是一套完整的刷题计划,旨在帮助大家少走弯路,循序渐进学算法,[关注作者](#关于作者)
@@ -494,6 +494,7 @@
## 图论
* [463.岛屿的周长](./problems/0463.岛屿的周长.md) (模拟)
* [841.钥匙和房间](./problems/0841.钥匙和房间.md) 【有向图】dfs,bfs都可以
+* [127.单词接龙](./problems/0127.单词接龙.md) 广搜
## 并查集
* [684.冗余连接](./problems/0684.冗余连接.md) 【并查集基础题目】
diff --git "a/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md" "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md"
new file mode 100644
index 0000000000..e38453ef6c
--- /dev/null
+++ "b/problems/0127.\345\215\225\350\257\215\346\216\245\351\276\231.md"
@@ -0,0 +1,150 @@
+
+
+
+
+
+
+
+欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!
+
+# 127. 单词接龙
+
+[力扣题目链接](https://leetcode-cn.com/problems/word-ladder/)
+
+
+字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列:
+* 序列中第一个单词是 beginWord 。
+* 序列中最后一个单词是 endWord 。
+* 每次转换只能改变一个字母。
+* 转换过程中的中间单词必须是字典 wordList 中的单词。
+* 给你两个单词 beginWord 和 endWord 和一个字典 wordList ,找到从 beginWord 到 endWord 的 最短转换序列 中的 单词数目 。如果不存在这样的转换序列,返回 0。
+
+
+示例 1:
+
+* 输入:beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log","cog"]
+* 输出:5
+* 解释:一个最短转换序列是 "hit" -> "hot" -> "dot" -> "dog" -> "cog", 返回它的长度 5。
+
+示例 2:
+* 输入:beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log"]
+* 输出:0
+* 解释:endWord "cog" 不在字典中,所以无法进行转换。
+
+
+# 思路
+
+以示例1为例,从这个图中可以看出 hit 到 cog的路线,不止一条,有三条,两条是最短的长度为5,一条长度为6。
+
+
+
+本题只需要求出最短长度就可以了,不用找出路径。
+
+所以这道题要解决两个问题:
+
+* 图中的线是如何连在一起的
+* 起点和终点的最短路径长度
+
+
+首先题目中并没有给出点与点之间的连线,而是要我们自己去连,条件是字符只能差一个,所以判断点与点之间的关系,要自己判断是不是差一个字符,如果差一个字符,那就是有链接。
+
+然后就是求起点和终点的最短路径长度,**这里无向图求最短路,广搜最为合适,广搜只要搜到了终点,那么一定是最短的路径**。因为广搜就是以起点中心向四周扩散的搜索。
+
+本题如果用深搜,会非常麻烦。
+
+另外需要有一个注意点:
+
+* 本题是一个无向图,需要用标记位,标记着节点是否走过,否则就会死循环!
+* 本题给出集合是数组型的,可以转成set结构,查找更快一些
+
+C++代码如下:(详细注释)
+
+```CPP
+class Solution {
+public:
+ int ladderLength(string beginWord, string endWord, vector& wordList) {
+ // 将vector转成unordered_set,提高查询速度
+ unordered_set wordSet(wordList.begin(), wordList.end());
+ // 如果endWord没有在wordSet出现,直接返回0
+ if (wordSet.find(endWord) == wordSet.end()) return 0;
+ // 记录word是否访问过
+ unordered_map visitMap; //
+ // 初始化队列
+ queue que;
+ que.push(beginWord);
+ // 初始化visitMap
+ visitMap.insert(pair(beginWord, 1));
+
+ while(!que.empty()) {
+ string word = que.front();
+ que.pop();
+ int path = visitMap[word]; // 这个word的路径长度
+ for (int i = 0; i < word.size(); i++) {
+ string newWord = word; // 用一个新单词替换word,因为每次置换一个字母
+ for (int j = 0 ; j < 26; j++) {
+ newWord[i] = j + 'a';
+ if (newWord == endWord) return path + 1; // 找到了end,返回path+1
+ // wordSet出现了newWord,并且newWord没有被访问过
+ if (wordSet.find(newWord) != wordSet.end()
+ && visitMap.find(newWord) == visitMap.end()) {
+ // 添加访问信息
+ visitMap.insert(pair(newWord, path + 1));
+ que.push(newWord);
+ }
+ }
+ }
+ }
+ return 0;
+ }
+};
+```
+
+# 其他语言版本
+
+## Java
+
+```java
+public int ladderLength(String beginWord, String endWord, List wordList) {
+ HashSet wordSet = new HashSet<>(wordList); //转换为hashset 加快速度
+ if (wordSet.size() == 0 || !wordSet.contains(endWord)) { //特殊情况判断
+ return 0;
+ }
+ Queue queue = new LinkedList<>(); //bfs 队列
+ queue.offer(beginWord);
+ Map map = new HashMap<>(); //记录单词对应路径长度
+ map.put(beginWord, 1);
+
+ while (!queue.isEmpty()) {
+ String word = queue.poll(); //取出队头单词
+ int path = map.get(word); //获取到该单词的路径长度
+ for (int i = 0; i < word.length(); i++) { //遍历单词的每个字符
+ char[] chars = word.toCharArray(); //将单词转换为char array,方便替换
+ for (char k = 'a'; k <= 'z'; k++) { //从'a' 到 'z' 遍历替换
+ chars[i] = k; //替换第i个字符
+ String newWord = String.valueOf(chars); //得到新的字符串
+ if (newWord.equals(endWord)) { //如果新的字符串值与endWord一致,返回当前长度+1
+ return path + 1;
+ }
+ if (wordSet.contains(newWord) && !map.containsKey(newWord)) { //如果新单词在set中,但是没有访问过
+ map.put(newWord, path + 1); //记录单词对应的路径长度
+ queue.offer(newWord);//加入队尾
+ }
+ }
+ }
+ }
+ return 0; //未找到
+}
+```
+
+## Python
+
+## Go
+
+## JavaScript
+
+
+-----------------------
+* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
+* B站视频:[代码随想录](https://space.bilibili.com/525438321)
+* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)
+
diff --git "a/problems/0236.\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.md" "b/problems/0236.\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.md"
index 16c235ee96..59345a2405 100644
--- "a/problems/0236.\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.md"
+++ "b/problems/0236.\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.md"
@@ -9,7 +9,7 @@
> 本来是打算将二叉树和二叉搜索树的公共祖先问题一起讲,后来发现篇幅过长了,只能先说一说二叉树的公共祖先问题。
-## 236. 二叉树的最近公共祖先
+# 236. 二叉树的最近公共祖先
[力扣题目链接](https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/)
@@ -35,7 +35,7 @@
* 所有节点的值都是唯一的。
* p、q 为不同节点且均存在于给定的二叉树中。
-## 思路
+# 思路
遇到这个题目首先想的是要是能自底向上查找就好了,这样就可以找到公共祖先了。
@@ -202,7 +202,7 @@ public:
};
```
-## 总结
+# 总结
这道题目刷过的同学未必真正了解这里面回溯的过程,以及结果是如何一层一层传上去的。
@@ -219,10 +219,10 @@ public:
本题没有给出迭代法,因为迭代法不适合模拟回溯的过程。理解递归的解法就够了。
-## 其他语言版本
+# 其他语言版本
-Java:
+## Java
```Java
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
@@ -261,14 +261,9 @@ class Solution {
}
```
-Python:
+## Python
+
```python
-# Definition for a binary tree node.
-# class TreeNode:
-# def __init__(self, x):
-# self.val = x
-# self.left = None
-# self.right = None
//递归
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
@@ -280,7 +275,9 @@ class Solution:
elif not left and right: return right //目标节点是通过right返回的
else: return None //没找到
```
-Go:
+
+## Go
+
```Go
func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode {
// check
@@ -310,7 +307,8 @@ func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode {
}
```
-JavaScript版本:
+## JavaScript
+
```javascript
var lowestCommonAncestor = function(root, p, q) {
// 使用递归的方法
diff --git "a/problems/0494.\347\233\256\346\240\207\345\222\214.md" "b/problems/0494.\347\233\256\346\240\207\345\222\214.md"
index 63ace2a795..342c229d2b 100644
--- "a/problems/0494.\347\233\256\346\240\207\345\222\214.md"
+++ "b/problems/0494.\347\233\256\346\240\207\345\222\214.md"
@@ -128,7 +128,10 @@ x = (S + sum) / 2
if ((S + sum) % 2 == 1) return 0; // 此时没有方案
```
-**看到这种表达式,应该本能的反应,两个int相加数值可能溢出的问题,当然本题并没有溢出**。
+同时如果 S的绝对值已经大于sum,那么也是没有方案的。
+```CPP
+if (abs(S) > sum) return 0; // 此时没有方案
+```
再回归到01背包问题,为什么是01背包呢?
@@ -200,7 +203,7 @@ public:
int findTargetSumWays(vector& nums, int S) {
int sum = 0;
for (int i = 0; i < nums.size(); i++) sum += nums[i];
- if (S > sum) return 0; // 此时没有方案
+ if (abs(S) > sum) return 0; // 此时没有方案
if ((S + sum) % 2 == 1) return 0; // 此时没有方案
int bagSize = (S + sum) / 2;
vector dp(bagSize + 1, 0);
diff --git "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md" "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md"
index 4221e2857c..aeddc60015 100644
--- "a/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md"
+++ "b/problems/0501.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\255\347\232\204\344\274\227\346\225\260.md"
@@ -9,7 +9,7 @@
> 二叉树上应该怎么求,二叉搜索树上又应该怎么求?
-## 501.二叉搜索树中的众数
+# 501.二叉搜索树中的众数
[力扣题目链接](https://leetcode-cn.com/problems/find-mode-in-binary-search-tree/solution/)
@@ -33,7 +33,7 @@
进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)
-## 思路
+# 思路
这道题目呢,递归法我从两个维度来讲。
@@ -321,7 +321,7 @@ public:
};
```
-## 总结
+# 总结
本题在递归法中,我给出了如果是普通二叉树,应该怎么求众数。
@@ -340,12 +340,13 @@ public:
> **需要强调的是 leetcode上的耗时统计是非常不准确的,看个大概就行,一样的代码耗时可以差百分之50以上**,所以leetcode的耗时统计别太当回事,知道理论上的效率优劣就行了。
-## 其他语言版本
+# 其他语言版本
-Java:
+## Java
暴力法
+
```java
class Solution {
public int[] findMode(FindModeInBinarySearchTree.TreeNode root) {
@@ -379,6 +380,8 @@ class Solution {
}
```
+中序遍历-不使用额外空间,利用二叉搜索树特性
+
```Java
class Solution {
ArrayList resList;
@@ -427,15 +430,11 @@ class Solution {
}
```
-Python:
+## Python
+
+递归法
+
```python
-# Definition for a binary tree node.
-# class TreeNode:
-# def __init__(self, val=0, left=None, right=None):
-# self.val = val
-# self.left = left
-# self.right = right
-# 递归法
class Solution:
def findMode(self, root: TreeNode) -> List[int]:
if not root: return
@@ -460,36 +459,11 @@ class Solution:
return
findNumber(root)
return self.res
+```
-# 迭代法-中序遍历-使用额外空间map的方法:
-class Solution:
- def findMode(self, root: TreeNode) -> List[int]:
- stack = []
- cur = root
- pre = None
- dist = {}
- while cur or stack:
- if cur: # 指针来访问节点,访问到最底层
- stack.append(cur)
- cur = cur.left
- else: # 逐一处理节点
- cur = stack.pop()
- if cur.val in dist:
- dist[cur.val] += 1
- else:
- dist[cur.val] = 1
- pre = cur
- cur = cur.right
-
- # 找出字典中最大的key
- res = []
- for key, value in dist.items():
- if (value == max(dist.values())):
- res.append(key)
- return res
-
-# 迭代法-中序遍历-不使用额外空间,利用二叉搜索树特性:
+迭代法-中序遍历-不使用额外空间,利用二叉搜索树特性
+```python
class Solution:
def findMode(self, root: TreeNode) -> List[int]:
stack = []
@@ -521,18 +495,11 @@ class Solution:
return res
```
-Go:
+## Go
+
暴力法(非BSL)
```go
-/**
- * Definition for a binary tree node.
- * type TreeNode struct {
- * Val int
- * Left *TreeNode
- * Right *TreeNode
- * }
- */
func findMode(root *TreeNode) []int {
var history map[int]int
var maxValue int
@@ -571,15 +538,7 @@ func traversal(root *TreeNode,history map[int]int){
计数法,不使用额外空间,利用二叉树性质,中序遍历
```go
-/**
- * Definition for a binary tree node.
- * type TreeNode struct {
- * Val int
- * Left *TreeNode
- * Right *TreeNode
- * }
- */
- func findMode(root *TreeNode) []int {
+func findMode(root *TreeNode) []int {
res := make([]int, 0)
count := 1
max := 1
@@ -611,8 +570,9 @@ func traversal(root *TreeNode,history map[int]int){
}
```
-JavaScript版本:
-使用额外空间map的方法:
+## JavaScript
+
+使用额外空间map的方法
```javascript
var findMode = function(root) {
// 使用递归中序遍历
@@ -649,8 +609,10 @@ var findMode = function(root) {
}
return res;
};
-```
+```
+
不使用额外空间,利用二叉树性质,中序遍历(有序):
+
```javascript
var findMode = function(root) {
// 不使用额外空间,使用中序遍历,设置出现最大次数初始值为1
diff --git "a/problems/\345\205\266\344\273\226/\345\217\202\344\270\216\346\234\254\351\241\271\347\233\256.md" "b/problems/\345\205\266\344\273\226/\345\217\202\344\270\216\346\234\254\351\241\271\347\233\256.md"
index 69cb855532..cfa754396f 100644
--- "a/problems/\345\205\266\344\273\226/\345\217\202\344\270\216\346\234\254\351\241\271\347\233\256.md"
+++ "b/problems/\345\205\266\344\273\226/\345\217\202\344\270\216\346\234\254\351\241\271\347\233\256.md"
@@ -5,3 +5,7 @@
**push代码之前 一定要 先pull最新代码**,否则提交的pr可能会有删除其他录友代码的操作。
一个pr 不要修改过多文件,因为一旦有一个 文件修改有问题,就不能合入,影响其他文件的合入了。
+
+git add之前,要git diff 查看一下,本次提交所修改的代码是不是 自己修改的,是否 误删,或者误加的文件。
+
+提交代码,不要使用git push -f 这种命令,要足够了解 -f 意味着什么。
diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md"
index 851c265719..1943237173 100644
--- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md"
+++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md"
@@ -230,7 +230,7 @@ void test_2_wei_bag_problem1() {
int bagWeight = 4;
// 二维数组
- vector> dp(weight.size() + 1, vector(bagWeight + 1, 0));
+ vector> dp(weight.size(), vector(bagWeight + 1, 0));
// 初始化
for (int j = weight[0]; j <= bagWeight; j++) {
From eb17c57bf3c0c3c5785568614073800866770f3f Mon Sep 17 00:00:00 2001
From: ironartisan
Date: Mon, 30 Aug 2021 10:23:08 +0800
Subject: [PATCH 0136/3468] =?UTF-8?q?=E5=A2=9E=E5=8A=A00134.=E5=8A=A0?=
=?UTF-8?q?=E6=B2=B9=E7=AB=99Java=E8=A7=A3=E6=B3=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...4.\345\212\240\346\262\271\347\253\231.md" | 22 ++++++++++++++++++-
1 file changed, 21 insertions(+), 1 deletion(-)
diff --git "a/problems/0134.\345\212\240\346\262\271\347\253\231.md" "b/problems/0134.\345\212\240\346\262\271\347\253\231.md"
index 0befd0853c..bee909c3ed 100644
--- "a/problems/0134.\345\212\240\346\262\271\347\253\231.md"
+++ "b/problems/0134.\345\212\240\346\262\271\347\253\231.md"
@@ -200,6 +200,7 @@ public:
Java:
```java
+// 解法1
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int sum = 0;
@@ -221,7 +222,26 @@ class Solution {
}
}
```
-
+```java
+// 解法2
+class Solution {
+ public int canCompleteCircuit(int[] gas, int[] cost) {
+ int curSum = 0;
+ int totalSum = 0;
+ int index = 0;
+ for (int i = 0; i < gas.length; i++) {
+ curSum += gas[i] - cost[i];
+ totalSum += gas[i] - cost[i];
+ if (curSum < 0) {
+ index = (i + 1) % gas.length ;
+ curSum = 0;
+ }
+ }
+ if (totalSum < 0) return -1;
+ return index;
+ }
+}
+```
Python:
```python
class Solution:
From bf068cc17b02bf62bbd2055f49effa5093bd2b4d Mon Sep 17 00:00:00 2001
From: wjjiang <48505670+Spongecaptain@users.noreply.github.com>
Date: Mon, 30 Aug 2021 11:14:24 +0800
Subject: [PATCH 0137/3468] =?UTF-8?q?Update=200392.=E5=88=A4=E6=96=AD?=
=?UTF-8?q?=E5=AD=90=E5=BA=8F=E5=88=97.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
添加 Golang 动态规划版本
---
...55\345\255\220\345\272\217\345\210\227.md" | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md" "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md"
index 54c16489cf..784e3bbc78 100644
--- "a/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md"
+++ "b/problems/0392.\345\210\244\346\226\255\345\255\220\345\272\217\345\210\227.md"
@@ -203,6 +203,25 @@ const isSubsequence = (s, t) => {
};
```
+Go:
+```go
+func isSubsequence(s string, t string) bool {
+ dp := make([][]int,len(s)+1)
+ for i:=0;i
Date: Mon, 30 Aug 2021 13:17:34 +0800
Subject: [PATCH 0138/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=89=91=E6=8C=87O?=
=?UTF-8?q?ffer58-II.=E5=B7=A6=E6=97=8B=E8=BD=AC=E5=AD=97=E7=AC=A6?=
=?UTF-8?q?=E4=B8=B2=20Swift=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...54\345\255\227\347\254\246\344\270\262.md" | 28 +++++++++++++++++++
1 file changed, 28 insertions(+)
diff --git "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md"
index f4d3368cad..d8aaca67d5 100644
--- "a/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md"
+++ "b/problems/\345\211\221\346\214\207Offer58-II.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md"
@@ -214,6 +214,34 @@ var reverseLeftWords = function (s, n) {
};
```
+Swift:
+
+```swift
+func reverseLeftWords(_ s: String, _ n: Int) -> String {
+ var ch = Array(s)
+ let len = ch.count
+ // 反转区间[0, n - 1]
+ reverseString(&ch, startIndex: 0, endIndex: n - 1)
+ // 反转区间[n, len - 1]
+ reverseString(&ch, startIndex: n, endIndex: len - 1)
+ // 反转区间[0, len - 1],也就是整个字符串反转
+ reverseString(&ch, startIndex: 0, endIndex: len - 1)
+ return String(ch)
+}
+
+func reverseString(_ s: inout [Character], startIndex: Int, endIndex: Int) {
+ var start = startIndex
+ var end = endIndex
+ while start < end {
+ (s[start], s[end]) = (s[end], s[start])
+ start += 1
+ end -= 1
+ }
+}
+```
+
+
+
From ee6bd7413c7a94135c760363c8a5f3fb6ccb0085 Mon Sep 17 00:00:00 2001
From: ironartisan
Date: Tue, 31 Aug 2021 10:46:18 +0800
Subject: [PATCH 0139/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A00056.=E5=90=88?=
=?UTF-8?q?=E5=B9=B6=E5=8C=BA=E9=97=B4Java=E8=A7=A3=E6=B3=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...10\345\271\266\345\214\272\351\227\264.md" | 22 +++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md" "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md"
index 2322951a90..82ca29e60b 100644
--- "a/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md"
+++ "b/problems/0056.\345\220\210\345\271\266\345\214\272\351\227\264.md"
@@ -157,6 +157,28 @@ class Solution {
}
}
```
+```java
+// 版本2
+class Solution {
+ public int[][] merge(int[][] intervals) {
+ LinkedList res = new LinkedList<>();
+ Arrays.sort(intervals, (o1, o2) -> Integer.compare(o1[0], o2[0]));
+ res.add(intervals[0]);
+ for (int i = 1; i < intervals.length; i++) {
+ if (intervals[i][0] <= res.getLast()[1]) {
+ int start = res.getLast()[0];
+ int end = Math.max(intervals[i][1], res.getLast()[1]);
+ res.removeLast();
+ res.add(new int[]{start, end});
+ }
+ else {
+ res.add(intervals[i]);
+ }
+ }
+ return res.toArray(new int[res.size()][]);
+ }
+}
+```
Python:
```python
From 09002bc5388d1d604f263e71aebe9a65e8dd6cac Mon Sep 17 00:00:00 2001
From: youngyangyang04 <826123027@qq.com>
Date: Tue, 31 Aug 2021 10:47:26 +0800
Subject: [PATCH 0140/3468] Update
---
...54\345\205\261\347\245\226\345\205\210.md" | 96 +++++++------------
...47\241\20001\350\203\214\345\214\205-1.md" | 2 +-
2 files changed, 37 insertions(+), 61 deletions(-)
diff --git "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md" "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md"
index fab450baf9..929e6eb2dc 100644
--- "a/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md"
+++ "b/problems/0235.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210.md"
@@ -7,7 +7,7 @@
欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!
-## 235. 二叉搜索树的最近公共祖先
+# 235. 二叉搜索树的最近公共祖先
[力扣题目链接](https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-search-tree/)
@@ -21,14 +21,15 @@
示例 1:
-输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8
-输出: 6
-解释: 节点 2 和节点 8 的最近公共祖先是 6。
+* 输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8
+* 输出: 6
+* 解释: 节点 2 和节点 8 的最近公共祖先是 6。
+
示例 2:
-输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4
-输出: 2
-解释: 节点 2 和节点 4 的最近公共祖先是 2, 因为根据定义最近公共祖先节点可以为节点本身。
+* 输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4
+* 输出: 2
+* 解释: 节点 2 和节点 4 的最近公共祖先是 2, 因为根据定义最近公共祖先节点可以为节点本身。
说明:
@@ -36,7 +37,9 @@
* 所有节点的值都是唯一的。
* p、q 为不同节点且均存在于给定的二叉搜索树中。
-## 思路
+# 思路
+
+
做过[二叉树:公共祖先问题](https://programmercarl.com/0236.二叉树的最近公共祖先.html)题目的同学应该知道,利用回溯从底向上搜索,遇到一个节点的左子树里有p,右子树里有q,那么当前节点就是最近公共祖先。
@@ -58,6 +61,7 @@
可以看出直接按照指定的方向,就可以找到节点4,为最近公共祖先,而且不需要遍历整棵树,找到结果直接返回!
+## 递归法
递归三部曲如下:
@@ -111,7 +115,6 @@ if (cur->val > p->val && cur->val > q->val) {
```
if (递归函数(root->left)) return ;
-
if (递归函数(root->right)) return ;
```
@@ -128,7 +131,7 @@ left与right的逻辑处理;
如果 cur->val 小于 p->val,同时 cur->val 小于 q->val,那么就应该向右遍历(目标区间在右子树)。
-```
+```CPP
if (cur->val < p->val && cur->val < q->val) {
TreeNode* right = traversal(cur->right, p, q);
if (right != NULL) {
@@ -140,9 +143,9 @@ if (cur->val < p->val && cur->val < q->val) {
剩下的情况,就是cur节点在区间(p->val <= cur->val && cur->val <= q->val)或者 (q->val <= cur->val && cur->val <= p->val)中,那么cur就是最近公共祖先了,直接返回cur。
代码如下:
+
```
return cur;
-
```
那么整体递归代码如下:
@@ -216,7 +219,7 @@ public:
灵魂拷问:是不是又被简单的迭代法感动到痛哭流涕?
-## 总结
+# 总结
对于二叉搜索树的最近祖先问题,其实要比[普通二叉树公共祖先问题](https://programmercarl.com/0236.二叉树的最近公共祖先.html)简单的多。
@@ -225,10 +228,15 @@ public:
最后给出了对应的迭代法,二叉搜索树的迭代法甚至比递归更容易理解,也是因为其有序性(自带方向性),按照目标区间找就行了。
-## 其他语言版本
+# 其他语言版本
+
+## Java
-Java:
+递归法:
+
+
+迭代法:
```java
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
@@ -246,15 +254,11 @@ class Solution {
}
```
-Python:
-```python
-# Definition for a binary tree node.
-# class TreeNode:
-# def __init__(self, x):
-# self.val = x
-# self.left = None
-# self.right = None
+## Python
+
+递归法:
+```python
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
if not root: return root //中
@@ -264,18 +268,14 @@ class Solution:
return self.lowestCommonAncestor(root.right,p,q) //右
else: return root
```
-Go:
-> BSL法
+迭代法:
+
+
+## Go
+
+递归法:
```go
-/**
- * Definition for a binary tree node.
- * type TreeNode struct {
- * Val int
- * Left *TreeNode
- * Right *TreeNode
- * }
- */
//利用BSL的性质(前序遍历有序)
func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode {
if root==nil{return nil}
@@ -287,34 +287,10 @@ func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode {
}
```
-> 普通法
-```go
-/**
- * Definition for a binary tree node.
- * type TreeNode struct {
- * Val int
- * Left *TreeNode
- * Right *TreeNode
- * }
- */
-//递归会将值层层返回
-func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode {
- //终止条件
- if root==nil||root.Val==p.Val||root.Val==q.Val{return root}//最后为空或者找到一个值时,就返回这个值
- //后序遍历
- findLeft:=lowestCommonAncestor(root.Left,p,q)
- findRight:=lowestCommonAncestor(root.Right,p,q)
- //处理单层逻辑
- if findLeft!=nil&&findRight!=nil{return root}//说明在root节点的两边
- if findLeft==nil{//左边没找到,就说明在右边找到了
- return findRight
- }else {return findLeft}
-}
-```
+## JavaScript
-JavaScript版本:
-1. 使用递归的方法
+递归法:
```javascript
var lowestCommonAncestor = function(root, p, q) {
// 使用递归的方法
@@ -336,7 +312,8 @@ var lowestCommonAncestor = function(root, p, q) {
return root;
};
```
-2. 使用迭代的方法
+
+迭代法
```javascript
var lowestCommonAncestor = function(root, p, q) {
// 使用迭代的方法
@@ -355,7 +332,6 @@ var lowestCommonAncestor = function(root, p, q) {
```
-
-----------------------
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
* B站视频:[代码随想录](https://space.bilibili.com/525438321)
diff --git "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md" "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md"
index 1943237173..2bcded7063 100644
--- "a/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md"
+++ "b/problems/\350\203\214\345\214\205\347\220\206\350\256\272\345\237\272\347\241\20001\350\203\214\345\214\205-1.md"
@@ -137,7 +137,7 @@ dp[0][j] 和 dp[i][0] 都已经初始化了,那么其他下标应该初始化
```
// 初始化 dp
-vector> dp(weight.size() + 1, vector(bagWeight + 1, 0));
+vector> dp(weight.size(), vector(bagWeight + 1, 0));
for (int j = weight[0]; j <= bagWeight; j++) {
dp[0][j] = value[0];
}
From 617499f4f8ba93078a27bdd244a3623e97056b51 Mon Sep 17 00:00:00 2001
From: wjjiang <48505670+Spongecaptain@users.noreply.github.com>
Date: Tue, 31 Aug 2021 11:10:14 +0800
Subject: [PATCH 0141/3468] =?UTF-8?q?Update=200115.=E4=B8=8D=E5=90=8C?=
=?UTF-8?q?=E7=9A=84=E5=AD=90=E5=BA=8F=E5=88=97.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
添加 Go 语言版本
---
...04\345\255\220\345\272\217\345\210\227.md" | 24 +++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md" "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md"
index a5162ae036..908682dd4c 100644
--- "a/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md"
+++ "b/problems/0115.\344\270\215\345\220\214\347\232\204\345\255\220\345\272\217\345\210\227.md"
@@ -221,6 +221,30 @@ class SolutionDP2:
```
Go:
+```go
+func numDistinct(s string, t string) int {
+ dp:= make([][]int,len(s)+1)
+ for i:=0;i
Date: Tue, 31 Aug 2021 11:40:29 +0800
Subject: [PATCH 0142/3468] =?UTF-8?q?Update=200583.=E4=B8=A4=E4=B8=AA?=
=?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=E7=9A=84=E5=88=A0=E9=99=A4=E6=93=8D?=
=?UTF-8?q?=E4=BD=9C.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
添加 Go 版本
---
...40\351\231\244\346\223\215\344\275\234.md" | 32 ++++++++++++++++++-
1 file changed, 31 insertions(+), 1 deletion(-)
diff --git "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md" "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md"
index 89a8f57cd2..91b07ca955 100644
--- "a/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md"
+++ "b/problems/0583.\344\270\244\344\270\252\345\255\227\347\254\246\344\270\262\347\232\204\345\210\240\351\231\244\346\223\215\344\275\234.md"
@@ -147,8 +147,38 @@ class Solution:
```
Go:
+```go
+func minDistance(word1 string, word2 string) int {
+ dp := make([][]int, len(word1)+1)
+ for i := 0; i < len(dp); i++ {
+ dp[i] = make([]int, len(word2)+1)
+ }
+ //初始化
+ for i := 0; i < len(dp); i++ {
+ dp[i][0] = i
+ }
+ for j := 0; j < len(dp[0]); j++ {
+ dp[0][j] = j
+ }
+ for i := 1; i < len(dp); i++ {
+ for j := 1; j < len(dp[i]); j++ {
+ if word1[i-1] == word2[j-1] {
+ dp[i][j] = dp[i-1][j-1]
+ } else {
+ dp[i][j] = min(min(dp[i-1][j]+1, dp[i][j-1]+1), dp[i-1][j-1]+2)
+ }
+ }
+ }
+ return dp[len(dp)-1][len(dp[0])-1]
+}
-
+func min(a, b int) int {
+ if a < b {
+ return a
+ }
+ return b
+}
+```
Javascript:
```javascript
const minDistance = (word1, word2) => {
From 3e34ff114a3716d1548065348b5d3bc9d5f0199e Mon Sep 17 00:00:00 2001
From: ArthurP
Date: Tue, 31 Aug 2021 12:22:13 +0800
Subject: [PATCH 0143/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200077.=E7=BB=84?=
=?UTF-8?q?=E5=90=88.md=20C=E8=AF=AD=E8=A8=80=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
"problems/0077.\347\273\204\345\220\210.md" | 53 +++++++++++++++++++++
1 file changed, 53 insertions(+)
diff --git "a/problems/0077.\347\273\204\345\220\210.md" "b/problems/0077.\347\273\204\345\220\210.md"
index 01d1a5375e..9b44b572f2 100644
--- "a/problems/0077.\347\273\204\345\220\210.md"
+++ "b/problems/0077.\347\273\204\345\220\210.md"
@@ -435,6 +435,59 @@ func backtrack(n,k,start int,track []int){
}
```
+C:
+```c
+int* path;
+int pathTop;
+int** ans;
+int ansTop;
+
+void backtracking(int n, int k,int startIndex) {
+ //当path中元素个数为k个时,我们需要将path数组放入ans二维数组中
+ if(pathTop == k) {
+ //path数组为我们动态申请,若直接将其地址放入二维数组,path数组中的值会随着我们回溯而逐渐变化
+ //因此创建新的数组存储path中的值
+ int* temp = (int*)malloc(sizeof(int) * k);
+ int i;
+ for(i = 0; i < k; i++) {
+ temp[i] = path[i];
+ }
+ ans[ansTop++] = temp;
+ return ;
+ }
+
+ int j;
+ for(j = startIndex; j <=n ;j++) {
+ //将当前结点放入path数组
+ path[pathTop++] = j;
+ //进行递归
+ backtracking(n, k, j + 1);
+ //进行回溯,将数组最上层结点弹出
+ pathTop--;
+ }
+}
+
+int** combine(int n, int k, int* returnSize, int** returnColumnSizes){
+ //path数组存储符合条件的结果
+ path = (int*)malloc(sizeof(int) * k);
+ //ans二维数组存储符合条件的结果数组的集合。(数组足够大,避免极端情况)
+ ans = (int**)malloc(sizeof(int*) * 10000);
+ pathTop = ansTop = 0;
+
+ //回溯算法
+ backtracking(n, k, 1);
+ //最后的返回大小为ans数组大小
+ *returnSize = ansTop;
+ //returnColumnSizes数组存储ans二维数组对应下标中一维数组的长度(都为k)
+ *returnColumnSizes = (int*)malloc(sizeof(int) *(*returnSize));
+ int i;
+ for(i = 0; i < *returnSize; i++) {
+ (*returnColumnSizes)[i] = k;
+ }
+ //返回ans二维数组
+ return ans;
+}
+```
-----------------------
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
From 14aee4922bc43138b18f10ce52eb521706749b7b Mon Sep 17 00:00:00 2001
From: ArthurP
Date: Tue, 31 Aug 2021 12:32:20 +0800
Subject: [PATCH 0144/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200027.=E7=A7=BB?=
=?UTF-8?q?=E9=99=A4=E5=85=83=E7=B4=A0.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
---
...\273\351\231\244\345\205\203\347\264\240.md" | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md"
index e3b75719df..886ce4f2ca 100644
--- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md"
+++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md"
@@ -246,6 +246,23 @@ func removeElement(_ nums: inout [Int], _ val: Int) -> Int {
}
```
+C:
+```c
+int removeElement(int* nums, int numsSize, int val){
+ int slow = 0;
+ for(int fast = 0; fast < numsSize; fast++) {
+ //若快指针位置的元素不等于要删除的元素
+ if(nums[fast] != val) {
+ //将其挪到慢指针指向的位置,慢指针+1
+ nums[slow++] = nums[fast];
+ }
+ }
+ //最后慢指针的大小就是新的数组的大小
+ return slow;
+}
+
+```
+
-----------------------
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
* B站视频:[代码随想录](https://space.bilibili.com/525438321)
From d65afddc9189f1644237aca61cfb77f69dcb8292 Mon Sep 17 00:00:00 2001
From: ArthurP
Date: Tue, 31 Aug 2021 12:34:01 +0800
Subject: [PATCH 0145/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200027.=E7=A7=BB?=
=?UTF-8?q?=E9=99=A4=E5=85=83=E7=B4=A0.md=20C=E8=AF=AD=E8=A8=80=E6=B3=A8?=
=?UTF-8?q?=E9=87=8A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" | 1 -
1 file changed, 1 deletion(-)
diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md"
index 886ce4f2ca..ff50d511e5 100644
--- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md"
+++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md"
@@ -260,7 +260,6 @@ int removeElement(int* nums, int numsSize, int val){
//最后慢指针的大小就是新的数组的大小
return slow;
}
-
```
-----------------------
From 29876fbdee24c4cd3e10faefca2fd1f8a70664ff Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9E=81=E5=AE=A2=E5=AD=A6=E4=BC=9F?=
Date: Tue, 31 Aug 2021 13:02:33 +0800
Subject: [PATCH 0146/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=201002.=20?=
=?UTF-8?q?=E6=9F=A5=E6=89=BE=E5=B8=B8=E7=94=A8=E5=AD=97=E7=AC=A6=20Swift?=
=?UTF-8?q?=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...70\347\224\250\345\255\227\347\254\246.md" | 41 +++++++++++++++++++
1 file changed, 41 insertions(+)
diff --git "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md"
index f7d323aa28..c0ca578e00 100644
--- "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md"
+++ "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md"
@@ -268,6 +268,47 @@ func min(a,b int)int{
return a
}
```
+
+Swift:
+```swift
+func commonChars(_ words: [String]) -> [String] {
+ var res = [String]()
+ if words.count < 1 {
+ return res
+ }
+ let aUnicodeScalarValue = "a".unicodeScalars.first!.value
+ let lettersMaxCount = 26
+ // 用于统计所有字符串每个字母出现的 最小 频率
+ var hash = Array(repeating: 0, count: lettersMaxCount)
+ // 统计第一个字符串每个字母出现的次数
+ for unicodeScalar in words.first!.unicodeScalars {
+ hash[Int(unicodeScalar.value - aUnicodeScalarValue)] += 1
+ }
+ // 统计除第一个字符串每个字母出现的次数
+ for idx in 1 ..< words.count {
+ var hashOtherStr = Array(repeating: 0, count: lettersMaxCount)
+ for unicodeScalar in words[idx].unicodeScalars {
+ hashOtherStr[Int(unicodeScalar.value - aUnicodeScalarValue)] += 1
+ }
+ // 更新hash,保证hash里统计的字母为出现的最小频率
+ for k in 0 ..< lettersMaxCount {
+ hash[k] = min(hash[k], hashOtherStr[k])
+ }
+ }
+ // 将hash统计的字符次数,转成输出形式
+ for i in 0 ..< lettersMaxCount {
+ while hash[i] != 0 { // 注意这里是while,多个重复的字符
+ let currentUnicodeScalarValue: UInt32 = UInt32(i) + aUnicodeScalarValue
+ let currentUnicodeScalar: UnicodeScalar = UnicodeScalar(currentUnicodeScalarValue)!
+ let outputStr = String(currentUnicodeScalar) // UnicodeScalar -> String
+ res.append(outputStr)
+ hash[i] -= 1
+ }
+ }
+ return res
+}
+```
+
-----------------------
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
* B站视频:[代码随想录](https://space.bilibili.com/525438321)
From 55753bb5580e9a25a6af1e9cc10834156bf149b7 Mon Sep 17 00:00:00 2001
From: Asterisk <44215173+GHumorBS@users.noreply.github.com>
Date: Tue, 31 Aug 2021 14:30:39 +0800
Subject: [PATCH 0147/3468] =?UTF-8?q?Update=200232.=E7=94=A8=E6=A0=88?=
=?UTF-8?q?=E5=AE=9E=E7=8E=B0=E9=98=9F=E5=88=97.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Python 更新:
1. 更新前版本的self.pop()语法错误
2. 更新后C++范例逻辑趋于统一
---
...36\347\216\260\351\230\237\345\210\227.md" | 23 +++++++------------
1 file changed, 8 insertions(+), 15 deletions(-)
diff --git "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md"
index a4a73603f6..9f6bb90f44 100644
--- "a/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md"
+++ "b/problems/0232.\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md"
@@ -205,33 +205,26 @@ class MyQueue:
def pop(self) -> int:
"""
- 1. 检查如果out里面元素,则直接pop
- 2. 如果out没有元素,就把in里面的元素(除了第一个)依次pop后装进out里面
- 3. 直接把in剩下的元素pop出来,就是queue头部的
+ Removes the element from in front of queue and returns that element.
"""
- if self.empty:
+ if self.empty():
return None
if self.stack_out:
return self.stack_out.pop()
else:
- for i in range(1, len(self.stack_in)):
+ for i in range(len(self.stack_in)):
self.stack_out.append(self.stack_in.pop())
- return self.stack_in.pop()
+ return self.stack_out.pop()
def peek(self) -> int:
"""
- 1. 查out有没有元素,有就把最上面的返回
- 2. 如果out没有元素,就把in最下面的返回
+ Get the front element.
"""
- if self.empty:
- return None
-
- if self.stack_out:
- return self.stack_out[-1]
- else:
- return self.stack_in[0]
+ ans = self.pop()
+ self.stack_out.append(ans)
+ return ans
def empty(self) -> bool:
From f172c95e882e4eb8cc13636469588f81c5695bc4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9E=81=E5=AE=A2=E5=AD=A6=E4=BC=9F?=
Date: Tue, 31 Aug 2021 14:36:45 +0800
Subject: [PATCH 0148/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E7=AC=AC202?=
=?UTF-8?q?=E9=A2=98.=20=E5=BF=AB=E4=B9=90=E6=95=B0=20Swift=E7=89=88?=
=?UTF-8?q?=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...2.\345\277\253\344\271\220\346\225\260.md" | 32 ++++++++++++++++++-
1 file changed, 31 insertions(+), 1 deletion(-)
diff --git "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" "b/problems/0202.\345\277\253\344\271\220\346\225\260.md"
index b9386a68d9..e6365c7101 100644
--- "a/problems/0202.\345\277\253\344\271\220\346\225\260.md"
+++ "b/problems/0202.\345\277\253\344\271\220\346\225\260.md"
@@ -191,7 +191,37 @@ var isHappy = function(n) {
};
```
-
+Swift:
+```swift
+// number 每个位置上的数字的平方和
+func getSum(_ number: Int) -> Int {
+ var sum = 0
+ var num = number
+ while num > 0 {
+ let temp = num % 10
+ sum += (temp * temp)
+ num /= 10
+ }
+ return sum
+}
+func isHappy(_ n: Int) -> Bool {
+ var set = Set()
+ var num = n
+ while true {
+ let sum = self.getSum(num)
+ if sum == 1 {
+ return true
+ }
+ // 如果这个sum曾经出现过,说明已经陷入了无限循环了
+ if set.contains(sum) {
+ return false
+ } else {
+ set.insert(sum)
+ }
+ num = sum
+ }
+}
+```
-----------------------
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
From 71a24c5dd88a48d518a3be11ab9b68785c5dc66a Mon Sep 17 00:00:00 2001
From: baici1 <249337001@qq.com>
Date: Tue, 31 Aug 2021 15:57:51 +0800
Subject: [PATCH 0149/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0225.=20=E7=94=A8?=
=?UTF-8?q?=E9=98=9F=E5=88=97=E5=AE=9E=E7=8E=B0=E6=A0=88=20go=E7=89=88?=
=?UTF-8?q?=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...27\345\256\236\347\216\260\346\240\210.md" | 65 +++++++++++++++++++
1 file changed, 65 insertions(+)
diff --git "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md"
index afa563e3ed..8d4db95335 100644
--- "a/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md"
+++ "b/problems/0225.\347\224\250\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md"
@@ -359,6 +359,71 @@ class MyStack:
Go:
+```go
+type MyStack struct {
+ queue []int//创建一个队列
+}
+
+
+/** Initialize your data structure here. */
+func Constructor() MyStack {
+ return MyStack{ //初始化
+ queue:make([]int,0),
+ }
+}
+
+
+/** Push element x onto stack. */
+func (this *MyStack) Push(x int) {
+ //添加元素
+ this.queue=append(this.queue,x)
+}
+
+
+/** Removes the element on top of the stack and returns that element. */
+func (this *MyStack) Pop() int {
+ n:=len(this.queue)-1//判断长度
+ for n!=0{ //除了最后一个,其余的都重新添加到队列里
+ val:=this.queue[0]
+ this.queue=this.queue[1:]
+ this.queue=append(this.queue,val)
+ n--
+ }
+ //弹出元素
+ val:=this.queue[0]
+ this.queue=this.queue[1:]
+ return val
+
+}
+
+
+/** Get the top element. */
+func (this *MyStack) Top() int {
+ //利用Pop函数,弹出来的元素重新添加
+ val:=this.Pop()
+ this.queue=append(this.queue,val)
+ return val
+}
+
+
+/** Returns whether the stack is empty. */
+func (this *MyStack) Empty() bool {
+ return len(this.queue)==0
+}
+
+
+/**
+ * Your MyStack object will be instantiated and called as such:
+ * obj := Constructor();
+ * obj.Push(x);
+ * param_2 := obj.Pop();
+ * param_3 := obj.Top();
+ * param_4 := obj.Empty();
+ */
+```
+
+
+
javaScript:
使用数组(push, shift)模拟队列
From 9d1983fd02c428babb8809706744caa06bf4e57b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9E=81=E5=AE=A2=E5=AD=A6=E4=BC=9F?=
Date: Wed, 1 Sep 2021 14:45:25 +0800
Subject: [PATCH 0150/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=201.=20=E4=B8=A4?=
=?UTF-8?q?=E6=95=B0=E4=B9=8B=E5=92=8C=20Swift=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...\244\346\225\260\344\271\213\345\222\214.md" | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md"
index fd17af6246..f12b5869ed 100644
--- "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md"
+++ "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md"
@@ -206,6 +206,23 @@ function twoSum(array $nums, int $target): array
}
```
+Swift:
+```swift
+func twoSum(_ nums: [Int], _ target: Int) -> [Int] {
+ var res = [Int]()
+ var dict = [Int : Int]()
+ for i in 0 ..< nums.count {
+ let other = target - nums[i]
+ if dict.keys.contains(other) {
+ res.append(i)
+ res.append(dict[other]!)
+ return res
+ }
+ dict[nums[i]] = i
+ }
+ return res
+}
+```
-----------------------
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
From 4926d659a7937c880e631c4cde4f017d7e3e193e Mon Sep 17 00:00:00 2001
From: YusenAi <59075298+Aitensa@users.noreply.github.com>
Date: Wed, 1 Sep 2021 16:39:46 +0800
Subject: [PATCH 0151/3468] =?UTF-8?q?Update=200714.=E4=B9=B0=E5=8D=96?=
=?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?=E5=90=AB=E6=89=8B=E7=BB=AD=E8=B4=B9=EF=BC=88=E5=8A=A8=E6=80=81?=
=?UTF-8?q?=E8=A7=84=E5=88=92=EF=BC=89.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...201\350\247\204\345\210\222\357\274\211.md" | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md"
index 50db8868cd..b854c65c80 100644
--- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md"
+++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md"
@@ -152,6 +152,24 @@ class Solution:
```
Go:
+```Go
+func maxProfit(prices []int, fee int) int {
+ n := len(prices)
+ dp := make([][2]int, n)
+ dp[0][0] = -prices[0]
+ for i := 1; i < n; i++ {
+ dp[i][1] = max(dp[i-1][1], dp[i-1][0]+prices[i]-fee)
+ dp[i][0] = max(dp[i-1][0], dp[i-1][1]-prices[i])
+ }
+ return dp[n-1][1]
+}
+func max(a, b int) int {
+ if a > b {
+ return a
+ }
+ return b
+}
+```
Javascript:
```javascript
From e6fdf1023336647471c122b68779e34a2ee2facd Mon Sep 17 00:00:00 2001
From: YusenAi <59075298+Aitensa@users.noreply.github.com>
Date: Wed, 1 Sep 2021 16:45:15 +0800
Subject: [PATCH 0152/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200714.=E4=B9=B0?=
=?UTF-8?q?=E5=8D=96=E8=82=A1=E7=A5=A8=E7=9A=84=E6=9C=80=E4=BD=B3=E6=97=B6?=
=?UTF-8?q?=E6=9C=BA=E5=90=AB=E6=89=8B=E7=BB=AD=E8=B4=B9=EF=BC=88=E5=8A=A8?=
=?UTF-8?q?=E6=80=81=E8=A7=84=E5=88=92=EF=BC=89.md=20Go=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...5\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" | 1 +
1 file changed, 1 insertion(+)
diff --git "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md" "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md"
index b854c65c80..7c54a2fe1b 100644
--- "a/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md"
+++ "b/problems/0714.\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271\357\274\210\345\212\250\346\200\201\350\247\204\345\210\222\357\274\211.md"
@@ -163,6 +163,7 @@ func maxProfit(prices []int, fee int) int {
}
return dp[n-1][1]
}
+
func max(a, b int) int {
if a > b {
return a
From 325a09cee71a83261ba037f29eb27bb4f0b2522e Mon Sep 17 00:00:00 2001
From: nolanzzz
Date: Wed, 1 Sep 2021 18:44:41 -0400
Subject: [PATCH 0153/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A00704=E4=BA=8C?=
=?UTF-8?q?=E5=88=86=E6=9F=A5=E6=89=BEPHP=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...14\345\210\206\346\237\245\346\211\276.md" | 32 +++++++++++++++++++
1 file changed, 32 insertions(+)
diff --git "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md" "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md"
index 495f736753..f358d2beee 100644
--- "a/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md"
+++ "b/problems/0704.\344\272\214\345\210\206\346\237\245\346\211\276.md"
@@ -478,6 +478,38 @@ int search(int* nums, int numsSize, int target){
}
```
+**PHP:**
+```php
+// 左闭右闭区间
+class Solution {
+ /**
+ * @param Integer[] $nums
+ * @param Integer $target
+ * @return Integer
+ */
+ function search($nums, $target) {
+ if (count($nums) == 0) {
+ return -1;
+ }
+ $left = 0;
+ $right = count($nums) - 1;
+ while ($left <= $right) {
+ $mid = floor(($left + $right) / 2);
+ if ($nums[$mid] == $target) {
+ return $mid;
+ }
+ if ($nums[$mid] > $target) {
+ $right = $mid - 1;
+ }
+ else {
+ $left = $mid + 1;
+ }
+ }
+ return -1;
+ }
+}
+```
+
-----------------------
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
* B站视频:[代码随想录](https://space.bilibili.com/525438321)
From 3441bced1289c183f9e05b005c1a67a4971014a2 Mon Sep 17 00:00:00 2001
From: nolanzzz
Date: Wed, 1 Sep 2021 18:56:34 -0400
Subject: [PATCH 0154/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200027.=E7=A7=BB?=
=?UTF-8?q?=E9=99=A4=E5=85=83=E7=B4=A0=20PHP=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...73\351\231\244\345\205\203\347\264\240.md" | 25 +++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md" "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md"
index e3b75719df..7976dce3c3 100644
--- "a/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md"
+++ "b/problems/0027.\347\247\273\351\231\244\345\205\203\347\264\240.md"
@@ -246,6 +246,31 @@ func removeElement(_ nums: inout [Int], _ val: Int) -> Int {
}
```
+PHP:
+```php
+class Solution {
+ /**
+ * @param Integer[] $nums
+ * @param Integer $val
+ * @return Integer
+ */
+ function removeElement(&$nums, $val) {
+ if (count($nums) == 0) {
+ return 0;
+ }
+ // 快慢指针
+ $slow = 0;
+ for ($fast = 0; $fast < count($nums); $fast++) {
+ if ($nums[$fast] != $val) {
+ $nums[$slow] = $nums[$fast];
+ $slow++;
+ }
+ }
+ return $slow;
+ }
+}
+```
+
-----------------------
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
* B站视频:[代码随想录](https://space.bilibili.com/525438321)
From 484491f840566ad219ee1505f13e8de355a11429 Mon Sep 17 00:00:00 2001
From: nolanzzz
Date: Wed, 1 Sep 2021 19:02:40 -0400
Subject: [PATCH 0155/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200977.=E6=9C=89?=
=?UTF-8?q?=E5=BA=8F=E6=95=B0=E7=BB=84=E7=9A=84=E5=B9=B3=E6=96=B9=20PHP?=
=?UTF-8?q?=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...04\347\232\204\345\271\263\346\226\271.md" | 27 +++++++++++++++++++
1 file changed, 27 insertions(+)
diff --git "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md"
index 131428531b..250234e1a7 100644
--- "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md"
+++ "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md"
@@ -270,6 +270,33 @@ def sorted_squares(nums)
end
```
+PHP:
+```php
+class Solution {
+ /**
+ * @param Integer[] $nums
+ * @return Integer[]
+ */
+ function sortedSquares($nums) {
+ $res = [];
+ for ($i = 0; $i < count($nums); $i++) {
+ $res[$i] = 0;
+ }
+ $k = count($nums) - 1;
+ for ($i = 0, $j = count($nums) - 1; $i <= $j; ) {
+ if ($nums[$i] ** 2 < $nums[$j] ** 2) {
+ $res[$k--] = $nums[$j] ** 2;
+ $j--;
+ }
+ else {
+ $res[$k--] = $nums[$i] ** 2;
+ $i++;
+ }
+ }
+ return $res;
+ }
+}
+```
-----------------------
From efda64220ff36302999fb24b3e850262363ef76b Mon Sep 17 00:00:00 2001
From: nolanzzz
Date: Wed, 1 Sep 2021 19:03:48 -0400
Subject: [PATCH 0156/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200977.=E6=9C=89?=
=?UTF-8?q?=E5=BA=8F=E6=95=B0=E7=BB=84=E7=9A=84=E5=B9=B3=E6=96=B9=20PHP?=
=?UTF-8?q?=E7=89=88=E6=9C=AC=E6=B3=A8=E9=87=8A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...6\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" | 1 +
1 file changed, 1 insertion(+)
diff --git "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md"
index 250234e1a7..a10afbfb04 100644
--- "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md"
+++ "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md"
@@ -278,6 +278,7 @@ class Solution {
* @return Integer[]
*/
function sortedSquares($nums) {
+ // 双指针法
$res = [];
for ($i = 0; $i < count($nums); $i++) {
$res[$i] = 0;
From a6a8dc080647bfe243824a7990f346941f5aa128 Mon Sep 17 00:00:00 2001
From: nolanzzz
Date: Wed, 1 Sep 2021 19:05:54 -0400
Subject: [PATCH 0157/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200209.=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?=20PHP=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...04\345\255\220\346\225\260\347\273\204.md" | 28 +++++++++++++++++++
1 file changed, 28 insertions(+)
diff --git "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md" "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md"
index ceca8c8739..7c3fd0e70d 100644
--- "a/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md"
+++ "b/problems/0209.\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204.md"
@@ -264,6 +264,34 @@ impl Solution {
}
```
+PHP:
+```php
+// 双指针 - 滑动窗口
+class Solution {
+ /**
+ * @param Integer $target
+ * @param Integer[] $nums
+ * @return Integer
+ */
+ function minSubArrayLen($target, $nums) {
+ if (count($nums) < 1) {
+ return 0;
+ }
+ $sum = 0;
+ $res = PHP_INT_MAX;
+ $left = 0;
+ for ($right = 0; $right < count($nums); $right++) {
+ $sum += $nums[$right];
+ while ($sum >= $target) {
+ $res = min($res, $right - $left + 1);
+ $sum -= $nums[$left];
+ $left++;
+ }
+ }
+ return $res == PHP_INT_MAX ? 0 : $res;
+ }
+}
+```
-----------------------
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
From e8851b049069734f3f7c8b03ef5c8a2e698dd25b Mon Sep 17 00:00:00 2001
From: nolanzzz
Date: Wed, 1 Sep 2021 19:08:21 -0400
Subject: [PATCH 0158/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200059.=E8=9E=BA?=
=?UTF-8?q?=E6=97=8B=E7=9F=A9=E9=98=B5II=20PHP=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...\346\227\213\347\237\251\351\230\265II.md" | 42 +++++++++++++++++++
1 file changed, 42 insertions(+)
diff --git "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md" "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md"
index 4231fb3968..3dbc2a50d7 100644
--- "a/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md"
+++ "b/problems/0059.\350\236\272\346\227\213\347\237\251\351\230\265II.md"
@@ -426,6 +426,48 @@ impl Solution {
}
```
+PHP:
+```php
+class Solution {
+ /**
+ * @param Integer $n
+ * @return Integer[][]
+ */
+ function generateMatrix($n) {
+ // 初始化数组
+ $res = array_fill(0, $n, array_fill(0, $n, 0));
+ $mid = $loop = floor($n / 2);
+ $startX = $startY = 0;
+ $offset = 1;
+ $count = 1;
+ while ($loop > 0) {
+ $i = $startX;
+ $j = $startY;
+ for (; $j < $startY + $n - $offset; $j++) {
+ $res[$i][$j] = $count++;
+ }
+ for (; $i < $startX + $n - $offset; $i++) {
+ $res[$i][$j] = $count++;
+ }
+ for (; $j > $startY; $j--) {
+ $res[$i][$j] = $count++;
+ }
+ for (; $i > $startX; $i--) {
+ $res[$i][$j] = $count++;
+ }
+ $startX += 1;
+ $startY += 1;
+ $offset += 2;
+ $loop--;
+ }
+ if ($n % 2 == 1) {
+ $res[$mid][$mid] = $count;
+ }
+ return $res;
+ }
+}
+```
+
-----------------------
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
From dd11a104a48b4d63e8c479670fc38e26f70cb802 Mon Sep 17 00:00:00 2001
From: martisss <2466632626@qq.com>
Date: Thu, 2 Sep 2021 11:27:27 +0800
Subject: [PATCH 0159/3468] =?UTF-8?q?=E5=A2=9E=E5=8A=A0530=E4=BA=8C?=
=?UTF-8?q?=E5=8F=89=E6=90=9C=E7=B4=A2=E6=A0=91=E7=9A=84=E6=9C=80=E5=B0=8F?=
=?UTF-8?q?=E7=BB=9D=E5=AF=B9=E5=B7=AE.md=20js=E9=80=92=E5=BD=92=E4=B8=8E?=
=?UTF-8?q?=E8=BF=AD=E4=BB=A3=E8=A7=A3=E6=B3=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...17\347\273\235\345\257\271\345\267\256.md" | 43 ++++++++++++++++++-
1 file changed, 42 insertions(+), 1 deletion(-)
diff --git "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md" "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md"
index 46f6b7960d..ae6719ec66 100644
--- "a/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md"
+++ "b/problems/0530.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\234\200\345\260\217\347\273\235\345\257\271\345\267\256.md"
@@ -265,7 +265,7 @@ func getMinimumDifference(root *TreeNode) int {
```
## JavaScript
-
+递归 先转换为有序数组
```javascript
/**
* Definition for a binary tree node.
@@ -297,6 +297,47 @@ var getMinimumDifference = function (root) {
return diff;
};
```
+递归 在递归的过程中更新最小值
+```js
+var getMinimumDifference = function(root) {
+ let res = Infinity
+ let preNode = null
+ // 中序遍历
+ const inorder = (node) => {
+ if(!node) return
+ inorder(node.left)
+ // 更新res
+ if(preNode) res = Math.min(res, node.val - preNode.val)
+ // 记录前一个节点
+ preNode = node
+ inorder(node.right)
+ }
+ inorder(root)
+ return res
+}
+```
+
+迭代 中序遍历
+```js
+var getMinimumDifference = function(root) {
+ let stack = []
+ let cur = root
+ let res = Infinity
+ let pre = null
+ while(cur || stack.length) {
+ if(cur) {
+ stack.push(cur)
+ cur = cur.left
+ } else {
+ cur = stack.pop()
+ if(pre) res = Math.min(res, cur.val - pre.val)
+ pre = cur
+ cur = cur.right
+ }
+ }
+ return res
+}
+```
-----------------------
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
From 6886111727e91ee5a616d9e1056a6be3447991a1 Mon Sep 17 00:00:00 2001
From: ArthurP
Date: Thu, 2 Sep 2021 12:17:45 +0800
Subject: [PATCH 0160/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200077.=E7=BB=84?=
=?UTF-8?q?=E5=90=88=E4=BC=98=E5=8C=96.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
---
...04\345\220\210\344\274\230\345\214\226.md" | 51 +++++++++++++++++++
1 file changed, 51 insertions(+)
diff --git "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md" "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md"
index 171023dddc..136ceb345f 100644
--- "a/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md"
+++ "b/problems/0077.\347\273\204\345\220\210\344\274\230\345\214\226.md"
@@ -242,8 +242,59 @@ var combine = function(n, k) {
};
```
+C:
+```c
+int* path;
+int pathTop;
+int** ans;
+int ansTop;
+
+void backtracking(int n, int k,int startIndex) {
+ //当path中元素个数为k个时,我们需要将path数组放入ans二维数组中
+ if(pathTop == k) {
+ //path数组为我们动态申请,若直接将其地址放入二维数组,path数组中的值会随着我们回溯而逐渐变化
+ //因此创建新的数组存储path中的值
+ int* temp = (int*)malloc(sizeof(int) * k);
+ int i;
+ for(i = 0; i < k; i++) {
+ temp[i] = path[i];
+ }
+ ans[ansTop++] = temp;
+ return ;
+ }
+
+ int j;
+ for(j = startIndex; j <= n- (k - pathTop) + 1;j++) {
+ //将当前结点放入path数组
+ path[pathTop++] = j;
+ //进行递归
+ backtracking(n, k, j + 1);
+ //进行回溯,将数组最上层结点弹出
+ pathTop--;
+ }
+}
+int** combine(int n, int k, int* returnSize, int** returnColumnSizes){
+ //path数组存储符合条件的结果
+ path = (int*)malloc(sizeof(int) * k);
+ //ans二维数组存储符合条件的结果数组的集合。(数组足够大,避免极端情况)
+ ans = (int**)malloc(sizeof(int*) * 10000);
+ pathTop = ansTop = 0;
+ //回溯算法
+ backtracking(n, k, 1);
+ //最后的返回大小为ans数组大小
+ *returnSize = ansTop;
+ //returnColumnSizes数组存储ans二维数组对应下标中一维数组的长度(都为k)
+ *returnColumnSizes = (int*)malloc(sizeof(int) *(*returnSize));
+ int i;
+ for(i = 0; i < *returnSize; i++) {
+ (*returnColumnSizes)[i] = k;
+ }
+ //返回ans二维数组
+ return ans;
+}
+```
-----------------------
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
From 8a35955a04594b22d6ea07af06188580a5c6c9f4 Mon Sep 17 00:00:00 2001
From: ArthurP
Date: Thu, 2 Sep 2021 12:33:00 +0800
Subject: [PATCH 0161/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200977.=E6=9C=89?=
=?UTF-8?q?=E5=BA=8F=E6=95=B0=E7=BB=84=E7=9A=84=E5=B9=B3=E6=96=B9.md=20C?=
=?UTF-8?q?=E8=AF=AD=E8=A8=80=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...04\347\232\204\345\271\263\346\226\271.md" | 33 ++++++++++++++++++-
1 file changed, 32 insertions(+), 1 deletion(-)
diff --git "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md" "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md"
index 131428531b..089884fc24 100644
--- "a/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md"
+++ "b/problems/0977.\346\234\211\345\272\217\346\225\260\347\273\204\347\232\204\345\271\263\346\226\271.md"
@@ -270,7 +270,38 @@ def sorted_squares(nums)
end
```
-
+C:
+```c
+int* sortedSquares(int* nums, int numsSize, int* returnSize){
+ //返回的数组大小就是原数组大小
+ *returnSize = numsSize;
+ //创建两个指针,right指向数组最后一位元素,left指向数组第一位元素
+ int right = numsSize - 1;
+ int left = 0;
+
+ //最后要返回的结果数组
+ int* ans = (int*)malloc(sizeof(int) * numsSize);
+ int index;
+ for(index = numsSize - 1; index >= 0; index--) {
+ //左指针指向元素的平方
+ int lSquare = nums[left] * nums[left];
+ //右指针指向元素的平方
+ int rSquare = nums[right] * nums[right];
+ //若左指针指向元素平方比右指针指向元素平方大,将左指针指向元素平方放入结果数组。左指针右移一位
+ if(lSquare > rSquare) {
+ ans[index] = lSquare;
+ left++;
+ }
+ //若右指针指向元素平方比左指针指向元素平方大,将右指针指向元素平方放入结果数组。右指针左移一位
+ else {
+ ans[index] = rSquare;
+ right--;
+ }
+ }
+ //返回结果数组
+ return ans;
+}
+```
-----------------------
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
From 34e8e4d5149159c9f95b63246e59219a930b78ea Mon Sep 17 00:00:00 2001
From: YusenAi <59075298+Aitensa@users.noreply.github.com>
Date: Thu, 2 Sep 2021 13:12:36 +0800
Subject: [PATCH 0162/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200968.=E7=9B=91?=
=?UTF-8?q?=E6=8E=A7=E4=BA=8C=E5=8F=89=E6=A0=91.md=20=20Go=E7=89=88?=
=?UTF-8?q?=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...47\344\272\214\345\217\211\346\240\221.md" | 27 +++++++++++++++++++
1 file changed, 27 insertions(+)
diff --git "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md" "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md"
index 737e92a064..a5fa71a73a 100644
--- "a/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md"
+++ "b/problems/0968.\347\233\221\346\216\247\344\272\214\345\217\211\346\240\221.md"
@@ -368,7 +368,34 @@ class Solution:
return result
```
Go:
+```go
+const inf = math.MaxInt64 / 2
+
+func minCameraCover(root *TreeNode) int {
+ var dfs func(*TreeNode) (a, b, c int)
+ dfs = func(node *TreeNode) (a, b, c int) {
+ if node == nil {
+ return inf, 0, 0
+ }
+ lefta, leftb, leftc := dfs(node.Left)
+ righta, rightb, rightc := dfs(node.Right)
+ a = leftc + rightc + 1
+ b = min(a, min(lefta+rightb, righta+leftb))
+ c = min(a, leftb+rightb)
+ return
+ }
+ _, ans, _ := dfs(root)
+ return ans
+}
+func min(a, b int) int {
+ if a <= b {
+ return a
+ }
+ return b
+}
+
+```
Javascript:
```Javascript
var minCameraCover = function(root) {
From ac49e879e0c913a65e6a3955b066aafef1641bcd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9E=81=E5=AE=A2=E5=AD=A6=E4=BC=9F?=
Date: Thu, 2 Sep 2021 13:29:07 +0800
Subject: [PATCH 0163/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E7=AC=AC454?=
=?UTF-8?q?=E9=A2=98.=E5=9B=9B=E6=95=B0=E7=9B=B8=E5=8A=A0II=20Swift?=
=?UTF-8?q?=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...\346\225\260\347\233\270\345\212\240II.md" | 29 +++++++++++++++++--
1 file changed, 27 insertions(+), 2 deletions(-)
diff --git "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md"
index 4e61dc2f38..1c3f45e7a2 100644
--- "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md"
+++ "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md"
@@ -220,8 +220,33 @@ var fourSumCount = function(nums1, nums2, nums3, nums4) {
};
```
-
-
+Swift:
+```swift
+func fourSumCount(_ nums1: [Int], _ nums2: [Int], _ nums3: [Int], _ nums4: [Int]) -> Int {
+ // key:a+b的数值,value:a+b数值出现的次数
+ var map = [Int: Int]()
+ // 遍历nums1和nums2数组,统计两个数组元素之和,和出现的次数,放到map中
+ for i in 0 ..< nums1.count {
+ for j in 0 ..< nums2.count {
+ let sum1 = nums1[i] + nums2[j]
+ map[sum1] = (map[sum1] ?? 0) + 1
+ }
+ }
+ // 统计a+b+c+d = 0 出现的次数
+ var res = 0
+ // 在遍历大num3和num4数组,找到如果 0-(c+d) 在map中出现过的话,就把map中key对应的value也就是出现次数统计出来。
+ for i in 0 ..< nums3.count {
+ for j in 0 ..< nums4.count {
+ let sum2 = nums3[i] + nums4[j]
+ let other = 0 - sum2
+ if map.keys.contains(other) {
+ res += map[other]!
+ }
+ }
+ }
+ return res
+}
+```
-----------------------
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
From 186d4e4ca41d2de86e25a009bb89d454096e5405 Mon Sep 17 00:00:00 2001
From: Wen Liang
Date: Thu, 2 Sep 2021 14:06:04 +0800
Subject: [PATCH 0164/3468] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=20=E4=BA=8C?=
=?UTF-8?q?=E5=8F=89=E6=A0=91=E7=9A=84=E8=BF=AD=E4=BB=A3=E9=81=8D=E5=8E=86?=
=?UTF-8?q?.md=20=E4=B8=AD=E7=9A=84=E6=8B=BC=E5=86=99=E9=94=99=E8=AF=AF=20?=
=?UTF-8?q?=E8=B7=9F=E8=8A=82=E7=82=B9=20->=20=E6=A0=B9=E8=8A=82=E7=82=B9?=
=?UTF-8?q?=20=E4=B8=8D=E6=83=B3=20=20=20->=20=E4=B8=8D=E5=83=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...32\204\350\277\255\344\273\243\351\201\215\345\216\206.md" | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md"
index a1d65070f4..843636101c 100644
--- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md"
+++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\350\277\255\344\273\243\351\201\215\345\216\206.md"
@@ -27,7 +27,7 @@
我们先看一下前序遍历。
-前序遍历是中左右,每次先处理的是中间节点,那么先将跟节点放入栈中,然后将右孩子加入栈,再加入左孩子。
+前序遍历是中左右,每次先处理的是中间节点,那么先将根节点放入栈中,然后将右孩子加入栈,再加入左孩子。
为什么要先加入 右孩子,再加入左孩子呢? 因为这样出栈的时候才是中左右的顺序。
@@ -140,7 +140,7 @@ public:
# 总结
-此时我们用迭代法写出了二叉树的前后中序遍历,大家可以看出前序和中序是完全两种代码风格,并不想递归写法那样代码稍做调整,就可以实现前后中序。
+此时我们用迭代法写出了二叉树的前后中序遍历,大家可以看出前序和中序是完全两种代码风格,并不像递归写法那样代码稍做调整,就可以实现前后中序。
**这是因为前序遍历中访问节点(遍历节点)和处理节点(将元素放进result数组中)可以同步处理,但是中序就无法做到同步!**
From 6a6858b2e84f65ba24c684a76359b83337ff2955 Mon Sep 17 00:00:00 2001
From: baici1 <249337001@qq.com>
Date: Thu, 2 Sep 2021 15:44:01 +0800
Subject: [PATCH 0165/3468] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20347.=E5=89=8D=20?=
=?UTF-8?q?K=20=E4=B8=AA=E9=AB=98=E9=A2=91=E5=85=83=E7=B4=A0=20go=20?=
=?UTF-8?q?=E7=89=88=E6=9C=AC=E4=B8=A4=E4=B8=AA=E8=A7=A3=E6=B3=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...30\351\242\221\345\205\203\347\264\240.md" | 73 +++++++++++++++++++
1 file changed, 73 insertions(+)
diff --git "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md" "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md"
index 54be5cc4ee..6012e11813 100644
--- "a/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md"
+++ "b/problems/0347.\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240.md"
@@ -189,6 +189,79 @@ class Solution:
Go:
+```go
+//方法一:小顶堆
+func topKFrequent(nums []int, k int) []int {
+ map_num:=map[int]int{}
+ //记录每个元素出现的次数
+ for _,item:=range nums{
+ map_num[item]++
+ }
+ h:=&IHeap{}
+ heap.Init(h)
+ //所有元素入堆,堆的长度为k
+ for key,value:=range map_num{
+ heap.Push(h,[2]int{key,value})
+ if h.Len()>k{
+ heap.Pop(h)
+ }
+ }
+ res:=make([]int,k)
+ //按顺序返回堆中的元素
+ for i:=0;imap_num[ans[b]]
+ })
+ return ans[:k]
+}
+```
+
+
+
javaScript:
```js
From 15e342e00b65b61bc3846f47b972fca01267bf4a Mon Sep 17 00:00:00 2001
From: Asterisk <44215173+GHumorBS@users.noreply.github.com>
Date: Thu, 2 Sep 2021 17:15:42 +0800
Subject: [PATCH 0166/3468] =?UTF-8?q?Update=200017.=E7=94=B5=E8=AF=9D?=
=?UTF-8?q?=E5=8F=B7=E7=A0=81=E7=9A=84=E5=AD=97=E6=AF=8D=E7=BB=84=E5=90=88?=
=?UTF-8?q?.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
self.s 语法纠正
---
...5\227\346\257\215\347\273\204\345\220\210.md" | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md" "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md"
index 1ebf6f49d6..dfd0e8751c 100644
--- "a/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md"
+++ "b/problems/0017.\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210.md"
@@ -322,20 +322,20 @@ python3:
```py
class Solution:
def letterCombinations(self, digits: str) -> List[str]:
- self.s = ""
res = []
+ s = ""
letterMap = ["","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"]
- if len(digits) == 0: return res
- def backtrack(digits,index):
+ if not len(digits): return res
+ def backtrack(digits,index, s):
if index == len(digits):
- return res.append(self.s)
+ return res.append(s)
digit = int(digits[index]) #将index指向的数字转为int
letters = letterMap[digit] #取数字对应的字符集
for i in range(len(letters)):
- self.s += letters[i]
- backtrack(digits,index + 1) #递归,注意index+1,一下层要处理下一个数字
- self.s = self.s[:-1] #回溯
- backtrack(digits,0)
+ s += letters[i]
+ backtrack(digits, index+1, s) #递归,注意index+1,一下层要处理下一个数字
+ s = s[:-1] #回溯
+ backtrack(digits, 0, s)
return res
```
From f5a5cd882f3725cc56a95541bb738025e7b05d89 Mon Sep 17 00:00:00 2001
From: Wen Liang
Date: Thu, 2 Sep 2021 17:22:28 +0800
Subject: [PATCH 0167/3468] =?UTF-8?q?=E4=BC=98=E5=8C=96=200102.=E4=BA=8C?=
=?UTF-8?q?=E5=8F=89=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86?=
=?UTF-8?q?.md=20Python3=E8=A7=A3=E6=B3=95=20=E4=BB=BB=E4=BD=95=E5=9C=A8?=
=?UTF-8?q?=20list=20=E5=A4=B4=E9=83=A8=E8=BF=9B=E8=A1=8C=E7=9A=84?=
=?UTF-8?q?=E6=93=8D=E4=BD=9C=E9=83=BD=E4=BC=9A=E6=8D=9F=E5=A4=B1=E4=B8=80?=
=?UTF-8?q?=E5=AE=9A=E6=80=A7=E8=83=BD=20=E5=9C=A8=20Python=20=E4=B8=AD?=
=?UTF-8?q?=E5=BA=94=E8=AF=A5=E4=BD=BF=E7=94=A8=20collections.deque=20?=
=?UTF-8?q?=E4=BD=9C=E4=B8=BA=E9=98=9F=E5=88=97=E7=9A=84=E6=95=B0=E6=8D=AE?=
=?UTF-8?q?=E7=B1=BB=E5=9E=8B=20=E5=9C=A8=E8=AF=A5=E6=95=B0=E6=8D=AE?=
=?UTF-8?q?=E7=B1=BB=E5=9E=8B=E5=B7=A6=E5=8F=B3=E4=B8=A4=E7=AB=AF=E8=BF=BD?=
=?UTF-8?q?=E5=8A=A0=E5=92=8C=E5=BC=B9=E5=87=BA=E5=85=83=E7=B4=A0=E7=9A=84?=
=?UTF-8?q?=E6=97=B6=E9=97=B4=E5=A4=8D=E6=9D=82=E5=BA=A6=E9=83=BD=E6=8E=A5?=
=?UTF-8?q?=E8=BF=91O(1)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...02\345\272\217\351\201\215\345\216\206.md" | 37 +++++++++++--------
1 file changed, 21 insertions(+), 16 deletions(-)
diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
index a57a92aaef..07708e5a10 100644
--- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
+++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
@@ -87,26 +87,31 @@ public:
python代码:
-```python
+```python3
class Solution:
+ """二叉树层序遍历迭代解法"""
+
def levelOrder(self, root: TreeNode) -> List[List[int]]:
+ results = []
if not root:
- return []
-
- queue = [root]
- out_list = []
-
- while queue:
- length = len(queue)
- in_list = []
- for _ in range(length):
- curnode = queue.pop(0) # (默认移除列表最后一个元素)这里需要移除队列最头上的那个
- in_list.append(curnode.val)
- if curnode.left: queue.append(curnode.left)
- if curnode.right: queue.append(curnode.right)
- out_list.append(in_list)
+ return results
+
+ from collections import deque
+ que = deque([root])
+
+ while que:
+ size = len(que)
+ result = []
+ for _ in range(size):
+ cur = que.popleft()
+ result.append(cur.val)
+ if cur.left:
+ que.append(cur.left)
+ if cur.right:
+ que.append(cur.right)
+ results.append(result)
- return out_list
+ return results
```
java:
From acd13fc7d81aae428ee7bfd735b9e06c593eee11 Mon Sep 17 00:00:00 2001
From: Wen
Date: Thu, 2 Sep 2021 20:55:02 +0800
Subject: [PATCH 0168/3468] =?UTF-8?q?=E4=BC=98=E5=8C=96=200102.=E4=BA=8C?=
=?UTF-8?q?=E5=8F=89=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86?=
=?UTF-8?q?.md=20=E4=B8=AD=E7=9A=84=20107.=E4=BA=8C=E5=8F=89=E6=A0=91?=
=?UTF-8?q?=E7=9A=84=E5=B1=82=E6=AC=A1=E9=81=8D=E5=8E=86=20II=20Python3?=
=?UTF-8?q?=E8=A7=A3=E6=B3=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...02\345\272\217\351\201\215\345\216\206.md" | 40 +++++++++----------
1 file changed, 20 insertions(+), 20 deletions(-)
diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
index 07708e5a10..a02cf99717 100644
--- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
+++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
@@ -279,29 +279,29 @@ python代码:
```python
class Solution:
+ """二叉树层序遍历II迭代解法"""
+
def levelOrderBottom(self, root: TreeNode) -> List[List[int]]:
+ results = []
if not root:
- return []
- quene = [root]
- out_list = []
+ return results
- while quene:
- in_list = []
- for _ in range(len(quene)):
- node = quene.pop(0)
- in_list.append(node.val)
- if node.left:
- quene.append(node.left)
- if node.right:
- quene.append(node.right)
-
- out_list.append(in_list)
-
- out_list.reverse()
- return out_list
-
-# 执行用时:36 ms, 在所有 Python3 提交中击败了92.00%的用户
-# 内存消耗:15.2 MB, 在所有 Python3 提交中击败了63.76%的用户
+ from collections import deque
+ que = deque([root])
+
+ while que:
+ result = []
+ for _ in range(len(que)):
+ cur = que.popleft()
+ result.append(cur.val)
+ if cur.left:
+ que.append(cur.left)
+ if cur.right:
+ que.append(cur.right)
+ results.append(result)
+
+ results.reverse()
+ return results
```
Java:
From fde18e8fddd5e2686ab46157344b5b3bbdb3d715 Mon Sep 17 00:00:00 2001
From: Wen Liang
Date: Fri, 3 Sep 2021 08:36:36 +0800
Subject: [PATCH 0169/3468] =?UTF-8?q?=E4=BC=98=E5=8C=96=200102.=E4=BA=8C?=
=?UTF-8?q?=E5=8F=89=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86?=
=?UTF-8?q?.md=20=E4=B8=AD=E7=9A=84=20637.=E4=BA=8C=E5=8F=89=E6=A0=91?=
=?UTF-8?q?=E7=9A=84=E5=B1=82=E5=B9=B3=E5=9D=87=E5=80=BC=20Python3?=
=?UTF-8?q?=E8=A7=A3=E6=B3=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...02\345\272\217\351\201\215\345\216\206.md" | 41 +++++++++----------
1 file changed, 19 insertions(+), 22 deletions(-)
diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
index 07708e5a10..4a0f62e0e1 100644
--- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
+++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
@@ -633,32 +633,29 @@ python代码:
```python
class Solution:
+ """二叉树层平均值迭代解法"""
+
def averageOfLevels(self, root: TreeNode) -> List[float]:
+ results = []
if not root:
- return []
+ return results
- quene = deque([root])
- out_list = []
-
- while quene:
- in_list = []
-
- for _ in range(len(quene)):
- node = quene.popleft()
- in_list.append(node.val)
- if node.left:
- quene.append(node.left)
- if node.right:
- quene.append(node.right)
-
- out_list.append(in_list)
-
- out_list = map(lambda x: sum(x) / len(x), out_list)
-
- return out_list
+ from collections import deque
+ que = deque([root])
-# 执行用时:56 ms, 在所有 Python3 提交中击败了81.48%的用户
-# 内存消耗:17 MB, 在所有 Python3 提交中击败了89.68%的用户
+ while que:
+ size = len(que)
+ sum_ = 0
+ for _ in range(size):
+ cur = que.popleft()
+ sum_ += cur.val
+ if cur.left:
+ que.append(cur.left)
+ if cur.right:
+ que.append(cur.right)
+ results.append(sum_ / size)
+
+ return results
```
java:
From 578e9908c5470016110e8668815871c9826ff248 Mon Sep 17 00:00:00 2001
From: Wen Liang
Date: Fri, 3 Sep 2021 09:24:10 +0800
Subject: [PATCH 0170/3468] =?UTF-8?q?=E4=BC=98=E5=8C=96=200102.=E4=BA=8C?=
=?UTF-8?q?=E5=8F=89=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86?=
=?UTF-8?q?.md=20=E4=B8=AD=E7=9A=84=20429.N=E5=8F=89=E6=A0=91=E7=9A=84?=
=?UTF-8?q?=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86=20Python3=E8=A7=A3?=
=?UTF-8?q?=E6=B3=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...02\345\272\217\351\201\215\345\216\206.md" | 58 ++++++-------------
1 file changed, 17 insertions(+), 41 deletions(-)
diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
index 4a0f62e0e1..c25dbda499 100644
--- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
+++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
@@ -825,52 +825,28 @@ public:
python代码:
```python
-
class Solution:
+ """N叉树的层序遍历迭代法"""
+
def levelOrder(self, root: 'Node') -> List[List[int]]:
+ results = []
if not root:
- return []
+ return results
- quene = deque([root])
- out_list = []
-
- while quene:
- in_list = []
-
- for _ in range(len(quene)):
- node = quene.popleft()
- in_list.append(node.val)
- if node.children:
- # 这个地方要用extend而不是append,我们看下面的例子:
- # In [18]: alist=[]
- # In [19]: alist.append([1,2,3])
- # In [20]: alist
- # Out[20]: [[1, 2, 3]]
- # In [21]: alist.extend([4,5,6])
- # In [22]: alist
- # Out[22]: [[1, 2, 3], 4, 5, 6]
- # 可以看到extend对要添加的list进行了一个解包操作
- # print(root.children),可以得到children是一个包含
- # 孩子节点地址的list,我们使用for遍历quene的时候,
- # 希望quene是一个单层list,所以要用extend
- # 使用extend的情况,如果print(quene),结果是
- # deque([<__main__.Node object at 0x7f60763ae0a0>])
- # deque([<__main__.Node object at 0x7f607636e6d0>, <__main__.Node object at 0x7f607636e130>, <__main__.Node object at 0x7f607636e310>])
- # deque([<__main__.Node object at 0x7f607636e880>, <__main__.Node object at 0x7f607636ef10>])
- # 可以看到是单层list
- # 如果使用append,print(quene)的结果是
- # deque([<__main__.Node object at 0x7f18907530a0>])
- # deque([[<__main__.Node object at 0x7f18907136d0>, <__main__.Node object at 0x7f1890713130>, <__main__.Node object at 0x7f1890713310>]])
- # 可以看到是两层list,这样for的遍历就会报错
-
- quene.extend(node.children)
-
- out_list.append(in_list)
+ from collections import deque
+ que = deque([root])
- return out_list
-
-# 执行用时:60 ms, 在所有 Python3 提交中击败了76.99%的用户
-# 内存消耗:16.5 MB, 在所有 Python3 提交中击败了89.19%的用户
+ while que:
+ result = []
+ for _ in range(len(que)):
+ cur = que.popleft()
+ result.append(cur.val)
+ # cur.children 是 Node 对象组成的列表,也可能为 None
+ if cur.children:
+ que.extend(cur.children)
+ results.append(result)
+
+ return results
```
java:
From b4c61303477091f537714935db04bb973fbddf27 Mon Sep 17 00:00:00 2001
From: nolanzzz
Date: Thu, 2 Sep 2021 23:41:55 -0400
Subject: [PATCH 0171/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200203.=E7=A7=BB?=
=?UTF-8?q?=E9=99=A4=E9=93=BE=E8=A1=A8=E5=85=83=E7=B4=A0=20PHP=E7=89=88?=
=?UTF-8?q?=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...76\350\241\250\345\205\203\347\264\240.md" | 28 +++++++++++++++++--
1 file changed, 26 insertions(+), 2 deletions(-)
diff --git "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md" "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md"
index 555dad03d0..c4f187e8a0 100644
--- "a/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md"
+++ "b/problems/0203.\347\247\273\351\231\244\351\223\276\350\241\250\345\205\203\347\264\240.md"
@@ -331,8 +331,32 @@ func removeElements(_ head: ListNode?, _ val: Int) -> ListNode? {
}
```
-
-
+PHP:
+```php
+/**
+ * Definition for singly-linked list.
+ * type ListNode struct {
+ * Val int
+ * Next *ListNode
+ * }
+ */
+ // 虚拟头+双指针
+func removeElements(head *ListNode, val int) *ListNode {
+ dummyHead := &ListNode{}
+ dummyHead.Next = head
+ pred := dummyHead
+ cur := head
+ for cur != nil {
+ if cur.Val == val {
+ pred.Next = cur.Next
+ } else {
+ pred = cur
+ }
+ cur = cur.Next
+ }
+ return dummyHead.Next
+}
+```
-----------------------
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
From 68710ed0066d3b3d9cbece33d116fa7fa3b6ad73 Mon Sep 17 00:00:00 2001
From: nolanzzz
Date: Thu, 2 Sep 2021 23:47:00 -0400
Subject: [PATCH 0172/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200242.=E6=9C=89?=
=?UTF-8?q?=E6=95=88=E7=9A=84=E5=AD=97=E6=AF=8D=E5=BC=82=E4=BD=8D=E8=AF=8D?=
=?UTF-8?q?=20PHP=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...15\345\274\202\344\275\215\350\257\215.md" | 35 +++++++++++++++++++
1 file changed, 35 insertions(+)
diff --git "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md"
index 1b6b3109db..3416ac0655 100644
--- "a/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md"
+++ "b/problems/0242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md"
@@ -221,6 +221,41 @@ func isAnagram(_ s: String, _ t: String) -> Bool {
}
```
+PHP:
+```php
+class Solution {
+ /**
+ * @param String $s
+ * @param String $t
+ * @return Boolean
+ */
+ function isAnagram($s, $t) {
+ if (strlen($s) != strlen($t)) {
+ return false;
+ }
+ $table = [];
+ for ($i = 0; $i < strlen($s); $i++) {
+ if (!isset($table[$s[$i]])) {
+ $table[$s[$i]] = 1;
+ } else {
+ $table[$s[$i]]++;
+ }
+ if (!isset($table[$t[$i]])) {
+ $table[$t[$i]] = -1;
+ } else {
+ $table[$t[$i]]--;
+ }
+ }
+ foreach ($table as $record) {
+ if ($record != 0) {
+ return false;
+ }
+ }
+ return true;
+ }
+}
+```
+
## 相关题目
* 383.赎金信
From 4a78d79db07f72daee8ef0086830f5b8a947d517 Mon Sep 17 00:00:00 2001
From: nolanzzz
Date: Thu, 2 Sep 2021 23:48:46 -0400
Subject: [PATCH 0173/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200349.=E4=B8=A4?=
=?UTF-8?q?=E4=B8=AA=E6=95=B0=E7=BB=84=E7=9A=84=E4=BA=A4=E9=9B=86=20PHP?=
=?UTF-8?q?=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...04\347\232\204\344\272\244\351\233\206.md" | 29 +++++++++++++++++++
1 file changed, 29 insertions(+)
diff --git "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md" "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md"
index 752eee5128..0cbdf85f09 100644
--- "a/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md"
+++ "b/problems/0349.\344\270\244\344\270\252\346\225\260\347\273\204\347\232\204\344\272\244\351\233\206.md"
@@ -209,6 +209,35 @@ func intersection(_ nums1: [Int], _ nums2: [Int]) -> [Int] {
}
```
+PHP:
+```php
+class Solution {
+ /**
+ * @param Integer[] $nums1
+ * @param Integer[] $nums2
+ * @return Integer[]
+ */
+ function intersection($nums1, $nums2) {
+ if (count($nums1) == 0 || count($nums2) == 0) {
+ return [];
+ }
+ $counts = [];
+ $res = [];
+ foreach ($nums1 as $num) {
+ $counts[$num] = 1;
+ }
+ foreach ($nums2 as $num) {
+ if (isset($counts[$num])) {
+ $res[] = $num;
+ }
+ unset($counts[$num]);
+ }
+
+ return $res;
+ }
+}
+```
+
## 相关题目
* 350.两个数组的交集 II
From 485f6a806a712356fb3112b8522149650bc2756c Mon Sep 17 00:00:00 2001
From: nolanzzz
Date: Thu, 2 Sep 2021 23:49:37 -0400
Subject: [PATCH 0174/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200202.=E5=BF=AB?=
=?UTF-8?q?=E4=B9=90=E6=95=B0=20PHP=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...2.\345\277\253\344\271\220\346\225\260.md" | 31 +++++++++++++++++++
1 file changed, 31 insertions(+)
diff --git "a/problems/0202.\345\277\253\344\271\220\346\225\260.md" "b/problems/0202.\345\277\253\344\271\220\346\225\260.md"
index e6365c7101..710c824d03 100644
--- "a/problems/0202.\345\277\253\344\271\220\346\225\260.md"
+++ "b/problems/0202.\345\277\253\344\271\220\346\225\260.md"
@@ -223,6 +223,37 @@ func isHappy(_ n: Int) -> Bool {
}
```
+PHP:
+```php
+class Solution {
+ /**
+ * @param Integer $n
+ * @return Boolean
+ */
+ function isHappy($n) {
+ // use a set to record sum
+ // whenever there is a duplicated, stop
+ // == 1 return true, else false
+ $table = [];
+ while ($n != 1 && !isset($table[$n])) {
+ $table[$n] = 1;
+ $n = self::getNextN($n);
+ }
+ return $n == 1;
+ }
+
+ function getNextN(int $n) {
+ $res = 0;
+ while ($n > 0) {
+ $temp = $n % 10;
+ $res += $temp * $temp;
+ $n = floor($n / 10);
+ }
+ return $res;
+ }
+}
+```
+
-----------------------
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
* B站视频:[代码随想录](https://space.bilibili.com/525438321)
From 7f7d1eed323080d1755140484f095b4deec7a08b Mon Sep 17 00:00:00 2001
From: nolanzzz
Date: Thu, 2 Sep 2021 23:50:54 -0400
Subject: [PATCH 0175/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200001.=E4=B8=A4?=
=?UTF-8?q?=E6=95=B0=E4=B9=8B=E5=92=8C=20PHP=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...44\346\225\260\344\271\213\345\222\214.md" | 25 +++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md" "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md"
index f12b5869ed..a6381efffd 100644
--- "a/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md"
+++ "b/problems/0001.\344\270\244\346\225\260\344\271\213\345\222\214.md"
@@ -224,6 +224,31 @@ func twoSum(_ nums: [Int], _ target: Int) -> [Int] {
}
```
+PHP:
+```php
+class Solution {
+ /**
+ * @param Integer[] $nums
+ * @param Integer $target
+ * @return Integer[]
+ */
+ function twoSum($nums, $target) {
+ if (count($nums) == 0) {
+ return [];
+ }
+ $table = [];
+ for ($i = 0; $i < count($nums); $i++) {
+ $temp = $target - $nums[$i];
+ if (isset($table[$temp])) {
+ return [$table[$temp], $i];
+ }
+ $table[$nums[$i]] = $i;
+ }
+ return [];
+ }
+}
+```
+
-----------------------
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
* B站视频:[代码随想录](https://space.bilibili.com/525438321)
From 80eb43f36d73826d8131b1febe95d8c33743083a Mon Sep 17 00:00:00 2001
From: nolanzzz
Date: Thu, 2 Sep 2021 23:51:43 -0400
Subject: [PATCH 0176/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200454.=E5=9B=9B?=
=?UTF-8?q?=E6=95=B0=E7=9B=B8=E5=8A=A0II=20PHP=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...\346\225\260\347\233\270\345\212\240II.md" | 32 ++++++++++++++++++-
1 file changed, 31 insertions(+), 1 deletion(-)
diff --git "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md" "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md"
index 4e61dc2f38..9fe01ad115 100644
--- "a/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md"
+++ "b/problems/0454.\345\233\233\346\225\260\347\233\270\345\212\240II.md"
@@ -220,7 +220,37 @@ var fourSumCount = function(nums1, nums2, nums3, nums4) {
};
```
-
+PHP:
+```php
+class Solution {
+ /**
+ * @param Integer[] $nums1
+ * @param Integer[] $nums2
+ * @param Integer[] $nums3
+ * @param Integer[] $nums4
+ * @return Integer
+ */
+ function fourSumCount($nums1, $nums2, $nums3, $nums4) {
+ $map = [];
+ foreach ($nums1 as $n1) {
+ foreach ($nums2 as $n2) {
+ $temp = $n1 + $n2;
+ $map[$temp] = isset($map[$temp]) ? $map[$temp]+1 : 1;
+ }
+ }
+ $count = 0;
+ foreach ($nums3 as $n3) {
+ foreach ($nums4 as $n4) {
+ $temp = 0 - $n3 - $n4;
+ if (isset($map[$temp])) {
+ $count += $map[$temp];
+ }
+ }
+ }
+ return $count;
+ }
+}
+```
-----------------------
From 7f30649d46cb35f2ff175f0f1309ae58fe962de9 Mon Sep 17 00:00:00 2001
From: nolanzzz
Date: Thu, 2 Sep 2021 23:52:20 -0400
Subject: [PATCH 0177/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200383.=E8=B5=8E?=
=?UTF-8?q?=E9=87=91=E4=BF=A1=20PHP=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...3.\350\265\216\351\207\221\344\277\241.md" | 25 +++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" "b/problems/0383.\350\265\216\351\207\221\344\277\241.md"
index 64503cef7b..32b0ff7f87 100644
--- "a/problems/0383.\350\265\216\351\207\221\344\277\241.md"
+++ "b/problems/0383.\350\265\216\351\207\221\344\277\241.md"
@@ -266,6 +266,31 @@ var canConstruct = function(ransomNote, magazine) {
};
```
+PHP:
+```php
+class Solution {
+ /**
+ * @param String $ransomNote
+ * @param String $magazine
+ * @return Boolean
+ */
+ function canConstruct($ransomNote, $magazine) {
+ if (count($ransomNote) > count($magazine)) {
+ return false;
+ }
+ $map = [];
+ for ($i = 0; $i < strlen($magazine); $i++) {
+ $map[$magazine[$i]] = ($map[$magazine[$i]] ?? 0) + 1;
+ }
+ for ($i = 0; $i < strlen($ransomNote); $i++) {
+ if (!isset($map[$ransomNote[$i]]) || --$map[$ransomNote[$i]] < 0) {
+ return false;
+ }
+ }
+ return true;
+ }
+}
+```
-----------------------
From e6975415370067128b8a625944fedec91728f4fc Mon Sep 17 00:00:00 2001
From: nolanzzz
Date: Thu, 2 Sep 2021 23:53:36 -0400
Subject: [PATCH 0178/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200015.=E4=B8=89?=
=?UTF-8?q?=E6=95=B0=E4=B9=8B=E5=92=8C=20PHP=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...11\346\225\260\344\271\213\345\222\214.md" | 40 +++++++++++++++++++
1 file changed, 40 insertions(+)
diff --git "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md" "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md"
index 1adb2d24c6..adb9a113f5 100644
--- "a/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md"
+++ "b/problems/0015.\344\270\211\346\225\260\344\271\213\345\222\214.md"
@@ -393,6 +393,46 @@ function threeSum(array $nums): array
}
```
+PHP:
+```php
+class Solution {
+ /**
+ * @param Integer[] $nums
+ * @return Integer[][]
+ */
+ function threeSum($nums) {
+ $res = [];
+ sort($nums);
+ for ($i = 0; $i < count($nums); $i++) {
+ if ($nums[$i] > 0) {
+ return $res;
+ }
+ if ($i > 0 && $nums[$i] == $nums[$i - 1]) {
+ continue;
+ }
+ $left = $i + 1;
+ $right = count($nums) - 1;
+ while ($left < $right) {
+ $sum = $nums[$i] + $nums[$left] + $nums[$right];
+ if ($sum < 0) {
+ $left++;
+ }
+ else if ($sum > 0) {
+ $right--;
+ }
+ else {
+ $res[] = [$nums[$i], $nums[$left], $nums[$right]];
+ while ($left < $right && $nums[$left] == $nums[$left + 1]) $left++;
+ while ($left < $right && $nums[$right] == $nums[$right - 1]) $right--;
+ $left++;
+ $right--;
+ }
+ }
+ }
+ return $res;
+ }
+}
+```
-----------------------
From 3e1d341aea97d6f162606827b3e55151820fc299 Mon Sep 17 00:00:00 2001
From: nolanzzz
Date: Thu, 2 Sep 2021 23:54:21 -0400
Subject: [PATCH 0179/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200018.=E5=9B=9B?=
=?UTF-8?q?=E6=95=B0=E4=B9=8B=E5=92=8C=20PHP=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...33\346\225\260\344\271\213\345\222\214.md" | 43 +++++++++++++++++++
1 file changed, 43 insertions(+)
diff --git "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md" "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md"
index 6af033b901..c81c5df7cf 100644
--- "a/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md"
+++ "b/problems/0018.\345\233\233\346\225\260\344\271\213\345\222\214.md"
@@ -310,6 +310,49 @@ var fourSum = function(nums, target) {
};
```
+PHP:
+```php
+class Solution {
+ /**
+ * @param Integer[] $nums
+ * @param Integer $target
+ * @return Integer[][]
+ */
+ function fourSum($nums, $target) {
+ $res = [];
+ sort($nums);
+ for ($i = 0; $i < count($nums); $i++) {
+ if ($i > 0 && $nums[$i] == $nums[$i - 1]) {
+ continue;
+ }
+ for ($j = $i + 1; $j < count($nums); $j++) {
+ if ($j > $i + 1 && $nums[$j] == $nums[$j - 1]) {
+ continue;
+ }
+ $left = $j + 1;
+ $right = count($nums) - 1;
+ while ($left < $right) {
+ $sum = $nums[$i] + $nums[$j] + $nums[$left] + $nums[$right];
+ if ($sum < $target) {
+ $left++;
+ }
+ else if ($sum > $target) {
+ $right--;
+ }
+ else {
+ $res[] = [$nums[$i], $nums[$j], $nums[$left], $nums[$right]];
+ while ($left < $right && $nums[$left] == $nums[$left+1]) $left++;
+ while ($left < $right && $nums[$right] == $nums[$right-1]) $right--;
+ $left++;
+ $right--;
+ }
+ }
+ }
+ }
+ return $res;
+ }
+}
+```
-----------------------
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
From ed1b1d2d39b080e7e45c2a92cb11e631f7ec5d94 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9E=81=E5=AE=A2=E5=AD=A6=E4=BC=9F?=
Date: Fri, 3 Sep 2021 13:25:14 +0800
Subject: [PATCH 0180/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20383.=20=E8=B5=8E?=
=?UTF-8?q?=E9=87=91=E4=BF=A1=20Swift=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...3.\350\265\216\351\207\221\344\277\241.md" | 22 +++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git "a/problems/0383.\350\265\216\351\207\221\344\277\241.md" "b/problems/0383.\350\265\216\351\207\221\344\277\241.md"
index 64503cef7b..18b1de9b8b 100644
--- "a/problems/0383.\350\265\216\351\207\221\344\277\241.md"
+++ "b/problems/0383.\350\265\216\351\207\221\344\277\241.md"
@@ -266,6 +266,28 @@ var canConstruct = function(ransomNote, magazine) {
};
```
+Swift:
+```swift
+func canConstruct(_ ransomNote: String, _ magazine: String) -> Bool {
+ var record = Array(repeating: 0, count: 26);
+ let aUnicodeScalarValue = "a".unicodeScalars.first!.value
+ for unicodeScalar in magazine.unicodeScalars {
+ // 通过record 记录 magazine 里各个字符出现的次数
+ let idx: Int = Int(unicodeScalar.value - aUnicodeScalarValue)
+ record[idx] += 1
+ }
+ for unicodeScalar in ransomNote.unicodeScalars {
+ // 遍历 ransomNote,在record里对应的字符个数做 -- 操作
+ let idx: Int = Int(unicodeScalar.value - aUnicodeScalarValue)
+ record[idx] -= 1
+ // 如果小于零说明在magazine没有
+ if record[idx] < 0 {
+ return false
+ }
+ }
+ return true
+}
+```
-----------------------
From bbd1b2e9ca58ae177f3d656752cd01a2ee15f7a2 Mon Sep 17 00:00:00 2001
From: ironartisan
Date: Fri, 3 Sep 2021 17:19:26 +0800
Subject: [PATCH 0181/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A00102.=E4=BA=8C?=
=?UTF-8?q?=E5=8F=89=E6=A0=91=E7=9A=84=E5=B1=82=E5=BA=8F=E9=81=8D=E5=8E=86?=
=?UTF-8?q?=E9=80=92=E5=BD=92=E8=A7=A3=E6=B3=95Python=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...1\202\345\272\217\351\201\215\345\216\206.md" | 16 +++++++++++++++-
1 file changed, 15 insertions(+), 1 deletion(-)
diff --git "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md" "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
index a57a92aaef..baec12292c 100644
--- "a/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
+++ "b/problems/0102.\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206.md"
@@ -88,6 +88,7 @@ public:
python代码:
```python
+# 迭代法
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root:
@@ -108,7 +109,20 @@ class Solution:
return out_list
```
-
+```python
+# 递归法
+class Solution:
+ def levelOrder(self, root: TreeNode) -> List[List[int]]:
+ res = []
+ def helper(root, depth):
+ if not root: return []
+ if len(res) == depth: res.append([]) # start the current depth
+ res[depth].append(root.val) # fulfil the current depth
+ if root.left: helper(root.left, depth + 1) # process child nodes for the next depth
+ if root.right: helper(root.right, depth + 1)
+ helper(root, 0)
+ return res
+```
java:
```Java
From b5c5ecf51f06b18009fe62a6450aca0cc63b0771 Mon Sep 17 00:00:00 2001
From: wjjiang <48505670+Spongecaptain@users.noreply.github.com>
Date: Fri, 3 Sep 2021 19:30:02 +0800
Subject: [PATCH 0182/3468] =?UTF-8?q?Update=200503.=E4=B8=8B=E4=B8=80?=
=?UTF-8?q?=E4=B8=AA=E6=9B=B4=E5=A4=A7=E5=85=83=E7=B4=A0II.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
添加 go 版本
---
...\345\244\247\345\205\203\347\264\240II.md" | 20 +++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md" "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md"
index 4e088ed447..624c6c7caa 100644
--- "a/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md"
+++ "b/problems/0503.\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\240II.md"
@@ -132,6 +132,26 @@ class Solution:
return dp
```
Go:
+```go
+func nextGreaterElements(nums []int) []int {
+ length := len(nums)
+ result := make([]int,length,length)
+ for i:=0;i0&&nums[i%length]>nums[stack[len(stack)-1]]{
+ index := stack[len(stack)-1]
+ stack = stack[:len(stack)-1] // pop
+ result[index] = nums[i%length]
+ }
+ stack = append(stack,i%length)
+ }
+ return result
+}
+```
JavaScript:
From bcd03971db853fdb17d6238b6851bd989ab613dd Mon Sep 17 00:00:00 2001
From: shuwen
Date: Fri, 3 Sep 2021 22:04:27 +0800
Subject: [PATCH 0183/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=201002.=E6=9F=A5?=
=?UTF-8?q?=E6=89=BE=E5=B8=B8=E7=94=A8=E5=AD=97=E7=AC=A6.md=20Python3=20?=
=?UTF-8?q?=E4=BD=BF=E7=94=A8collections.Counter=E5=AE=9E=E7=8E=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...70\347\224\250\345\255\227\347\254\246.md" | 20 +++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md" "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md"
index c0ca578e00..e02780da1f 100644
--- "a/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md"
+++ "b/problems/1002.\346\237\245\346\211\276\345\270\270\347\224\250\345\255\227\347\254\246.md"
@@ -193,6 +193,26 @@ class Solution:
hash[i] -= 1
return result
```
+
+Python 3 使用collections.Counter
+```python
+class Solution:
+ def commonChars(self, words: List[str]) -> List[str]:
+ tmp = collections.Counter(words[0])
+ l = []
+ for i in range(1,len(words)):
+ # 使用 & 取交集
+ tmp = tmp & collections.Counter(words[i])
+
+ # 剩下的就是每个单词都出现的字符(键),个数(值)
+ for j in tmp:
+ v = tmp[j]
+ while(v):
+ l.append(j)
+ v -= 1
+ return l
+```
+
javaScript
```js
var commonChars = function (words) {
From 767168a8b0ec3f9cc2b31a76355e98d89d87f3ea Mon Sep 17 00:00:00 2001
From: martisss <2466632626@qq.com>
Date: Sat, 4 Sep 2021 10:58:23 +0800
Subject: [PATCH 0184/3468] =?UTF-8?q?=E4=BF=AE=E5=A4=8D355.=E5=88=86?=
=?UTF-8?q?=E5=8F=91=E9=A5=BC=E5=B9=B2.md=20js=E4=BB=A3=E7=A0=81=E6=98=BE?=
=?UTF-8?q?=E7=A4=BA?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md" "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md"
index 1e1c4afe25..8e20c402aa 100644
--- "a/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md"
+++ "b/problems/0455.\345\210\206\345\217\221\351\245\274\345\271\262.md"
@@ -197,11 +197,10 @@ func findContentChildren(g []int, s []int) int {
return child
}
-
+```
Javascript:
-```Javascript
-
+```
var findContentChildren = function(g, s) {
g = g.sort((a, b) => a - b)
s = s.sort((a, b) => a - b)
From 659b34c22f171d011ce8b9e3a826954183c30315 Mon Sep 17 00:00:00 2001
From: ironartisan
Date: Sat, 4 Sep 2021 15:06:39 +0800
Subject: [PATCH 0185/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A00222.=E5=AE=8C?=
=?UTF-8?q?=E5=85=A8=E4=BA=8C=E5=8F=89=E6=A0=91=E7=9A=84=E8=8A=82=E7=82=B9?=
=?UTF-8?q?=E4=B8=AA=E6=95=B0=E8=BF=AD=E4=BB=A3=E8=A7=A3=E6=B3=95Java?=
=?UTF-8?q?=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...02\347\202\271\344\270\252\346\225\260.md" | 22 ++++++++++++++++++-
1 file changed, 21 insertions(+), 1 deletion(-)
diff --git "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md" "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md"
index 6268c447b5..13017f7faf 100644
--- "a/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md"
+++ "b/problems/0222.\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.md"
@@ -204,7 +204,27 @@ class Solution {
}
}
```
-
+```java
+class Solution {
+ // 迭代法
+ public int countNodes(TreeNode root) {
+ if (root == null) return 0;
+ Queue queue = new LinkedList<>();
+ queue.offer(root);
+ int result = 0;
+ while (!queue.isEmpty()) {
+ int size = queue.size();
+ while (size -- > 0) {
+ TreeNode cur = queue.poll();
+ result++;
+ if (cur.left != null) queue.offer(cur.left);
+ if (cur.right != null) queue.offer(cur.right);
+ }
+ }
+ return result;
+ }
+}
+```
```java
class Solution {
/**
From 8b9995cf26e951a61b4f37c9b48f0a362880c800 Mon Sep 17 00:00:00 2001
From: SCCCR <31815729+SCCCR@users.noreply.github.com>
Date: Sat, 4 Sep 2021 16:17:25 +0800
Subject: [PATCH 0186/3468] =?UTF-8?q?Update=200300.=E6=9C=80=E9=95=BF?=
=?UTF-8?q?=E4=B8=8A=E5=8D=87=E5=AD=90=E5=BA=8F=E5=88=97.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md" "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md"
index f9145f4c3b..fdd5fda892 100644
--- "a/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md"
+++ "b/problems/0300.\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.md"
@@ -39,7 +39,7 @@
1. dp[i]的定义
-**dp[i]表示i之前包括i的最长上升子序列**。
+**dp[i]表示i之前包括i的最长上升子序列的长度**。
2. 状态转移方程
From 3899a8528470f40479d534a9e054260eeefd859c Mon Sep 17 00:00:00 2001
From: Arthur
Date: Sun, 5 Sep 2021 09:02:00 +0800
Subject: [PATCH 0187/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E4=BA=8C?=
=?UTF-8?q?=E5=8F=89=E6=A0=91=E7=9A=84=E9=80=92=E5=BD=92=E9=81=8D=E5=8E=86?=
=?UTF-8?q?.md=20C=E8=AF=AD=E8=A8=80=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...22\345\275\222\351\201\215\345\216\206.md" | 48 +++++++++++++++++++
1 file changed, 48 insertions(+)
diff --git "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md" "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md"
index 223cf7222e..93f4000e41 100644
--- "a/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md"
+++ "b/problems/\344\272\214\345\217\211\346\240\221\347\232\204\351\200\222\345\275\222\351\201\215\345\216\206.md"
@@ -360,8 +360,56 @@ var postorderTraversal = function(root) {
};
```
+C:
+```c
+//前序遍历:
+void preOrderTraversal(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);
+}
+
+int* preorderTraversal(struct TreeNode* root, int* returnSize){
+ int* ret = (int*)malloc(sizeof(int) * 100);
+ *returnSize = 0;
+ preOrderTraversal(root, ret, returnSize);
+ return ret;
+}
+
+//中序遍历:
+void inOrder(struct TreeNode* node, int* ret, int* returnSize) {
+ if(!node)
+ return;
+ inOrder(node->left, ret, returnSize);
+ ret[(*returnSize)++] = node->val;
+ inOrder(node->right, ret, returnSize);
+}
+int* inorderTraversal(struct TreeNode* root, int* returnSize){
+ int* ret = (int*)malloc(sizeof(int) * 100);
+ *returnSize = 0;
+ inOrder(root, ret, returnSize);
+ return ret;
+}
+
+//后序遍历:
+void postOrder(struct TreeNode* node, int* ret, int* returnSize) {
+ if(node == NULL)
+ return;
+ postOrder(node->left, ret, returnSize);
+ postOrder(node->right, ret, returnSize);
+ ret[(*returnSize)++] = node->val;
+}
+int* postorderTraversal(struct TreeNode* root, int* returnSize){
+ int* ret= (int*)malloc(sizeof(int) * 100);
+ *returnSize = 0;
+ postOrder(root, ret, returnSize);
+ return ret;
+}
+```
-----------------------
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
From b83cc1602a91c6d9ad3268904d17be42415d6938 Mon Sep 17 00:00:00 2001
From: ironartisan <54694467+ironartisan@users.noreply.github.com>
Date: Sun, 5 Sep 2021 10:27:23 +0800
Subject: [PATCH 0188/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A00404.=E5=B7=A6?=
=?UTF-8?q?=E5=8F=B6=E5=AD=90=E4=B9=8B=E5=92=8C.md=E5=B1=82=E5=BA=8F?=
=?UTF-8?q?=E8=BF=AD=E4=BB=A3=E8=A7=A3=E6=B3=95Java=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...66\345\255\220\344\271\213\345\222\214.md" | 26 ++++++++++++++++++-
1 file changed, 25 insertions(+), 1 deletion(-)
diff --git "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md" "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md"
index 2b627b6c12..c0eb7c8eb5 100644
--- "a/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md"
+++ "b/problems/0404.\345\267\246\345\217\266\345\255\220\344\271\213\345\222\214.md"
@@ -201,7 +201,31 @@ class Solution {
}
}
```
-
+```java
+// 层序遍历迭代法
+class Solution {
+ public int sumOfLeftLeaves(TreeNode root) {
+ int sum = 0;
+ if (root == null) return 0;
+ Queue queue = new LinkedList<>();
+ queue.offer(root);
+ while (!queue.isEmpty()) {
+ int size = queue.size();
+ while (size -- > 0) {
+ TreeNode node = queue.poll();
+ if (node.left != null) { // 左节点不为空
+ queue.offer(node.left);
+ if (node.left.left == null && node.left.right == null){ // 左叶子节点
+ sum += node.left.val;
+ }
+ }
+ if (node.right != null) queue.offer(node.right);
+ }
+ }
+ return sum;
+ }
+}
+```
## Python
From 81501d2acfb12c49821e6f3348b52e2e10cde1c7 Mon Sep 17 00:00:00 2001
From: ironartisan <54694467+ironartisan@users.noreply.github.com>
Date: Sun, 5 Sep 2021 15:31:39 +0800
Subject: [PATCH 0189/3468] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E9=80=92=E5=BD=92?=
=?UTF-8?q?=E7=AE=97=E6=B3=95=E7=9A=84=E6=97=B6=E9=97=B4=E4=B8=8E=E7=A9=BA?=
=?UTF-8?q?=E9=97=B4=E5=A4=8D=E6=9D=82=E5=BA=A6=E5=88=86=E6=9E=90.md?=
=?UTF-8?q?=E8=BE=93=E5=85=A5=E5=8F=82=E6=95=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git "a/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md" "b/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md"
index 27b9d7ccd6..7a690781a4 100644
--- "a/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md"
+++ "b/problems/\345\211\215\345\272\217/\351\200\222\345\275\222\347\256\227\346\263\225\347\232\204\346\227\266\351\227\264\344\270\216\347\251\272\351\227\264\345\244\215\346\235\202\345\272\246\345\210\206\346\236\220.md"
@@ -166,7 +166,7 @@ void time_consumption() {
system_clock::now().time_since_epoch()
);
- fibonacci_3(0, 1, n);
+ fibonacci_3(1, 1, n);
milliseconds end_time = duration_cast(
system_clock::now().time_since_epoch()
From ac71ac43bcc9437839d0da2fc4615eca6b34a31e Mon Sep 17 00:00:00 2001
From: hailincai
Date: Sun, 5 Sep 2021 08:32:17 -0400
Subject: [PATCH 0190/3468] =?UTF-8?q?Update=200042.=E6=8E=A5=E9=9B=A8?=
=?UTF-8?q?=E6=B0=B4.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
增加Java 单调栈实现
---
...2.\346\216\245\351\233\250\346\260\264.md" | 47 +++++++++++++++++++
1 file changed, 47 insertions(+)
diff --git "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" "b/problems/0042.\346\216\245\351\233\250\346\260\264.md"
index 522b10f9b7..17c671efca 100644
--- "a/problems/0042.\346\216\245\351\233\250\346\260\264.md"
+++ "b/problems/0042.\346\216\245\351\233\250\346\260\264.md"
@@ -391,6 +391,7 @@ class Solution {
}
}
```
+
动态规划法
```java
class Solution {
@@ -418,6 +419,52 @@ class Solution {
}
}
```
+
+单调栈法
+```java
+ public int trapMonoStack(int[] height){
+ int size = height.length;
+
+ if (size <= 2) return 0;
+
+ // in the stack, we push the index of array
+ // using height[] to access the real height
+ Stack stack = new Stack();
+ stack.push(0);
+
+ int sum = 0;
+ for (int index = 1; index < size; index++){
+ int stackTop = stack.peek();
+ if (height[index] < height[stackTop]){
+ stack.push(index);
+ }else if (height[index] == height[stackTop]){
+ // 因为相等的相邻墙,左边一个是不可能存放雨水的,所以pop左边的index, push当前的index
+ stack.pop();
+ stack.push(index);
+ }else{
+ //pop up all lower value
+ int heightAtIdx = height[index];
+ while (!stack.isEmpty() && (heightAtIdx > height[stackTop])){
+ int mid = stack.pop();
+
+ if (!stack.isEmpty()){
+ int left = stack.peek();
+
+ int h = Math.min(height[left], height[index]) - height[mid];
+ int w = index - left - 1;
+ int hold = h * w;
+ if (hold > 0) sum += hold;
+ stackTop = stack.peek();
+ }
+ }
+ stack.push(index);
+ }
+ }
+
+ return sum;
+ }
+```
+
Python:
双指针法
From 8d1c4d65ffaf633ac3ffe17430bee6d7e5759829 Mon Sep 17 00:00:00 2001
From: hailincai
Date: Sun, 5 Sep 2021 09:17:11 -0400
Subject: [PATCH 0191/3468] =?UTF-8?q?Update=200084.=E6=9F=B1=E7=8A=B6?=
=?UTF-8?q?=E5=9B=BE=E4=B8=AD=E6=9C=80=E5=A4=A7=E7=9A=84=E7=9F=A9=E5=BD=A2?=
=?UTF-8?q?.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
增加java 单调栈实现
---
...47\347\232\204\347\237\251\345\275\242.md" | 44 +++++++++++++++++++
1 file changed, 44 insertions(+)
diff --git "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md"
index a0f06e8ff8..57df4161aa 100644
--- "a/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md"
+++ "b/problems/0084.\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md"
@@ -228,6 +228,50 @@ class Solution {
}
```
+单调栈
+```java
+class Solution {
+ int largestRectangleArea(int[] heights) {
+ Stack st = new Stack();
+
+ // 数组扩容,在头和尾各加入一个元素
+ int [] newHeights = new int[heights.length + 2];
+ newHeights[0] = 0;
+ newHeights[newHeights.length - 1] = 0;
+ for (int index = 0; index < heights.length; index++){
+ newHeights[index + 1] = heights[index];
+ }
+
+ heights = newHeights;
+
+ st.push(0);
+ int result = 0;
+ // 第一个元素已经入栈,从下表1开始
+ for (int i = 1; i < heights.length; i++) {
+ // 注意heights[i] 是和heights[st.top()] 比较 ,st.top()是下表
+ if (heights[i] > heights[st.peek()]) {
+ st.push(i);
+ } else if (heights[i] == heights[st.peek()]) {
+ st.pop(); // 这个可以加,可以不加,效果一样,思路不同
+ st.push(i);
+ } else {
+ while (heights[i] < heights[st.peek()]) { // 注意是while
+ int mid = st.peek();
+ st.pop();
+ int left = st.peek();
+ int right = i;
+ int w = right - left - 1;
+ int h = heights[mid];
+ result = Math.max(result, w * h);
+ }
+ st.push(i);
+ }
+ }
+ return result;
+ }
+}
+```
+
Python:
动态规划
From 69441475c6f5d037d1eff9a4fd46c4b1913f1ff9 Mon Sep 17 00:00:00 2001
From: hailincai
Date: Sun, 5 Sep 2021 09:18:34 -0400
Subject: [PATCH 0192/3468] =?UTF-8?q?Update=200042.=E6=8E=A5=E9=9B=A8?=
=?UTF-8?q?=E6=B0=B4.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
修改代码格式
---
"problems/0042.\346\216\245\351\233\250\346\260\264.md" | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git "a/problems/0042.\346\216\245\351\233\250\346\260\264.md" "b/problems/0042.\346\216\245\351\233\250\346\260\264.md"
index 17c671efca..4383a0b8c6 100644
--- "a/problems/0042.\346\216\245\351\233\250\346\260\264.md"
+++ "b/problems/0042.\346\216\245\351\233\250\346\260\264.md"
@@ -422,7 +422,8 @@ class Solution {
单调栈法
```java
- public int trapMonoStack(int[] height){
+class Solution {
+ public int trap(int[] height){
int size = height.length;
if (size <= 2) return 0;
@@ -463,6 +464,7 @@ class Solution {
return sum;
}
+}
```
Python:
From 429b504779d9981cd14329406ec9acbfd72cd76d Mon Sep 17 00:00:00 2001
From: ironartisan <54694467+ironartisan@users.noreply.github.com>
Date: Sun, 5 Sep 2021 21:38:56 +0800
Subject: [PATCH 0193/3468] =?UTF-8?q?=E6=B7=BB=E5=8A=A00257.=E4=BA=8C?=
=?UTF-8?q?=E5=8F=89=E6=A0=91=E7=9A=84=E6=89=80=E6=9C=89=E8=B7=AF=E5=BE=84?=
=?UTF-8?q?.md=E8=BF=AD=E4=BB=A3=E6=B3=95Java=E8=A7=A3=E6=B3=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...00\346\234\211\350\267\257\345\276\204.md" | 37 +++++++++++++++++++
1 file changed, 37 insertions(+)
diff --git "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md" "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md"
index 2984427fec..6386c48d3b 100644
--- "a/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md"
+++ "b/problems/0257.\344\272\214\345\217\211\346\240\221\347\232\204\346\211\200\346\234\211\350\267\257\345\276\204.md"
@@ -367,6 +367,43 @@ class Solution {
}
}
```
+```java
+// 解法2
+class Solution {
+ /**
+ * 迭代法
+ */
+ public List binaryTreePaths(TreeNode root) {
+ List result = new ArrayList<>();
+ if (root == null)
+ return result;
+ Stack