Skip to content

Commit 7acba03

Browse files
committed
regular leetcode
1 parent 82b2e33 commit 7acba03

4 files changed

+104
-2
lines changed

001._two_sum.md

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,19 @@
99
Easy
1010

1111

12+
思路
1213

13-
觉得异常聪明的AC解法
14+
可以用O(n^2) loop
15+
16+
但是也可以牺牲空间换取时间,异常聪明的AC解法
17+
18+
```
19+
2 7 11 15
20+
不存在 存在之中
21+
lookup {2:0} [0,1]
22+
```
23+
24+
一点字典有了这个 `target - 当前数字`,找到它的index和当前index一起返回。
1425

1526

1627
```
@@ -28,3 +39,5 @@ class Solution(object):
2839
lookup[num] = i
2940
return []
3041
```
42+
43+

004._median_of_two_sorted_arrays.md

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
###4. Median of Two Sorted Arrays
2+
3+
题目:
4+
<https://leetcode.com/problems/median-of-two-sorted-arrays/>
5+
6+
7+
难度:
8+
9+
Hard
10+
11+
一看到的时候,觉得跟CLRS书上的一道习题类似
12+
求X[1....n] Y[1....n] 的 median
13+
14+
divide and conquer
15+
16+
- 如果X[n/2] == Y[n/2],则找到,return
17+
- 如果X[n/2] < Y[n/2],找X[n/2+1….n]和Y[1,2…n/2]之间
18+
- 否则找X[1..n/2]和Y[n/2…n]
19+
20+
但是实际上不同,这里需要考虑的问题更多:
21+
22+
- 两个数组长度不一样
23+
- 并不是只找一个median,如果median有两个,需要算平均
24+
25+
思路
26+
27+
把它转化成经典的findKth问题
28+
29+
参考: <http://chaoren.is-programmer.com/posts/42890.html>
30+
31+
32+
首先转成求A和B数组中第k小的数的问题, 然后用k/2在A和B中分别找。
33+
34+
35+
比如k = 6, 分别看A和B中的第3个数, 已知 A1 < A2 < A3 < A4 < A5... 和 B1 < B2 < B3 < B4 < B5..., 如果A3 <= B3, 那么第6小的数肯定不会是A1, A2, A3, 因为最多有两个数小于A1, 三个数小于A2, 四个数小于A3。
36+
37+
38+
39+
B3至少大于5个数, 所以第6小的数有可能是B1 (A1 < A2 < A3 < A4 < A5 < B1), 有可能是B2 (A1 < A2 < A3 < B1 < A4 < B2), 有可能是B3 (A1 < A2 < A3 < B1 < B2 < B3)。那就可以排除掉A1, A2, A3, 转成求A4, A5, ... B1, B2, B3, ...这些数中第3小的数的问题, k就被减半了。每次都假设A的元素个数少, pa = min(k/2, lenA)的结果可能导致k == 1或A空, 这两种情况都是终止条件。
40+
41+
42+
43+
```
44+
class Solution(object):
45+
def findMedianSortedArrays(self, nums1, nums2):
46+
"""
47+
:type nums1: List[int]
48+
:type nums2: List[int]
49+
:rtype: float
50+
"""
51+
n = len(nums1) + len(nums2)
52+
if n % 2 == 1:
53+
return self.findKth(nums1, nums2, n / 2 + 1)
54+
else:
55+
smaller = self.findKth(nums1, nums2, n / 2)
56+
bigger = self.findKth(nums1, nums2, n / 2 + 1)
57+
return (smaller + bigger) / 2.0
58+
59+
60+
def findKth(self, A, B, k):
61+
if len(A) == 0:
62+
return B[k-1]
63+
if len(B) == 0:
64+
return A[k-1]
65+
if k == 1 :
66+
return min(A[0],B[0])
67+
68+
69+
a = A[ k / 2 - 1 ] if len(A) >= k / 2 else None
70+
b = B[ k / 2 - 1 ] if len(B) >= k / 2 else None
71+
72+
if b is None or (a is not None and a < b):
73+
return self.findKth(A[k/2:], B, k - k/2)
74+
return self.findKth(A, B[k/2:],k - k/2)
75+
76+
```
77+
78+
79+
80+
81+

017._letter_combinations_of_a_phone_number.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@
1010
Medium
1111

1212

13+
思路:
14+
15+
- hash table一个,用来对应digit -> letter
16+
- s用来记录结果,每次从digits里面去一个,然后寻找其可能的char,加到s中,digits长度减小
17+
- digits长度为0时候,把它加入结果
18+
1319

1420

1521
```

082._remove_duplicates_from_sorted_list_ii.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,6 @@ class Solution(object):
4444
```
4545

4646

47-
谷歌一下,更省时间的方法是用一个prev 和 cur 指针,然后用一个bool来记录是否duplicate,这样loop一次即可解决问题。
47+
谷歌一下,更省时间的方法是用一个prev 和 cur 指针,然后用一个bool来记录是否duplicate,这样loop一次即可解决问题。
48+
49+
to be 写出来

0 commit comments

Comments
 (0)