Skip to content

Commit 270bb9e

Browse files
committed
note
1 parent 6c5043e commit 270bb9e

File tree

125 files changed

+2111
-839
lines changed

Some content is hidden

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

125 files changed

+2111
-839
lines changed
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
2+
3+
class ListNode:
4+
def __init__(self, x):
5+
self.val = x
6+
self.next = None
7+
8+
9+
def make_list(arr: list):
10+
head_node = None
11+
p_node = None
12+
for a in arr:
13+
new_node = ListNode(a)
14+
if head_node is None:
15+
head_node = new_node
16+
p_node = new_node
17+
else:
18+
p_node.next = new_node
19+
p_node = new_node
20+
return head_node
21+
22+
23+
def print_list(head: ListNode):
24+
while head is not None:
25+
print(head.val, end=',')
26+
head = head.next
27+
28+
29+
class Solution:
30+
def two_list_sum(self, head1: ListNode, head2: ListNode):
31+
p = 0
32+
sumlist = ListNode(0)
33+
pre = sumlist
34+
# 长度可能不一样,只要有一个有值,就得继续
35+
while head1 is not None or head2 is not None:
36+
# 分3种情况讨论
37+
if head1 is not None and head2 is not None:
38+
v = head1.val + head2.val + p
39+
head1 = head1.next
40+
head2 = head2.next
41+
elif head1 is not None and head2 is None:
42+
v = head1.val + p
43+
head1 = head1.next
44+
else:
45+
v = head2.val + p
46+
head2 = head2.next
47+
p = 0
48+
if v > 9:
49+
v = v - 10
50+
p = 1
51+
node = ListNode(v)
52+
pre.next = node
53+
pre = node
54+
# 最为关键,如果前面一步还能进位,不要了?
55+
if p == 1:
56+
node = ListNode(1)
57+
pre.next = node
58+
59+
return sumlist
60+
61+
62+
s = Solution()
63+
a = [3, 1, 5]
64+
a2 = [5, 9, 5, 9]
65+
head1 = make_list(a)
66+
head2 = make_list(a2)
67+
print_list(head1)
68+
print()
69+
print_list(head2)
70+
print()
71+
72+
# res_sum.next ? 不需要头节点的伪值
73+
res_sum = s.two_list_sum(head1, head2).next
74+
print_list(res_sum)
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
'''
2+
合并两个排序数组,然后取中位数
3+
'''
4+
5+
6+
def merge(A, B):
7+
lena = len(A)
8+
lenb = len(B)
9+
lenc = lena + lenb
10+
C = [0] * lenc
11+
i, j = 0, 0
12+
c = 0
13+
while c < lenc and j < lenb and i < lena:
14+
if A[i] > B[j]:
15+
C[c] = B[j]
16+
j += 1
17+
else:
18+
C[c] = A[i]
19+
i += 1
20+
c += 1
21+
while j < lenb:
22+
C[c] = B[j]
23+
j += 1
24+
while i < lena:
25+
C[c] = A[i]
26+
i += 1
27+
return C
28+
29+
30+
def median(A):
31+
if len(A) % 2 == 0:
32+
mid1 = int(len(A) / 2) - 1
33+
mid2 = int(len(A) / 2)
34+
return (A[mid1] + A[mid2]) / 2
35+
else:
36+
mid = int(len(A) / 2)
37+
return A[mid]
38+
39+
40+
'''
41+
先合并,然后判断单、双,去中位数
42+
'''
43+
44+
A = [1, 2, 3, 4, 5, 6]
45+
B = [2, 3, 4, 5]
46+
C = merge(A, B)
47+
print(C)
48+
print(median(C))
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
class Solution:
2+
def search(self, A):
3+
if A is None:
4+
return -1
5+
start = 0
6+
end = len(A) - 1
7+
mid = 0
8+
while start + 1 < end:
9+
mid = start + int((end - start) / 2)
10+
# 在右边 片段
11+
if A[mid] < A[end]:
12+
end = mid
13+
else:
14+
# 在左边 片段
15+
start = mid
16+
if A[start] < A[end]:
17+
return A[start]
18+
else:
19+
return A[end]
20+
21+
22+
# 从小到大的数组被旋转
23+
# 二分搜索,穷举旋转的时候,mid坐在左、右边情况
24+
s = Solution()
25+
print(s.search([3, 4, 4, 5, 7, 8, 1, 2]))
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
class Solution:
2+
def search(self, A, target):
3+
if A is None:
4+
return -1
5+
start = 0
6+
end = len(A) - 1
7+
mid = 0
8+
while start + 1 < end:
9+
# 取中点
10+
mid = start + int((end - start) / 2)
11+
# 如果找到直接返回
12+
if target == A[mid]:
13+
return mid
14+
# 这一步很关键,可以区分mid在旋转后两段有序数组中的哪一段
15+
if A[start] < A[mid]:
16+
# 关键,显然此时target在mid左边,那么缩小区间为end = mid
17+
if A[start] <= target and target < A[mid]:
18+
end = mid
19+
else: # 显然此时target在mid右,那么缩小区间为 start = mid
20+
start = mid
21+
else:
22+
# 关键
23+
if A[mid] < target and target <= A[end]:
24+
start = mid
25+
else:
26+
end = mid
27+
# 此时就剩start、end两个点有可能了
28+
if A[start] == target:
29+
return start
30+
if A[end] == target:
31+
return end
32+
return -1
33+
34+
35+
# 输入旋转排序数组
36+
# 搜索给定值的位置
37+
s = Solution()
38+
print(s.search([8, 9, 10, 11, 12, 13, 14, 4, 5, 6], 6))
Lines changed: 13 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,18 @@
1-
class Solution(object):
2-
# def plusOne(self, digits):
3-
# """
4-
# :type digits: List[int]
5-
# :rtype: List[int]
6-
# """
7-
# ls = len(digits)
8-
# curr, pos = 1, 0
9-
# while pos < ls:
10-
# index = ls - pos - 1
11-
# curr += digits[index]
12-
# digits[index] = curr % 10
13-
# curr /= 10
14-
# if curr == 0:
15-
# # do not need to continue
16-
# break
17-
# pos += 1
18-
# if curr > 0:
19-
# digits.insert(0, curr)
20-
# return digits
211

