Skip to content

Commit f3c6108

Browse files
committed
feat: 20260229 check in
1 parent f4e6a58 commit f3c6108

2 files changed

Lines changed: 134 additions & 0 deletions

File tree

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
# [1689. 十-二进制数的最少数目](https://leetcode.cn/problems/partitioning-into-minimum-number-of-deci-binary-numbers/description/)
2+
3+
> **日期**:2026-03-01
4+
> **所用时间**:2min
5+
> **知识点**:贪心
6+
7+
## 1. 题目描述
8+
9+
**十-二进制数**(deci-binary)是指一个十进制数,且**每一位只能是 0 或 1**,且没有前导零。例如:`101``1100` 是十-二进制数,而 `112``3001` 不是。
10+
11+
给定一个字符串 `n`,表示一个正整数(十进制)。问:至少需要**多少个正的十-二进制数**相加,才能恰好等于 `n` 所表示的数?返回这个最少数目。
12+
13+
**示例 1:**
14+
15+
- **输入**:n = "32"
16+
- **输出**:3
17+
- **解释**:10 + 11 + 11 = 32,至少需要 3 个十-二进制数。
18+
19+
**示例 2:**
20+
21+
- **输入**:n = "82734"
22+
- **输出**:8
23+
- **解释**:至少需要 8 个十-二进制数相加得到 82734。
24+
25+
**示例 3:**
26+
27+
- **输入**:n = "27346209830709182346"
28+
- **输出**:9
29+
- **解释**:至少需要 9 个十-二进制数相加得到该数。
30+
31+
**约束:**
32+
33+
- $1 \le \text{n.length} \le 10^5$
34+
- `n` 只包含数字,且没有前导零。
35+
36+
---
37+
38+
## 2. 贪心
39+
40+
**思路:**
41+
42+
每个十-二进制数在**每一位**上最多只能贡献 0 或 1。因此,若 `n` 的某一位数字为 $d$,则至少需要 $d$ 个十-二进制数才能在该位上凑出 $d$。对所有位取最大值,即:**答案 = 字符串 `n` 中出现的最大数字**
43+
44+
例如 `n = "32"`:个位是 2、十位是 3,最大数字为 3,所以至少需要 3 个数(如 10 + 11 + 11)。
45+
46+
实现:遍历 `n` 的每个字符(或直接对字符串取 `max(n)`),再转为整数即可。
47+
48+
**复杂度分析:**
49+
50+
- 时间复杂度:$O(len(n))$(遍历字符串,或 `max(n)` 内部遍历)
51+
- 空间复杂度:$O(1)$
52+
53+
**Python3**
54+
55+
```python
56+
class Solution:
57+
def minPartitions(self, n: str) -> int:
58+
return int(max(n))
59+
```
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
# [3573. 买卖股票的最佳时机 V](https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-v/description/)
2+
3+
> **日期**:2025-02-06
4+
> **所用时间**:10min
5+
> **知识点**:动态规划、记忆化搜索
6+
7+
## 1. 题目描述
8+
9+
给定一个整数数组 `prices`,其中 `prices[i]` 表示第 `i` 天的股票价格,以及一个整数 `k`。要求计算能够获得的最大利润。
10+
11+
**限制条件:**
12+
13+
- 最多可以完成 **k 笔** 交易(一笔交易指一次买入 + 一次卖出)。
14+
- 不能同时参与多笔交易:再次买入前必须先卖出当前持有的股票。
15+
- 本题在「买卖股票的最佳时机 IV」的基础上,对**状态**有额外约定(如是否处于持仓、是否处于某类后续状态等),需用多维度状态表示。
16+
17+
**示例 1:**
18+
19+
- **输入**:prices = [2,4,1], k = 2
20+
- **输出**:2
21+
- **解释**:第 1 天买入(价格 2),第 2 天卖出(价格 4),利润 2。
22+
23+
**示例 2:**
24+
25+
- **输入**:prices = [3,2,6,5,0,3], k = 2
26+
- **输出**:7
27+
- **解释**:第 2 天买入(价格 2),第 3 天卖出(价格 6),利润 4;第 5 天买入(价格 0),第 6 天卖出(价格 3),利润 3。总利润 7。
28+
29+
**约束:**
30+
31+
- $1 \le k \le 100$
32+
- $1 \le \text{prices.length} \le 1000$
33+
- $0 \le \text{prices}[i] \le 1000$
34+
35+
---
36+
37+
## 2. 记忆化搜索
38+
39+
**思路:**
40+
41+
在「188. 买卖股票的最佳时机 IV」的「最多 k 笔交易」基础上,用**三态**表示当前所处阶段:`(buy, seil)` 两个布尔量组合出「空仓」「持仓」「另一状态」(如与卖出后的阶段相关)。用**记忆化搜索**`dfs(i, j, buy, seil)` 表示考虑前 `i+1` 天、剩余 `j` 笔交易、当前处于 `(buy, seil)` 状态时的最大利润。
42+
43+
- **边界**`j == 0` 时不能再交易,返回 0;`i < 0` 时若仍持仓或处于 seil 状态为非法(返回 $-\infty$),否则返回 0。
44+
- **转移**
45+
-`buy == True`:可继续持仓,或在当前天「买入」并消耗一次交易(`dfs(i-1, j-1, False, False) - prices[i]`)。
46+
-`seil == True`:可保持当前状态,或在当前天「卖出」并消耗一次交易(`dfs(i-1, j-1, False, False) + prices[i]`)。
47+
- 若两者均为 False(空仓):可继续空仓,或从「持仓」转移过来并卖出(+prices[i]),或从「另一状态」转移过来并买入(-prices[i])。
48+
49+
答案为 `dfs(len(prices)-1, k, False, False)`,即从最后一天、剩余 k 笔、空仓出发的最大利润。
50+
51+
**复杂度分析:**
52+
53+
- 时间复杂度:$O(n \cdot k)$(状态数 $O(n \cdot k \cdot 4)$,每状态 $O(1)$ 转移)
54+
- 空间复杂度:$O(n \cdot k)$(递归栈与 cache)
55+
56+
**Python3**
57+
58+
```python
59+
class Solution:
60+
def maximumProfit(self, prices: List[int], k: int) -> int:
61+
@cache
62+
def dfs(i, j, buy, seil):
63+
if j == 0:
64+
return 0
65+
if i < 0:
66+
return -inf if buy or seil else 0
67+
if buy:
68+
return max(dfs(i - 1, j, True, False), dfs(i - 1, j - 1, False, False) - prices[i])
69+
if seil:
70+
return max(dfs(i - 1, j, False, True), dfs(i - 1, j - 1, False, False) + prices[i])
71+
return max(dfs(i - 1, j, False, False), dfs(i - 1, j, True, False) + prices[i], dfs(i - 1, j, False, True) - prices[i])
72+
ans = dfs(len(prices) - 1, k, False, False)
73+
dfs.cache_clear()
74+
return ans
75+
```

0 commit comments

Comments
 (0)