欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 会展 > 【代码随想录】【算法训练营】【第53天】 [739]每日温度 [496]下一个更大元素I [503]下一个更大元素II

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

2025/8/31 17:25:29 来源:https://blog.csdn.net/weixin_54954007/article/details/140070658  浏览:    关键词:【代码随想录】【算法训练营】【第53天】 [739]每日温度 [496]下一个更大元素I [503]下一个更大元素II

前言

思路及算法思维,指路 代码随想录。
题目来自 LeetCode。

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

题目详情

[739] 每日温度

题目描述

739 每日温度
739 每日温度

解题思路

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

代码实现

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
496 下一个更大元素I

解题思路

前提:寻找另一数组中相同元素的右侧第一个比其大的值
思路:对nums2使用单调栈,再利用哈希对nums1中元素赋值
重点:单调栈的实现思维

代码实现

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
503 下一个更大元素II

解题思路

前提:寻找同一数组中相同元素的右侧第一个比其大的值,可循环查找
思路:循环两次对nums使用单调栈
重点:单调栈的实现思维

代码实现

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. 单调栈

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词