类似前缀和的 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] * # left min
        max_vals = [0] * # 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

  

 

 

给定一个数组 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。

和上面那个题都可以使用一样的思路做!!!


posted @   bonelee  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用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提权】不带引号的服务路径提权——也比较鸡肋,需要安装后门替换服务后重启系统,你的后门服务才会起来,因为服务启动权限高,所以可以提权
点击右上角即可分享
微信分享提示