前言
思路及算法思维,指路 代码随想录。
题目来自 LeetCode。
day 48,周六,不能再坚持~
题目详情
[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
题目描述
解题思路
前提:寻找另一数组中相同元素的右侧第一个比其大的值
思路:对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
题目描述
解题思路
前提:寻找同一数组中相同元素的右侧第一个比其大的值,可循环查找
思路:循环两次对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;
}
今日收获
- 单调栈