Skip to content

Commit 112d5b9

Browse files
committed
add new solution
1 parent 4a3de00 commit 112d5b9

File tree

6 files changed

+87
-20
lines changed

6 files changed

+87
-20
lines changed

动态规划/1143. 最长公共子序列.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
```python
4141
class Solution:
4242
def longestCommonSubsequence(self, text1: str, text2: str) -> int:
43-
max_len = 0
43+
4444
l1 = len(text1)
4545
l2 = len(text2)
4646
dp = [[0] *(l2+1)for i in range(l1+1)]

双指针/0.双指针总结.md

+1
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,4 @@
3434
- [ ] 28 实现 strStr() :KMP算法
3535
- [ ] 31 下一个排列
3636
- [ ] 75 颜色分类:双指针/三指针swap
37+
- [ ] 264 丑数II

双指针/264.丑数II.md

+13-18
Original file line numberDiff line numberDiff line change
@@ -30,23 +30,17 @@
3030
```python
3131
class Solution:
3232
def nthUglyNumber(self, n: int) -> int:
33-
ans = [0] * (n+1)
34-
ans[1] = 1
35-
idx1, idx2,idx3 = 1,1,1
36-
idx = 2
37-
while idx<=n:
38-
a,b,c = ans[idx1] * 2, ans[idx2]*3, ans[idx3]*5
39-
m = min(a,b,c)
40-
if m==a:
41-
idx1+=1
42-
if m==b:
43-
idx2+=1
44-
if m==c:
45-
idx3+=1
46-
ans[idx]=m
47-
idx+=1
48-
print(ans)
49-
return ans[n]
33+
index2, index3, index5=0,0,0
34+
dp = [1] * n
35+
for i in range(1,n):
36+
dp[i] = min(dp[index2]*2, dp[index3]*3, dp[index5]*5)
37+
if dp[i]==dp[index2]*2:
38+
index2+=1
39+
if dp[i] == dp[index3] * 3:
40+
index3 += 1
41+
if dp[i]==dp[index5]*5:
42+
index5+=1
43+
return dp[-1]
5044
```
5145

5246

@@ -56,4 +50,5 @@ class Solution:
5650
Tips
5751

5852
1. 归并排序问题,这里放在双指针了,因为需要三个指针分别指向丑数*2, 丑数*3,丑数*5下一个最小的位置,合并是每次选择最小的并移动指针
59-
2. 需要注意的是因为同一个丑数可能来源于不同的指针,例如6,同时是丑数2的倍数,也是丑数3的倍数,所以指针移动时是不是互斥的
53+
2. 需要注意的是因为同一个丑数可能来源于不同的指针,例如6,同时是丑数2的倍数,也是丑数3的倍数,所以指针移动时是不是互斥的
54+

排序/0.排序总结.md

+2
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,8 @@ def merge_sort(nums):
138138

139139
- [ ] 215 数组中的第K个最大元素
140140

141+
- [ ] 347 前K个高频元素
142+
141143
- [ ] 703 数据流中的第K大元素
142144

143145
- [ ] 40剑指offer. 最小的k个数

排序/347 前K个高频元素.md

+69
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
```
2+
# 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
3+
#
4+
#
5+
#
6+
# 示例 1:
7+
#
8+
#
9+
# 输入: nums = [1,1,1,2,2,3], k = 2
10+
# 输出: [1,2]
11+
#
12+
#
13+
# 示例 2:
14+
#
15+
#
16+
# 输入: nums = [1], k = 1
17+
# 输出: [1]
18+
#
19+
#
20+
#
21+
# 提示:
22+
#
23+
#
24+
# 1 <= nums.length <= 105
25+
# k 的取值范围是 [1, 数组中不相同的元素的个数]
26+
# 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的
27+
#
28+
#
29+
#
30+
#
31+
# 进阶:你所设计算法的时间复杂度 必须 优于 O(n log n) ,其中 n 是数组大小。
32+
# Related Topics 数组 哈希表 分治 桶排序 计数 快速选择 排序 堆(优先队列)
33+
# 👍 1067 👎 0
34+
35+
36+
# leetcode submit region begin(Prohibit modification and deletion)
37+
class Solution:
38+
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
39+
counter = collections.Counter(nums)
40+
counter = list(counter.items())
41+
42+
def topK(nums, k, left, right):
43+
def partition(nums, left, right):
44+
key = left
45+
while left < right:
46+
while left < right and nums[right][1] >= nums[key][1]:
47+
right -= 1
48+
while left < right and nums[left][1] <= nums[key][1]:
49+
left += 1
50+
nums[right], nums[left] = nums[left], nums[right]
51+
nums[key], nums[left] = nums[left], nums[key]
52+
return left
53+
54+
if left >= right:
55+
return
56+
mid = partition(nums, left, right)
57+
if mid == k:
58+
return
59+
elif mid > k:
60+
topK(nums, k, left, mid-1)
61+
else:
62+
topK(nums, k, mid+1, right)
63+
l = len(counter)
64+
topK(counter, l-k, 0, len(counter) - 1)
65+
return [i[0] for i in counter[-k:]]
66+
# leetcode submit region end(Prohibit modification and deletion)
67+
```
68+
69+
快速跑徐

树/0.总结.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
- 前序遍历
22
- [ ] 114 二叉树展开为链表
3-
43
- [ ] 129 求根节点到叶节点数字之和
54
- [ ] 144 二叉树的前序遍历
65
- [ ] 257 二叉树的所有路径
6+
- [ ] 437 路经总和 III
77
- [ ] 589 N 叉树的前序遍历
88
- [ ] 606 根据二叉树构建字符串
99
- [ ] 653 两数之和 IV

0 commit comments

Comments
 (0)