算法训练营第五十九天|503.下一个更大元素II 42. 接雨水

2024-01-26 18:52

本文主要是介绍算法训练营第五十九天|503.下一个更大元素II 42. 接雨水,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • Leetcode503.下一个更大元素II
  • Leetcode42. 接雨水

Leetcode503.下一个更大元素II

文章链接:代码随想录
题目链接:503.下一个更大元素II

思路:相当于把两个数组拼在一起,用 % 操作节省时间复杂度

class Solution {
public:vector<int> nextGreaterElements(vector<int>& nums) {vector<int> result(nums.size(), -1);stack<int> st;st.push(0);for (int i = 1; i < nums.size() * 2; i++){if (nums[i % nums.size()] <= nums[st.top()]) st.push(i % nums.size());else {while (!st.empty() && nums[st.top()] < nums[i % nums.size()]){result[st.top()] = nums[i % nums.size()];st.pop();}st.push(i % nums.size());}}return result;}
};

精简版本

class Solution {
public:vector<int> nextGreaterElements(vector<int>& nums) {vector<int> result(nums.size(), -1);stack<int> st;st.push(0);for (int i = 1; i < nums.size() * 2; i++){//if (nums[i % nums.size()] <= nums[st.top()]) st.push(i % nums.size());// else{}while (!st.empty() && nums[st.top()] < nums[i % nums.size()]){result[st.top()] = nums[i % nums.size()];st.pop();}st.push(i % nums.size());}return result;}
};

Leetcode42. 接雨水

文章链接:[代码随想录](https://programmercarl.com/0042.%E6%8E%A5%E9%9B%A8%E6%B0%B4.html#%E6%80%9D%E8%B7%AF)
题目链接:42. 接雨水

思路:暴力双指针,时间超时,注意从左向右遍历时,右侧最大值的记录位置,不要将左边的最大值也记录上了

class Solution {
public:int trap(vector<int>& height) {int result = 0;int maxl = INT_MIN;int maxr;for(int i = 1; i < height.size() - 1; i++){for (int j = i - 1; j >= 0; j--){if (height[j] > maxl) maxl = height[j];}// 注意右侧最大值的记录位置,不要将左边的最大值也记录上了maxr = height[i + 1];for (int j = i + 2; j < height.size(); j++){if (height[j] > maxr) maxr = height[j];}int h = min(maxl, maxr)- height[i];cout << h << endl;if (h > 0) result += h;}return result;}
};

双指针优化,把每个位置左右两边的最大值提前记录,避免重复比较操作

class Solution {
public:int trap(vector<int>& height) {int result = 0;vector<int> maxl(height.size());vector<int> maxr(height.size());maxl[0] = height[0];maxr[height.size() - 1] = height[height.size() - 1];for (int i = 1; i < height.size(); i++){maxl[i] = max(height[i], maxl[i - 1]);}for (int i = height.size() - 2; i >= 0; i--){maxr[i] = max(height[i], maxr[i + 1]);}for (int i = 1; i < height.size() - 1; i++){int h = min(maxl[i - 1], maxr[i + 1]) - height[i];if (h > 0) result += h;}return result;}
};

双指针是按列求的,而单调栈是按行求的,不过感觉理解起来比前一种难一些

class Solution {
public:int trap(vector<int>& height) {int result = 0;stack<int> st;st.push(0);for (int i = 1; i < height.size(); i++){if (height[i] < height[st.top()]) st.push(i);else if (height[i] == height[st.top()]){st.pop();st.push(i);}else{while (!st.empty() && height[i] > height[st.top()]){int mid = st.top();st.pop();if (!st.empty()){int h = min(height[i], height[st.top()]) - height[mid];int w = i - st.top() - 1;result += h * w;}}st.push(i);}}return result;}
};

算法训练营第五十九天打卡,看完项目有点学不动了不知道学啥了,看别人的简历和面经心里总是慌慌的,这两天屡屡思路继续学习,不要害怕,不要放弃,加油!!!

这篇关于算法训练营第五十九天|503.下一个更大元素II 42. 接雨水的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/647744

相关文章

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat

CSS实现元素撑满剩余空间的五种方法

《CSS实现元素撑满剩余空间的五种方法》在日常开发中,我们经常需要让某个元素占据容器的剩余空间,本文将介绍5种不同的方法来实现这个需求,并分析各种方法的优缺点,感兴趣的朋友一起看看吧... css实现元素撑满剩余空间的5种方法 在日常开发中,我们经常需要让某个元素占据容器的剩余空间。这是一个常见的布局需求

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

如何高效移除C++关联容器中的元素

《如何高效移除C++关联容器中的元素》关联容器和顺序容器有着很大不同,关联容器中的元素是按照关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的,本文介绍了如何高效移除C+... 目录一、简介二、移除给定位置的元素三、移除与特定键值等价的元素四、移除满足特android定条件的元

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.