类似前缀和的 left min 和 right max,在求解买卖股票的最佳时机、递增的三元子序列比较有效
334. 递增的三元子序列
难度中等
给你一个整数数组 nums
,判断这个数组中是否存在长度为 3
的递增子序列。
如果存在这样的三元组下标 (i, j, k)
且满足 i < j < k
,使得 nums[i] < nums[j] < nums[k]
,返回 true
;否则,返回 false
。
示例 1:
输入:nums = [1,2,3,4,5] 输出:true 解释:任何 i < j < k 的三元组都满足题意
示例 2:
输入:nums = [5,4,3,2,1] 输出:false 解释:不存在满足题意的三元组
示例 3:
输入:nums = [2,1,5,0,4,6] 输出:true 解释:三元组 (3, 4, 5) 满足题意,因为 nums[3] == 0 < nums[4] == 4 < nums[5] == 6
用dp做的话 n2复杂度,会用例超时:
1 2 3 4 5 6 7 8 | dp[i] 表示第i个数小的元素的个数。 转移方程 if (nums[j] < nums[i]) dp[i] = max (dp[i],dp[j] + 1 ) 如果直接两层 for 就超时了,最后一个测试用例过不去 / 。 链接:https: / / leetcode.cn / problems / increasing - triplet - subsequence / solution / dai - ma - jie - de - xiao - bai - javac - tan - xin - don - 85ai / |
类似前缀和的 left min 和 right max,用空间换时间。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class Solution: def increasingTriplet( self , nums: List [ int ]) - > bool : n = len (nums) min_vals = [ 0 ] * n # left min max_vals = [ 0 ] * n # right max min_vals[ 0 ] = nums[ 0 ] max_vals[n - 1 ] = nums[n - 1 ] for i in range ( 1 , n): min_vals[i] = min (min_vals[i - 1 ], nums[i]) max_vals[n - 1 - i] = max (max_vals[n - i], nums[n - 1 - i]) for i in range (n): if min_vals[i] < nums[i] < max_vals[i]: return True return False |
另外还有一种技巧的解法,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class Solution: def increasingTriplet( self , nums) - > bool : # ref: https://leetcode.cn/problems/increasing-triplet-subsequence/solution/c-xian-xing-shi-jian-fu-za-du-xiang-xi-jie-xi-da-b/ n = len (nums) small, mid = float ( 'inf' ), float ( 'inf' ) for i in range (n): t = nums[i] if t < = small: small = t elif t < = mid: mid = t elif t > mid: return True return False |
121. 买卖股票的最佳时机
难度简单
给定一个数组 prices
,它的第 i
个元素 prices[i]
表示一支给定股票第 i
天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0
。
示例 1:
输入:[7,1,5,3,6,4] 输出:5 解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。
示例 2:
输入:prices = [7,6,4,3,1] 输出:0 解释:在这种情况下, 没有交易完成, 所以最大利润为 0。
和上面那个题都可以使用一样的思路做!!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
2022-02-06 进程注入原理——提权会用到本质上就是在进程的内存地址上做一些hack改动
2022-02-06 BypassUAC原理及方法汇总——各类的UAC白名单程序的DLL劫持;各类自动提升权限的COM接口利用(Elevated COM interface) ;Windows 自身漏洞提权;远程注入
2022-02-06 64:权限提升-Linux定时任务&环境变量&数据库
2022-02-06 63:权限提升-Linux脏牛内核漏洞&SUID&信息收集
2022-02-06 AD 域服务简介和使用——其实都是配置dns和域控服务器,各pc加入域,然后设置账号,用AD来进行统一管理
2022-02-06 metasploit之Windows Services漏洞提权实战——利用Windows服务是以SYSTEM权限运行的,如果配置错误让我们修改该服务的二进制文件路径属性,则可以实现提权
2022-02-06 【WINDOWS提权】不带引号的服务路径提权——也比较鸡肋,需要安装后门替换服务后重启系统,你的后门服务才会起来,因为服务启动权限高,所以可以提权