
获得徽章 20
- #刷题交流# 第26天:阿D的最佳飞行路线探索
可以使用广度优先搜索(BFS)算法来解决这个问题。BFS适用于无权图中的最短路径问题,并且可以保证我们找到的是从起点到终点的最短路径。具体步骤如下:
1. 构建一个邻接表表示的图,用来存储哪些机场可以直接飞往。
2. 使用队列来进行广度优先搜索,同时用一个集合来记录已经访问过的机场以避免重复访问。
3. 从起点开始进行搜索,每次从队列中取出一个机场,并检查其所有邻居(包括左右相邻的机场和相同航空公司的其他机场)。对于每一个未访问过的邻居,将其加入队列并标记为已访问。
4. 每次从一个机场飞往另一个机场时,起飞次数加1。
5. 当到达终点时,返回当前的起飞次数作为答案。展开评论点赞 - #刷题交流# 第25天:小C的类二进制拼图
解题思路:这个问题可以通过分析类二进制数的性质来解决。类二进制数只包含0和1两个数字,因此任何位置上的数字如果不是0就是1。对于给定的一个正整数n(以字符串形式给出),要找到最少的类二进制数之和等于n,关键在于观察n中每一位的最大值。
对于每一个位上的数字,如果它是k (1 ≤ k ≤ 9),那么就需要k个类二进制数在该位上贡献1才能满足条件。这是因为每个类二进制数在该位上只能提供0或1的贡献。所以,对于一个给定的数字n,我们只需要找出它所有位数中最大的数字,这个数字就代表了最少需要多少个类二进制数相加才能得到n。
根据这个思路,我们可以直接遍历字符串n,找出其中的最大数字,这个最大数字就是答案。
🌲一行代码解决:max_digit = max([int(digit) for digit in n])展开评论点赞 - #刷题交流# 第24天:五子棋获胜策略
算法设计
为了实现此问题可以采取以下步骤:
1. 遍历棋盘:需要遍历整个棋盘,检查每一个空位(值为0的地方),看是否可以在该处放置一枚新的白色棋子(值设为1)。
2. 检测五子连珠:对于每个空位,编写一个辅助函数,它会沿着四个主要方向(横向、纵向、左斜向和右斜向)进行检查。在每个方向上,我们会从当前点开始,向前和向后各检查四个位置,总共九个位置,以确定是否存在五个连续的白色棋子。
3.回溯::每次尝试放置新棋子后,如果发现可以形成五子连线,则记录下该位置;之后,必须移除这个假设的棋子(即恢复原状),以便继续测试其他位置。
4.结果输出:最终,我们会返回所有符合条件的位置列表,这些位置是通过添加一个新的白色棋子而能形成五子连线的地方。展开赞过21 - #刷题交流# 第21天:小D的`abc`变换问题
解题思路:
首先,定义一个函数 changeLetter,它的作用是根据给定的字符进行对应的变换。具体来说,就是通过判断传入的字符是‘a’、‘b’还是‘c’,然后分别返回对应的变换后的字符串,比如传入‘a’就返回‘bc’,传入‘b’返回‘ca’,传入‘c’返回‘ab’。
定义另一个函数 changeLetterList。它接收原始字符串 s 和操作次数 k 作为参数。在函数内部,通过一个循环来重复进行操作,循环次数就是给定的 k 值。每次循环时,会利用生成器表达式和 join 函数,将原字符串中的每个字符都经过 changeLetter 函数进行变换,然后把变换后的结果拼接起来,得到新的字符串,并且将新字符串赋值给原字符串变量,以便下一次循环继续基于新的状态进行变换。
核心代码:
def changeLetter(alpha):
if alpha == 'a':
alpha = 'bc'
elif alpha == 'b':
alpha = 'ca'
elif alpha == 'c':
alpha ='ab'
return alpha
def changeLetterList(s,k):
new_s = ''
for _ in range(k):
new_s = ''.join(changeLetter(ch) for ch in s)
s = new_s
return new_s
21天,21天,加油⛽️!!!展开赞过评论1 - #刷题交流# 第20天:股票市场交易策略优化
为了帮助小R计算出在遵守交易规则的情况下能够获得的最大利润,我们可以使用动态规划(Dynamic Programming, DP)的方法来解决问题。我们定义三个状态:
● hold:表示持有股票时的最大收益。
● sell:表示卖出股票后的最大收益。
● rest:表示处于冷冻期或选择休息(不买卖)时的最大收益。
这三个状态之间的转移方程如下:
● hold[i] = max(hold[i - 1], rest[i - 1] - price[i]):要么保持之前的持有状态,要么从冷冻期后购买新股票。
● sell[i] = hold[i - 1] + price[i]:只能从前一天的持有状态转变而来,表示今天卖出股票。
● rest[i] = max(rest[i - 1], sell[i - 1]):要么从前一天的冷冻期或卖出状态转变而来,表示今天不进行任何操作。
初始条件为:
● hold[0] = -price[0]:第一天买入股票后的收益。
● sell[0] = 0:第一天没有可以卖出的股票。
● rest[0] = 0:第一天没有之前的操作,所以休息的收益为0。
最后的结果是最后一天的 sell 和 rest 状态中的较大值,因为如果最后一天持有股票则不是最优解(除非最后一日的股价为负,但这是题目所不允许的情况)。
核心代码:
# 初始化状态
hold, sell, rest = -stocks[0], 0, 0
for i in range(1, len(stocks)):
# 必须先保存旧的 hold 值,因为它会被新的 hold 值覆盖,而 sell 需要使用旧的 hold 值
old_hold = hold
hold = max(hold, rest - stocks[i])
rest = max(rest, sell)
sell = old_hold + stocks[i]
# 返回最后一天 sell 或 rest 状态中的较大值
return max(sell, rest)
20天了,加油⛽️ 不积跬步,无以至千里;不积小流,无以成江海。展开等人赞过46 - #刷题交流# 第19天:最少前缀操作问题
暴力枚举前缀长度:
○ 我们首先考虑 T 的所有可能前缀,从长度为 0 到 min(len(S), len(T))。对于每个可能的前缀长度 i,我们取出 S 的前 i 个字符组成 cur_s。
○ 计算将 S 变为长度为 i 的 T 的前缀所需的操作次数。操作次数初始化为将 S 截断到长度 i 所需删除末尾字符的次数,即 len(S) - i。
○ 然后,我们逐个比较 cur_s 和 T 的前 i 个字符,如果字符不相同,则需要一次修改操作,将操作次数加 1。
○ 最后,我们更新全局的最少操作次数 min_op。
核心代码:
# 枚举T的可能前缀长度
for i in range(min(m, n) + 1):
cur_s = S[:i]
op_count = len(S) - i
# 计算当前前缀下的操作次数
for j in range(len(cur_s)):
if cur_s[j]!= T[j]:
op_count += 1
# 更新最少操作次数
min_op = min(min_op, op_count)
加油⛽️加油,19天了。
展开赞过评论2 - #刷题交流# 第18天:观光景点组合得分问题
要找到一对观光景点 (i < j) 的最高得分,我们可以使用一个更高效的方法,而不是对每个可能的组合都进行两两比较。关键在于我们可以通过一次遍历就解决问题,同时维护一个当前的最佳选择。
对于任意一对 (i, j),得分计算公式为:values[i] + values[j] + i - j,可以重写为 (values[i] + i) + (values[j] - j)。因此,当我们在遍历数组时,我们可以一边遍历一边维护最大值 values[i] + i,然后在每次迭代中计算当前的 values[j] - j 并与之前的最大值相加得到可能的最高分。
解决问题的算法步骤如下:
1. 初始化变量 max_score 用于保存最高的观光组合得分,设为负无穷大或一个非常小的数。
2. 初始化变量 max_value_plus_index 保存到目前为止遇到的最大 values[i] + i 值。
3. 开始遍历数组,从第二个元素开始(因为至少需要两个景点来形成组合)。
4. 对于每个元素 values[j],根据公式 (values[j] - j) + max_value_plus_index 计算当前得分,并更新 max_score。
5. 更新 max_value_plus_index 为 max(max_value_plus_index, values[j] + j),确保它总是包含到目前为止的最大 values[i] + i。
6. 遍历结束后,max_score 就是所求的最高得分。
这个算法的时间复杂度是 O(n),其中 n 是数组的长度,因为我们只遍历了一次数组。空间复杂度是 O(1),因为我们只用了常量级别的额外空间。
第18天了,加油!!!展开评论点赞 - #刷题交流# 第17天:石子移动问题
分析
小S的石子移动游戏可以分解为以下步骤:
1. 定义端点石子:最左端和最右端的石子称为端点石子。
2. 操作目标:将石子移动到其他未占用的位置,使得所有石子的位置变得连续。
3. 计算最大移动次数:
○ 为了达到最大移动次数,可以将端点石子移动到尽可能远的位置,使得每次移动后仍然有一个端点石子,直到石子的位置变得连续。
思路
1. 单石子处理:if len(stones) <= 1,若只有一个石子,则直接返回 0。
2. 排序:首先对石子位置的数组 stones 进行排序,这样便于计算石子的位置间隔。
3. 计算两端的间隔:考虑从左端或右端开始逐步移动端点石子,直到所有石子的位置变得连续。
4. 最大移动次数:通过计算从左端到右端的间隔,以及移出端点石子所需的步数,得到最大可能的移动次数。
17天,今日冬至!加油⛽️展开评论点赞