2+
class Solution:
223
def plusOne(self, digits):
23-
ls = len(digits)
24-
for index in reversed(range(ls)):
25-
if digits[index] < 9:
26-
digits[index] += 1
27-
# do not need to continue
4+
n = len(digits)
5+
for i in range(n - 1, -1, -1):
6+
if digits[i] < 9:
7+
digits[i] += 1
288
return digits
29-
else:
30-
# 10
31-
digits[index] = 0
32-
digits.insert(0, 1)
33-
return digits
9+
digits[i] = 0
3410

11+
res = [0] * (n + 1)
12+
res[0] = 1
13+
return res
3514

15+
16+
s = Solution()
17+
print(s.plusOne([9, 9, 9]))
18+
print(s.plusOne([1, 2, 9]))
Lines changed: 21 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,24 @@
11
class Solution:
2-
# def mySqrt(self, x):
3-
# """
4-
# :type x: int
5-
# :rtype: int
6-
# """
7-
# if x == 0:
8-
# return 0
9-
# low = 0
10-
# high = x
11-
# last = x
12-
# while high >= low:
13-
# mid = (low + high) / 2
14-
# temp = mid * mid
15-
# if temp == x:
16-
# return mid
17-
# elif temp < x:
18-
# low = mid + 1
19-
# last = mid
20-
# else:
21-
# high = mid - 1
22-
# return last
23-
2+
# @param {integer} x
3+
# @return {integer}
244
def mySqrt(self, x):
25-
# sqrt(x) = 2 * sqrt(x / 4) for n % 4 == 0
26-
# sqrt(x) = 1 + 2 * sqrt(x / 4) for n % 4 != 0
27-
if x == 0:
5+
if x < 0:
6+
return -1
7+
elif x == 0:
288
return 0
29-
if x < 4:
30-
return 1
31-
res = 2 * self.mySqrt(x / 4)
32-
# (res + 1) * (res + 1) >= 0 for avoiding overflow
33-
if (res + 1) * (res + 1) <= x and (res + 1) * (res + 1) >= 0:
34-
return res + 1
35-
return res
9+
10+
start, end = 1, x
11+
while start + 1 < end:
12+
mid = start + (end - start) / 2
13+
if mid ** 2 == x:
14+
return mid
15+
# mid此时过大,那真实值在mid左边,所以end=mid逼近
16+
elif mid ** 2 > x:
17+
end = mid
18+
else: # mid此时小于目标,那么真实在右边,所以start逼近
19+
start = mid
20+
return start
21+
22+
23+
s = Solution()
24+
print(s.mySqrt(9))
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
class Solution:
2+
'''
3+
一次二分搜索,把矩阵当数组看
4+
'''
5+
6+
def search_matrix(self, matrix, target):
7+
if not matrix or not matrix[0]:
8+
return False
9+
# 横,纵
10+
m, n = len(matrix), len(matrix[0])
11+
# 把矩阵当数组!
12+
st, ed = 0, m * n - 1
13+
while st + 1 < ed:
14+
mid = int((st + ed) / 2)
15+
# int(mid / n)取得1维索引,mid % n取得2维索引
16+
v = matrix[int(mid / n)][mid % n]
17+
if v == target:
18+
return True, [int(mid / n), mid % n]
19+
elif v < target:
20+
st = mid
21+
else:
22+
ed = mid
23+
if matrix[int(st / n)][st % n] == target:
24+
return True, [int(st / n), st % n]
25+
elif matrix[int(ed / n)][ed % n] == target:
26+
return True, [int(ed / n), ed % n]
27+
return False, [-1, -1]
28+
29+
30+
n = [
31+
[1, 3, 5, 7],
32+
[10, 11, 16, 20],
33+
[23, 30, 34, 50]
34+
]
35+
36+
s = Solution()
37+
print(s.search_matrix(n, 16))
38+

0 commit comments

Comments
 (0)