题目解析:股票上涨价格天数计算| 豆包MarsCode AI刷题

224 阅读3分钟

记录下刷题过程思路,如有错误,希望多多指教
题目来自豆包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)

具体思路如下:

  1. 初始化

    • 创建一个结果列表 res,初始化为全0。
    • 创建一个空栈 stack,用于存储价格列表中各元素的索引。
  2. 从后往前遍历

    • 对于每个元素 i,检查栈顶元素是否小于等于当前元素 stockPrices[i]
    • 如果栈顶元素小于等于当前元素,则弹出栈顶元素,直到栈为空或栈顶元素大于当前元素。
    • 如果栈不为空,则栈顶元素的索引减去当前元素的索引即为结果。
    • 将当前元素的索引压入栈中。

用样例说明:stockPrices = [33, 34, 14, 12, 16]

istkresstockPrices[stack[-1]]stockPrices[i]
初始化[][0, 0, 0, 0, 0]
4[4][0, 0, 0, 0, 0]
3[4,3][0, 0, 0, 1, 0]1612
2[4,2][0, 0, 2, 1, 0]1214
1[1][0, 0, 2, 1, 0]1434
0[1,0][1, 0, 2, 1, 0]3433

代码

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给一个生活化通俗化的例子结合问题讲解,目前用的感受下来豆包可能还在这方面做的不是很完善(也有可能是我提问提示词没用好的原因哈哈😜)