记录下刷题过程思路,如有错误,希望多多指教
题目来自豆包MarsCode AI 刷题题库
题目描述
小C是一名股票交易员,最近他关注某只股票的价格波动。给定该股票连续N天的价格列表
stockPrices,你需要为小C生成一个新列表,每个位置的值表示从那天起至少需要等待多少天才能看到价格上涨。如果没有上涨的情况,则对应位置的值为0。
解决
1.简单粗暴:使用循环解决
思路
根据题目给的样例[33, 34, 14, 12, 16],结合要求是至少,只要找到离基准价格最近的比基准价格大的数字下标即可,直接循环查找比较就可以了。
外层循环作为比较基准,内层循环循环该位置后的价格,只要大于基准,就返回两个数下标之差作为至少等待天数。
代码
def solution(N: int, stockPrices: list) -> list:
res=[0]*N # 结果列表
for i in range(len(stockPrices)): # 外层循环定位比较基准
count=0 # 记录至少等待天数
for j in range(i+1,len(stockPrices)):
if stockPrices[i]<stockPrices[j]:
count=j-i # 返回下标之差
break
res[i]=count
return res
- 时间复杂度:经过两层循环,
O(N^2) - 空间复杂度:
O(N)
2.利用栈解决
思路
直接循环的话,时间复杂度太大了,然后就想换一种方式,找一种数据结构来简化时间复杂度,利用MarsCode AI功能,询问豆包优化思路,得到回答可以使用栈,将时间复杂度从 O(N^2)优化到O(N),同时空间复杂度保持为O(N)。
具体思路如下:
-
初始化:
- 创建一个结果列表
res,初始化为全0。 - 创建一个空栈
stack,用于存储价格列表中各元素的索引。
- 创建一个结果列表
-
从后往前遍历:
- 对于每个元素
i,检查栈顶元素是否小于等于当前元素stockPrices[i]。 - 如果栈顶元素小于等于当前元素,则弹出栈顶元素,直到栈为空或栈顶元素大于当前元素。
- 如果栈不为空,则栈顶元素的索引减去当前元素的索引即为结果。
- 将当前元素的索引压入栈中。
- 对于每个元素
用样例说明:stockPrices = [33, 34, 14, 12, 16]
| i | stk | res | stockPrices[stack[-1]] | stockPrices[i] |
|---|---|---|---|---|
| 初始化 | [] | [0, 0, 0, 0, 0] | ||
| 4 | [4] | [0, 0, 0, 0, 0] | ||
| 3 | [4,3] | [0, 0, 0, 1, 0] | 16 | 12 |
| 2 | [4,2] | [0, 0, 2, 1, 0] | 12 | 14 |
| 1 | [1] | [0, 0, 2, 1, 0] | 14 | 34 |
| 0 | [1,0] | [1, 0, 2, 1, 0] | 34 | 33 |
代码
def solution(N: int, stockPrices: list) -> list:
res = [0] * N
stack = []
# 从后往前遍历
for i in range(N - 1, -1, -1):
# 弹出栈中所有小于等于当前元素的索引
while stack and stockPrices[stack[-1]] <= stockPrices[i]:
stack.pop()
if stack: # 栈不为空
res[i] = stack[-1] - i
# 将当前元素的索引压入栈中
stack.append(i)
return res
PS:一些碎碎念:豆包使用体验
感觉编程指导角度豆包体验挺好的,比以前到处查资料快好多,不用把代码复制过去直接提问真的好评。但是有时候涉及到知识盲区或者对内容理解不过来的时候,我个人喜欢让AI给一个生活化通俗化的例子结合问题讲解,目前用的感受下来豆包可能还在这方面做的不是很完善(也有可能是我提问提示词没用好的原因哈哈😜)