Skip to content

Commit ae09862

Browse files
author
lixiang.2533
committed
add new answers
Change-Id: I314f82a79a93a30bad5db6ea16ee11af2ddb2b20
1 parent e684fdd commit ae09862

File tree

66 files changed

+943
-25242
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

66 files changed

+943
-25242
lines changed

.DS_Store

0 Bytes
Binary file not shown.

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
./Tmp/*
2+
Tmp

merge_md.md

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
11
```python
22
import os
3-
from glob import glob
3+
from glob import glob
4+
45
dirs = os.listdir('/Users/lixiang.2533/Desktop/Blogs/Leetcode/')
56
dir = '/Users/lixiang.2533/Desktop/Blogs/Leetcode'
6-
dirs = ['哈希表', '', '二分法', '数学题', '链表','字符串', '数组', '']
7+
dirs = ['动态规划','','回溯']
78
for a in dirs:
8-
md_list = glob(os.path.join(dir, a,'*.md'))
9+
md_list = glob(os.path.join(dir, a, '*.md'))
910
md_list = sorted(md_list)
1011
contents = []
1112
file_name = [i.split('/')[-1].split('.md')[0] for i in md_list]
1213
file_name = dict([(i.split('.')[0], i) for i in file_name])
1314
## 给总结md加入title
14-
with open(md_list[0],'r') as f:
15-
lines = f.readlines()
15+
with open(md_list[0], 'r') as f:
16+
lines = f.readlines()
1617
new_lines = []
1718
for i in lines:
1819
if i.strip():
@@ -36,5 +37,29 @@ for a in dirs:
3637

3738

3839

39-
1. 总结文档里填充名字
40+
```
41+
dirs = os.listdir('/Users/lixiang.2533/Desktop/Blogs/Leetcode/')
42+
dir = '/Users/lixiang.2533/Desktop/Blogs/Leetcode'
43+
dirs = ['二分法']
44+
for a in dirs:
45+
md_list = glob(os.path.join(dir, a, '*.md'))
46+
md_list = sorted(md_list)
47+
contents = []
48+
49+
for md in md_list:
50+
md_name = md.split('/')[-1]
51+
contents.append('### ' + md_name + "\n")
52+
with open(md, 'r') as f:
53+
contents.append(f.read() + "\n")
54+
55+
with open(os.path.join(dir, "{}总结.md".format(a)), "w") as f:
56+
f.writelines(contents)
57+
58+
```
59+
60+
61+
62+
63+
64+
4065

二分法/0.二分法总结.md

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,19 @@
11
- 找target
2-
- 33 搜索旋转排序数组
2+
- 69 x 的平方根:牛顿法
33
- 74 搜索二维矩阵
4-
- 367 有效的完全平方数
4+
- 367 有效的完全平方数:牛顿法
55
- 374 猜数字大小
66
- 704 二分查找
77
- 找边界
8-
- 34 在排序数组中查找元素的第一个和最后一个位置
8+
- 34 在排序数组中查找元素的第一个和最后一个位置:注意判断是否存在该元素
99
- 35 搜索插入位置
1010
- 278 第一个错误的版本
1111
- 441 排列硬币
12-
- 牛顿法
13-
- 69 x 的平方根
14-
- 367 有效的完全平方数
15-
- divide
16-
- 29 两数相除
17-
- 50 Pow(x, n)
1812
- 有技巧的二分法
19-
- 81 搜索旋转排序数组 II
20-
- 153 寻找旋转排序数组中的最小值
21-
- 162 寻找峰值
22-
- 240 搜索二维矩阵 II
13+
- 29 两数相除
14+
- 旋转数组
15+
- 33 搜索旋转排序数组:左右闭区间,
16+
- 81 搜索旋转排序数组 II:在33的基础上对所有mid=left/right无法判断搜索方向的场景跳过
17+
- 153 寻找旋转排序数组中的最小值:开区间,只能和右边界进行判断,避免从小值跳到大值
18+
- 162 寻找峰值:通过mid左右值大小判断搜索方向
19+
- 240 搜索二维矩阵 II:Z字形搜索(每个点都有唯一的搜索方向)

二分法/153. 寻找旋转排序数组中的最小值.md

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,20 +42,21 @@
4242
```python
4343
class Solution:
4444
def findMin(self, nums: List[int]) -> int:
45-
n = len(nums)
46-
start =0
47-
end = n-1
45+
start= 0
46+
end =len(nums)-1
4847
while start < end:
4948
mid = (start+end)//2
50-
if nums[mid] > nums[end]:
51-
start = mid+1
52-
else:
49+
if nums[mid] < nums[end]:
5350
end = mid
51+
else:
52+
start = mid+1
5453
return nums[start]
5554
```
5655

5756

5857

5958
Tips
6059

61-
注意这里左右边界不对称只能和右边界比较,因为
60+
1. 判断mid位置:因为前面的数组大,后面的数组小,所以这里左右不对称只能判断mid和右节点的关系
61+
62+
2. 这题不好用双闭区间来解,所以左闭右开,异动不对称,避免mid在右区间的时候被移动到左区间

二分法/240. 搜索二维矩阵 II.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77

88

9+
910
示例 1:
1011

1112
输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5
@@ -73,4 +74,4 @@ class Solution:
7374
return False
7475
```
7576

76-
因为行列都单调所以可以Z字型进行搜索
77+
因为行列都单调所以可以Z字型进行搜索,从第一行的最后一列开始搜索

二分法/33. 搜索旋转排序数组.md

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,29 +34,32 @@
3434

3535

3636

37+
3738
```python
3839
class Solution:
3940
def search(self, nums: List[int], target: int) -> int:
40-
start = 0
41+
start = 0
4142
end = len(nums)-1
42-
while start <= end:
43+
while start<=end:
4344
mid = (start+end)//2
4445
if nums[mid]==target:
45-
return mid
46-
47-
if nums[mid] < nums[start]:
48-
if nums[mid]<target<=nums[end]:
46+
return mid
47+
if nums[mid]< nums[start]:
48+
if nums[mid] < target <= nums[end]:
4949
start = mid+1
5050
else:
5151
end = mid-1
5252
else:
53-
if nums[start]<=target<nums[mid]:
53+
if nums[start] <= target<nums[mid]:
5454
end = mid-1
5555
else:
56-
start =mid+1
57-
return -1
56+
start = mid+1
57+
return -1
5858
```
5959

6060

6161

62-
1. 旋转数组相比非旋转数组,只多了一步对中间值比左边高还是低的判断
62+
搜索旋转数组分两步
63+
64+
1. 和左/右边界比较确认mid是在左边还是在右边
65+
2. 判断target的位置确认向左/右搜索

二分法/81. 搜索旋转排序数组 II.md

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828

2929

3030

31+
3132
进阶:
3233

3334
这是 搜索旋转排序数组 的延伸题目,本题中的 nums 可能包含重复元素。
@@ -43,31 +44,37 @@ class Solution:
4344
n = len(nums)
4445
start= 0
4546
end = n-1
46-
while start <= end:
47+
while start<=end:
4748
mid = (start+end)//2
4849
if nums[mid]==target:
49-
return True
50-
51-
if nums[mid]== nums[start] and nums[mid] == nums[end]:
50+
return True
51+
52+
if nums[start]==nums[mid]:
5253
start+=1
54+
continue
55+
56+
if nums[end]==nums[mid]:
5357
end-=1
54-
continue
58+
continue
5559

56-
if nums[mid] < nums[start]:
57-
if nums[mid]<target<=nums[end]:
60+
61+
if nums[mid]< nums[start]:
62+
if nums[mid] < target <= nums[end]:
5863
start = mid+1
5964
else:
6065
end = mid-1
6166
else:
62-
if nums[start]<=target<nums[mid]:
67+
if nums[start] <= target<nums[mid]:
6368
end = mid-1
6469
else:
65-
start =mid+1
70+
start = mid+1
6671
return False
6772
```
6873

6974

7075

7176
Tips
7277

73-
1. 在33题的基础上,因为数值可能存在重复,所以当mid和左右边界都相同的时候无法判断mid是否在被旋转的一遍,这个时候只能收缩两边的边界继续判断
78+
1. 在33题的基础上,因为数值可能存在重复,所以当左边界或者右边界和mid相同的时候都向内收缩一步再进行判断
79+
1.
80+

0 commit comments

Comments
 (0)