Skip to content

Commit 2c37c1d

Browse files
committed
[0108]ADD:LC-148/131/189
1 parent 2d2b0a8 commit 2c37c1d

File tree

4 files changed

+98
-3
lines changed

4 files changed

+98
-3
lines changed

readme.md

+6-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
# 按日期打卡
22
## 2021.01
3-
[[20210105]830. 较大分组的位置-Easy](字符串/830.%20较大分组的位置-Easy)
4-
[[20210104]1688. 比赛中的配对次数-Easy](回溯法/1688.%20比赛中的配对次数-Easy.md)
3+
[[20210104]1688. 比赛中的配对次数-Easy](回溯法/1688.%20比赛中的配对次数-Easy.md)
4+
[[20210105]830. 较大分组的位置-Easy](字符串/830.%20较大分组的位置-Easy.md)
5+
[[20210108]131. 分割回文串-Medium](回溯法/131.%20分割回文串-Medium.md)
6+
[[20210108]189. 旋转数组-Medium](189.%20旋转数组-Medium.md)
57
## 2020.12
68
[[20201201]34. 在排序数组中查找元素的第一个和最后一个位置-Medium](数组/34.%20在排序数组中查找元素的第一个和最后一个位置-Medium.md)
79
[[20201202]292. Nim 游戏-Easy](动态规划/292.%20Nim%20游戏-Easy.md)
@@ -87,6 +89,7 @@
8789
[15. 三数之和 - Medium](双指针/15.%20三数之和%20-%20Medium.md)
8890
[18. 四数之和-Medium](双指针/18.%20四数之和-medium.md)
8991
[34. 在排序数组中查找元素的第一个和最后一个位置-Medium](数组/34.%20在排序数组中查找元素的第一个和最后一个位置-Medium.md)
92+
[189. 旋转数组-Medium](189.%20旋转数组-Medium.md)
9093
[560. 和为K的子数组-Medium](数组/560.%20和为K的子数组-Medium.md)
9194
[611. 有效三角形的个数 - Medium](./双指针/611.%20有效三角形的个数%20-%20Medium.md)
9295
[845. 数组中的最长山脉-Medium](双指针/845.%20数组中的最长山脉-Medium)
@@ -154,4 +157,5 @@
154157
[1402. 做菜顺序-Hard](贪心/1402.%20做菜顺序-Hard.md)
155158

156159
## 回溯法
160+
[131. 分割回文串-Medium](回溯法/131.%20分割回文串-Medium.md)
157161
[1688. 比赛中的配对次数-Easy](回溯法/1688.%20比赛中的配对次数-Easy.md)
+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# [Description](https://leetcode-cn.com/problems/palindrome-partitioning)
2+
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
3+
4+
返回 s 所有可能的分割方案。
5+
6+
示例:
7+
```python
8+
输入: "aab"
9+
输出:
10+
[
11+
["aa","b"],
12+
["a","a","b"]
13+
]
14+
```
15+
16+
17+
# Solution
18+
- 回溯法思考的步骤:
19+
- 画递归树;
20+
- 根据自己画的递归树编码。
21+
22+
![image.png](https://pic.leetcode-cn.com/298a80282ac3505fec3710abdc1e656c591cf7acaa3ba976151480729244b649-image.png)
23+
24+
- 因此递归中需要有一个主循环,遍历每一个分裂的位置。
25+
- 若目前分裂位置前的子串是回文串,则可以分裂点右侧的子串可以继续进行判断
26+
- 若不是,则结束递归
27+
- 若最后进行到空串,则将已有的结果保存
28+
```python
29+
class Solution:
30+
def partition(self, s: str) -> List[List[str]]:
31+
res = []
32+
33+
def helper(s, tmp):
34+
if not s:
35+
res.append(tmp)
36+
else:
37+
for i in range(1, len(s)+1):
38+
if s[:i] == s[:i][::-1]:
39+
helper(s[i:], tmp+[s[:i]])
40+
41+
helper(s, [])
42+
return res
43+
```

数组/189. 旋转数组-Medium.md

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# [Description](https://leetcode-cn.com/problems/rotate-array)
2+
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
3+
4+
示例 1:
5+
```python
6+
输入: [1,2,3,4,5,6,7] 和 k = 3
7+
输出: [5,6,7,1,2,3,4]
8+
解释:
9+
向右旋转 1 步: [7,1,2,3,4,5,6]
10+
向右旋转 2 步: [6,7,1,2,3,4,5]
11+
向右旋转 3 步: [5,6,7,1,2,3,4]
12+
```
13+
示例 2:
14+
```python
15+
输入: [-1,-100,3,99] 和 k = 2
16+
输出: [3,99,-1,-100]
17+
解释:
18+
向右旋转 1 步: [99,-1,-100,3]
19+
向右旋转 2 步: [3,99,-1,-100]
20+
```
21+
说明:
22+
23+
- 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
24+
- 要求使用空间复杂度为 O(1) 的 原地 算法。
25+
26+
27+
# Solution
28+
- 翻转法,先翻转整个字符串,再按k的位置分裂,翻转k两侧的两个子串
29+
- 时间复杂度:$O(n)$
30+
- 空间复杂度:$O(1)$
31+
32+
```python
33+
class Solution:
34+
def rotate(self, nums: List[int], k: int) -> None:
35+
"""
36+
Do not return anything, modify nums in-place instead.
37+
"""
38+
def reverse(i, j):
39+
while i < j:
40+
nums[i], nums[j] = nums[j], nums[i]
41+
i += 1
42+
j -= 1
43+
44+
k = k % len(nums)
45+
reverse(0, len(nums)-1)
46+
reverse(0, k-1)
47+
reverse(k, len(nums)-1)
48+
```

链表/148. 排序链表-Medium.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
- -105 <= Node.val <= 105
3232

3333
# Solution
34-
- 考虑O(n log n) 时间复杂度和O(1)空间复杂度,因此可使用的排序方法为快速排序、堆排序和合并排序;其中合并排序最适合链表。其次,由于递归会开辟额外的栈空间,所以只能使用迭代。
34+
- 考虑**O(n log n) 时间复杂度****O(1)空间复杂度**,因此可使用的排序方法为快速排序、堆排序和合并排序;其中合并排序最适合链表。其次,由于递归会开辟额外的栈空间,所以只能使用迭代。
3535
- 采用自底向上的策略,先将链表分成split=1长度的子链表,并两两进行归并排序;在此基础上逐渐增大split(split *= 2),直至split>=length(链表长度)
3636
- 注意:
3737
- 归并时,对于用于归并的两段子链表,若第二段没有,则表明已到链表末尾,可以跳出循环

0 commit comments

Comments
 (0)