LeetCode——456. 132 模式

LeetCode------456. 132 模式

问题描述

给定一个整数数组 nums,数组中共有 n 个整数。132 模式的子序列由三个整数 nums[i]nums[j]nums[k] 组成,并同时满足:

  • i < j < k
  • nums[i] < nums[k] < nums[j]

如果 nums 中存在 132 模式的子序列,返回 true;否则,返回 false

示例

示例 1

输入 : nums = [1,2,3,4]
输出 : false
解释: 序列中不存在 132 模式的子序列。

示例 2

输入 : nums = [3,1,4,2]
输出 : true
解释 : 序列中有 1 个 132 模式的子序列:[1, 4, 2]

示例 3

输入 : nums = [-1,3,2,0]
输出 : true
解释 : 序列中有 3 个 132 模式的子序列:[-1, 3, 2][-1, 3, 0][-1, 2, 0]

提示

  • n == nums.length
  • 1 <= n <= 2 * 10^5
  • -10^9 <= nums[i] <= 10^9

解决方法

这道题有两个方向,一是暴力求解,二是单调栈。

在leetcode上建议使用单调栈,暴力求解有个别用例会过不去。

代码实现

暴力算法 O(n3)

c 复制代码
//暴力解法O(n^3)
bool find132pattern(int* nums, int numsSize) {
    if (numsSize < 3) {	//长度小于 3 无法构成
        return false;
    }
    for (int i = 0; i <= numsSize - 3; i++) {
        for (int j = i + 1; j <= numsSize - 2; j++) {
            for (int k = j + 1; k <= numsSize - 1; k++) {
                if (nums[i] < nums[k] && nums[k] < nums[j]) {
                    return true;
                }
            }
        }
    }
    return false;
}

暴力算法 O(n2)

c 复制代码
//暴力优化O(n^2)
bool find132pattern(int* nums, int numsSize) {
    if (numsSize < 3) {	//长度小于 3 无法构成
        return false;
    }

    for (int j = 1; j < numsSize - 1; j++) {
        int min = nums[0];
        for (int i = 1; i < j; i++) {
            if (nums[i] < min) {
                min = nums[i];		//j作为中间下标,找j左边最小,更容易满足条件
            }
        }
        for (int k = j + 1; k < numsSize; k++) {
            if (min < nums[k] && nums[k] < nums[j]) {
                return true;
            }
        }
    }
    return false;
}

单调栈O(n)

c 复制代码
bool find132pattern(int* nums, int numsSize) {
    if (numsSize < 3) {
        return false;
    }

    int max_k = INT_MIN;	//存放k的最大值(初始化为最小值)
    int* stack = (int*)malloc(numsSize * sizeof(int));
    int top = -1;	//栈顶下标

    for (int i = numsSize; i >= 0; i--) {
        if (nums[i] < max_k) {
            free(stack);
            return true;
        }
        while (top >= 0 && nums[i] > stack[top]) {
            max_k = stack[top--];
        }
        stack[++top] = nums[i];
    }

    free(stack);
    return false;
}

单调栈可能有点不好理解,下面将给出图例说明。

提示:

  • nums[i] = 1(模式中的"1")

  • max_k = 2(模式中的"2")

  • stack = {4}(模式中的"3")

相关推荐
liulilittle38 分钟前
IP校验和算法:从网络协议到SIMD深度优化
网络·c++·网络协议·tcp/ip·算法·ip·通信
bkspiderx2 小时前
C++经典的数据结构与算法之经典算法思想:贪心算法(Greedy)
数据结构·c++·算法·贪心算法
中华小当家呐3 小时前
算法之常见八大排序
数据结构·算法·排序算法
沐怡旸4 小时前
【算法--链表】114.二叉树展开为链表--通俗讲解
算法·面试
一只懒洋洋4 小时前
K-meas 聚类、KNN算法、决策树、随机森林
算法·决策树·聚类
方案开发PCBA抄板芯片解密5 小时前
什么是算法:高效解决问题的逻辑框架
算法
songx_996 小时前
leetcode9(跳跃游戏)
数据结构·算法·游戏
小白狮ww6 小时前
RStudio 教程:以抑郁量表测评数据分析为例
人工智能·算法·机器学习
AAA修煤气灶刘哥6 小时前
接口又被冲崩了?Sentinel 这 4 种限流算法,帮你守住后端『流量安全阀』
后端·算法·spring cloud
kk”7 小时前
C语言快速排序
数据结构·算法·排序算法