LeetCode刷题(739/496/503)/华为od转盘寿司-单调栈

ops/2024/9/23 14:28:38/

739.每日温度

给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。
示例 1:
输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]
示例 2:
输入: temperatures = [30,40,50,60]
输出: [1,1,1,0]
示例 3:
输入: temperatures = [30,60,90]
输出: [1,1,0]

int* dailyTemperatures(int* temperatures, int temperaturesSize, int* returnSize) {int* ans=(int*)malloc(sizeof(int)*temperaturesSize);int* stack=(int*)malloc(sizeof(int)*temperaturesSize);*returnSize=temperaturesSize;int top=-1;for(int i=0;i<temperaturesSize;i++){while(top!=-1&&temperatures[i]>temperatures[stack[top]]){//数组元素比栈顶元素大ans[stack[top]]=i-stack[top];top--;//栈顶元素出栈,将当前元素入栈}stack[++top]=i;//元素入栈,栈顶指针先增加}while(top!=-1){ans[stack[top--]]=0;}return ans;
}

496.下一个更大元素

nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。

给你两个 没有重复元素 的数组 nums1 和 nums2 ,下标从 0 开始计数,其中nums1 是 nums2 的子集。

对于每个 0 <= i < nums1.length ,找出满足 nums1[i] == nums2[j] 的下标 j ,并且在 nums2 确定 nums2[j] 的 下一个更大元素 。如果不存在下一个更大元素,那么本次查询的答案是 -1 。

返回一个长度为 nums1.length 的数组 ans 作为答案,满足 ans[i] 是如上所述的 下一个更大元素 。
示例 1:
输入:nums1 = [4,1,2], nums2 = [1,3,4,2].
输出:[-1,3,-1]
解释:nums1 中每个值的下一个更大元素如下所述:

  • 4 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。
  • 1 ,用加粗斜体标识,nums2 = [1,3,4,2]。下一个更大元素是 3 。
  • 2 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。

示例 2:
输入:nums1 = [2,4], nums2 = [1,2,3,4].
输出:[3,-1]
解释:nums1 中每个值的下一个更大元素如下所述:

  • 2 ,用加粗斜体标识,nums2 = [1,2,3,4]。下一个更大元素是 3 。
  • 4 ,用加粗斜体标识,nums2 = [1,2,3,4]。不存在下一个更大元素,所以答案是 -1 。
  • int* nextGreaterElement(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) { *returnSize=nums1Size; int* ans=(int*)malloc(sizeof(int)*nums1Size); int* stack=(int*)malloc(sizeof(int)*nums2Size); int top=-1; stack[++top]=0;//栈中存储元素下标 for(int i=0;i<nums1Size;i++){ ans[i]=-1; } for(int i=1;i<nums2Size;i++){//遍历数组2 if(nums2[i]<=nums2[stack[top]]) stack[++top]=i;//入栈 else{ while(top!=-1&&nums2[i]>nums2[stack[top]]){ for(int j=0;j<nums1Size;j++){ if(nums2[stack[top]]==nums1[j])//找到栈顶元素在数组1中对应的下标 ans[j]=nums2[i];//找到栈顶元素的下一个更大元素 } --top;//栈顶元素出栈 } stack[++top]=i;//将当前元素入栈 } } return ans; }

503.下一个更大元素II

给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素 。

数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1 。
示例 1:
输入: nums = [1,2,1]
输出: [2,-1,2]
解释: 第一个 1 的下一个更大的数是 2;
数字 2 找不到下一个更大的数;
第二个 1 的下一个最大的数需要循环搜索,结果也是 2。

示例 2:
输入: nums = [1,2,3,4,3]
输出: [2,3,4,-1,4]

int* nextGreaterElements(int* nums, int numsSize, int* returnSize) {*returnSize=numsSize;int* ans=(int*)malloc(sizeof(int)*numsSize);int* stack=(int*)malloc(sizeof(int)*numsSize*2);int top=-1;for(int i=0;i<numsSize;i++)ans[i]=-1;for(int i=0;i<numsSize*2;i++){while(top!=-1&&nums[i%numsSize]>nums[stack[top]]){ans[stack[top]]=nums[i%numsSize];//找到当前元素下一个比它更大的数--top;//栈顶元素出栈}stack[++top]=i%numsSize;//当前元素下标入栈}return ans;}

华为OD机试C卷-转盘寿司

题目描述
寿司店周年庆,正在举办优惠活动回馈新老客户。
寿司转盘上总共有 n 盘寿司,prices[i] 是第 i 盘寿司的价格,
如果客户选择了第 i 盘寿司,寿司店免费赠送客户距离第 i 盘寿司最近的下一盘寿司 j,前提是 prices[j] < prices[i],如果没有满足条件的 j,则不赠送寿司。
每个价格的寿司都可无限供应。

输入描述
输入的每一个数字代表每盘寿司的价格,每盘寿司的价格之间使用空格分隔,例如:
3 15 6 14
表示:
第 0 盘寿司价格 prices[0] 为 3
第 1 盘寿司价格 prices[1] 为 15
第 2 盘寿司价格 prices[2] 为 6
第 3 盘寿司价格 prices[3] 为 14
寿司的盘数 n 范围为:1 ≤ n ≤ 500
每盘寿司的价格 price 范围为:1 ≤ price ≤ 1000

输出描述
输出享受优惠后的一组数据,每个值表示客户选择第 i 盘寿司时实际得到的寿司的总价格。使用空格进行分隔,例如:
3 21 9 17

用例
输入 3 15 6 14
输出 3 21 9 17
说明 无

#include <stdio.h>
#include <stdlib.h>int main()
{int price[500];int num=0;while(scanf("%d",&price[num++])){if(getchar()!=' ')break;}int stack[num*2];int top=-1;int ans[num];for(int i=0;i<num;i++)ans[i]=price[i];for(int i=0;i<num*2;i++){while(top!=-1&&price[i%num]<price[stack[top]]){//当前元素价格下于栈顶元素,找到栈顶元素的下一个最小值//printf("%d",ans[stack[top]]);ans[stack[top]]=price[i%num]+price[stack[top]];top--;//栈顶元素出栈}stack[++top]=i%num;//当前元素入栈}printf("\n");for(int i=0;i<num;i++)printf("%d ",ans[i]);return 0;
}

http://www.ppmy.cn/ops/53159.html

相关文章

Flask初识

Flask初识 一、概念说明 1. flask介绍 Flask 是一个轻量级的 Web 应用框架&#xff0c;基于 Werkzeug WSGI 工具包和 Jinja2 模板引擎。 核心特点 微型框架&#xff1a;Flask 被称为“微”框架&#xff0c;因为它在设计上保持了核心的简洁和轻量。易于扩展&#xff1a;Flask…

Python with MATLAB

Python with MATLAB 原文&#xff1a;Python with MATLAB - 知乎 (zhihu.com) 我问来自俄罗斯的实习生&#xff0c;你对网上争辩MATLAB和Python谁好谁坏有什么看法。实习生表示他不会Python&#xff0c;但是只要能完成老板布置的工作&#xff0c;哪个语言都无所谓。再说了&am…

计算机网络 交换机的安全配置

一、理论知识 1.交换机端口安全功能介绍 交换机端口安全功能是针对交换机端口进行安全属性的配置&#xff0c;以控制用户的安全接入。主要包括以下两种配置项&#xff1a; ①限制交换机端口的最大连接数&#xff1a;控制交换机端口连接的主机数量&#xff1b;防止用户进行恶…

基于Java微信小程序民宿短租系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f;感兴趣的可以先收藏起来&#xff0c;还…

[深度学习]循环神经网络RNN

RNN&#xff08;Recurrent Neural Network&#xff0c;即循环神经网络&#xff09;是一类用于处理序列数据的神经网络&#xff0c;广泛应用于自然语言处理&#xff08;NLP&#xff09;、时间序列预测、语音识别等领域。与传统的前馈神经网络不同&#xff0c;RNN具有循环结构&am…

【金】02Y90-60 大数据-HivetoMysQL

1、安装 Java 程序&#xff08;jdk&#xff09; 2、添加以下JAR包 3、确认配置成自己的数据库 ....

数据结构实训:表达式求值器(非常详细)

表达式求值器 问题描述&#xff1a; 设计一个表达式求值器&#xff0c;能够解析和计算由数字、运算符和括号组成的算术表达式。要求实现基本的四则运算&#xff0c;如加、减、乘、除&#xff0c;并处理运算符的优先级和括号。 设计要点&#xff1a; 1. 使用栈作为数据结构来处…

与其他自动化配置管理工具(如 Ansible 、Chef )相比,Puppet 的独特优势和局限性分别是什么?

Puppet的独特优势包括&#xff1a; 基于声明式语言&#xff1a;Puppet使用自己的声明式语言&#xff08;Puppet DSL&#xff09;来描述系统配置&#xff0c;使得配置更加简洁、易于理解和维护。 完善的资源模型&#xff1a;Puppet具有丰富的资源模型&#xff0c;可以管理各种不…