【代码随想录】【算法训练营】【第53天】 [739]每日温度 [496]下一个更大元素I [503]下一个更大元素II

前言

思路及算法思维,指路 代码随想录

题目来自 LeetCode

day 48,周六,不能再坚持~

题目详情

739 每日温度

题目描述

739 每日温度

解题思路

前提:寻找任一个元素的右边比自己大的元素的位置

思路:通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时可以用单调栈,使用空间换时间

重点:单调栈的实现思维

代码实现

C语言
单调栈
c 复制代码
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* dailyTemperatures(int* temperatures, int temperaturesSize, int* returnSize) {
    int *ans = (int *)malloc(sizeof(int) * temperaturesSize);
    int stack[temperaturesSize];
    int top = 0;

    memset(ans, 0, sizeof(int) * temperaturesSize);
    memset(stack, 0, sizeof(stack));

    for (int i = 0; i < temperaturesSize; i++) {
        while (top > 0 && temperatures[i] > temperatures[stack[top - 1]]) {
            // 当前元素 大于 栈顶元素,找到栈顶元素的右侧第一个更高温度
            ans[stack[top - 1]] = i - stack[top - 1];
            top--;
        }
        stack[top] = i;
        top++;
    }
    *returnSize = temperaturesSize;
    return ans;
}

496 下一个更大元素I

题目描述

496 下一个更大元素I

解题思路

前提:寻找另一数组中相同元素的右侧第一个比其大的值

思路:对nums2使用单调栈,再利用哈希对nums1中元素赋值

重点:单调栈的实现思维

代码实现

C语言
单调栈
c 复制代码
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
#define NUM_MAX_SIZE 10001
int* nextGreaterElement(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) {
    int *ans = (int *)malloc(sizeof(int) * nums1Size); 
    int map[NUM_MAX_SIZE];
    memset(map, -1, sizeof(map));
    for (int i = 0; i < nums1Size; i++) {
        ans[i] = -1;
        map[nums1[i]] = 0;
    }

    // 对nums2使用单调栈
    int stack[NUM_MAX_SIZE];
    memset(stack, -1, sizeof(stack));
    int top = 0;
    for (int i = 0; i < nums2Size; i++) {
        while (top > 0 && nums2[i] > nums2[stack[top - 1]]) {
            // 当前元素大于栈顶元素,找到栈顶元素右侧的第一个更大元素
            map[nums2[stack[top - 1]]] = nums2[i];
            top--;
        }
        stack[top] = i;
        top++;
    }

    // 赋值结果
    for (int i = 0; i < nums1Size; i++) {
        if (map[nums1[i]] > 0) {
            ans[i] = map[nums1[i]];
        } else {
            ans[i] = -1;
        }
    }

    *returnSize = nums1Size;
    return ans;
}

503 下一个更大元素II

题目描述

503 下一个更大元素II

解题思路

前提:寻找同一数组中相同元素的右侧第一个比其大的值,可循环查找

思路:循环两次对nums使用单调栈

重点:单调栈的实现思维

代码实现

C语言
单调栈
c 复制代码
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* nextGreaterElements(int* nums, int numsSize, int* returnSize) {
    int *ans = (int *)malloc(sizeof(int) * numsSize);
    memset(ans, -1, sizeof(int) * numsSize);

    // 单调栈
    int stack[numsSize * 2];
    int top = 0;
    memset(stack, 0, sizeof(stack));
    for (int i = 0; i < numsSize * 2; i++) {
        while (top > 0 && nums[i % numsSize] > nums[stack[top - 1]]) {
            // 找到第一个比栈顶元素大的数值
            ans[stack[top - 1]] = nums[i % numsSize];
            top--;
        }
        stack[top] = i % numsSize;
        top++;
    }
    *returnSize = numsSize;
    return ans;
}

今日收获

  1. 单调栈
相关推荐
大明者省5 小时前
WSL2 Ubuntu22.04 GPU训练环境配置指南
人工智能·算法·计算机视觉
白狐_7987 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander2587 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
Shell运维手记7 小时前
Linux 常用基础命令学习笔记
linux·运维·笔记·学习·算法·github
杨航 AI8 小时前
O(n log n):线性对数原理拆解 这个是排序算法的黄金复杂度之一。
算法·排序算法
船厂电气自动化ai大模型8 小时前
AI大模型与数学 第32课 函数凹凸性与二阶导数:拐点求解、凹凸区间计算(10道二阶导数计算题)
数据结构·人工智能·python·深度学习·算法
旖旎夜光8 小时前
LeetCode 3:无重复字符的最长子串(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
叠层归一研究院10 小时前
AGI 系统(十一):二阶网络 — 二阶递归 × 多主体 (元符号网络)
开发语言·人工智能·算法·php·agi
zlinear数据采集卡10 小时前
D223的PWM电机控制:6路独立脉冲+加减速算法深度解析
arm开发·stm32·嵌入式硬件·算法·fpga开发·架构
杨石兴11 小时前
31、玩具MoM:用2x2矩阵串起全套流程
人工智能·算法·矩阵·电磁学