力扣hot100:739. 每日温度/54. 螺旋矩阵

文章目录

  • 一、 739. 每日温度
  • 二、54. 螺旋矩阵
    • 1、模拟螺旋矩阵的路径
    • 2、按层模拟

一、 739. 每日温度

LeetCode:739. 每日温度
在这里插入图片描述
经典单调栈问题,求下一个更大的数。

  • 使用单调递减栈,一个元素A出栈,当且仅当它第一次出现比它更大的数B,由于栈是单调递减的,因此该数B入栈时,会弹出这个栈中比它小的数A,A也同时找到了它的下一个更大的数。
  • 时间复杂度: O ( n ) O(n) O(n),每个元素最多入栈一次,出栈一次
  • 空间复杂度: O ( n ) O(n) O(n)
class Solution {
public:vector<int> dailyTemperatures(vector<int>& temperatures) {stack<int> sta;int n = temperatures.size();vector<int> result(n, 0);for(int i = 0; i < n; ++ i){while(!sta.empty() && temperatures[sta.top()] < temperatures[i]){//维护单调递减的单调栈result[sta.top()] = i - sta.top();sta.pop();}sta.push(i);}return result;}
};

二、54. 螺旋矩阵

LeetCode:54. 螺旋矩阵
在这里插入图片描述

1、模拟螺旋矩阵的路径

由于没有说需要不改变矩阵中的值,我们可以直接按螺旋顺序遍历螺旋矩阵,然后在原矩阵中直接标记被遍历的位置。
注意事项:

  • matrix[x][y],在图形上,这里的x是行号,y是列好,这和数学里面的有所不同,需要区分。
  • 在矩阵遍历过程中一定要注意的两个边界值:
    • 超过数组最大边界,即pos >= size
    • 小于数组最小边界,即pos < 0

时间复杂度: O ( m n ) O(mn) O(mn)mn是矩阵大小
空间复杂度: O ( 1 ) O(1) O(1),不包括返回的答案vector

在这里插入图片描述

以下是保存(x,y)的方式遍历的方法:

class Solution {
public:vector<int> spiralOrder(vector<vector<int>>& matrix) {vector<int> ans;int m = matrix.size();int n = matrix[0].size();int total_size = m * n;int x = 0, y = 0;while(ans.size() < total_size)//遍历四个方向for(int j = 0; j < 4; ++ j){int temp_x = x;//(x,y)维护下一次要遍历的起始点,(temp_x,temp_y)表示当前要遍历的点int temp_y = y;//单方向一直走while(temp_x < m && temp_y < n && temp_x >= 0 && temp_y >= 0 && matrix[temp_x][temp_y] != INT_MAX){//维护x,y的下次起点值x = temp_x + dx[(j + 1) % 4];y = temp_y + dy[(j + 1) % 4];//保存当前值ans.emplace_back(matrix[temp_x][temp_y]);//标记当前位置//cout << ans.back() << endl;matrix[temp_x][temp_y] = INT_MAX;//更新下一个遍历的位置temp_x = temp_x + dx[j];temp_y = temp_y + dy[j];}}return ans;}
private:int dx[4] = {0, 1, 0, -1};int dy[4] = {1, 0, -1, 0};//右,下,左,上的顺序 
};

以下是直接遍历的方法:

  • 由于下一次遍历的位置,只跟当前方向有关,因此为了满足每一次方向都是正确的,都能够找到一个正确位置,我们只需要每一次更新下一次遍历位置之前,都判断方向是否需要更改就行!
  • 这个方法更简单,更容易思考,而且上面那个方法,每走一次要判断是否该方向能走,和下面这个方法每走一次判断是否需要更改方向是同样的操作,但下面却利用这一操作更改成正确的方向更简洁。
class Solution {
public:vector<int> spiralOrder(vector<vector<int>>& matrix) {vector<int> ans;int m = matrix.size();int n = matrix[0].size();int total_size = m * n;int x = 0, y = 0;int direction = 0;while(ans.size() < total_size){//保存遍历结点ans.emplace_back(matrix[x][y]);matrix[x][y] = INT_MAX;//判断原始的下一次方向int new_x = x + dx[direction];int new_y = y + dy[direction];//判断下一次是否需要更改方向if(new_x < 0 || new_x >=m || new_y < 0 || new_y >=n || matrix[new_x][new_y] == INT_MAX){direction = (direction + 1) % 4;}//更新到下一次遍历位置x = x + dx[direction];y = y + dy[direction];}return ans;}
private:int dx[4] = {0, 1, 0, -1};int dy[4] = {1, 0, -1, 0};//右,下,左,上的顺序 
};

如果需要原地进行,空间复杂度且需要是 O ( 1 ) O(1) O(1),则需要进行层序遍历。

2、按层模拟

矩阵,从外到内分层,则有每次都是转一圈。
如果我们记住四个顶点,则我们就有足够信息可以使得我们无差错的转一圈。并且转完这一圈,四个顶点更新为内层的四个顶点是非常简单的。

时间复杂度: O ( m n ) O(mn) O(mn)mn是矩阵大小
空间复杂度: O ( 1 ) O(1) O(1)

class Solution {
public:vector<int> spiralOrder(vector<vector<int>>& matrix) {if (matrix.size() == 0 || matrix[0].size() == 0) {return {};}int rows = matrix.size(), columns = matrix[0].size();vector<int> order;int left = 0, right = columns - 1, top = 0, bottom = rows - 1;while (left <= right && top <= bottom) {for (int column = left; column <= right; column++) {order.push_back(matrix[top][column]);}for (int row = top + 1; row <= bottom; row++) {order.push_back(matrix[row][right]);}if (left < right && top < bottom) {for (int column = right - 1; column > left; column--) {order.push_back(matrix[bottom][column]);}for (int row = bottom; row > top; row--) {order.push_back(matrix[row][left]);}}left++;right--;top++;bottom--;}return order;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/25187.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux进程替换 自主shell程序

本篇将要讲解有关进程中最后一个知识点——进程替换&#xff0c;其中主要介绍有关进程替换的六个函数&#xff0c;直接从函数层面来理解进程替换&#xff08;在使用函数的过程中&#xff0c;也会对进行替换进行解释&#xff09;。本篇主要围绕如下的进程替换函数&#xff1a; 以…

QT系列教程(9) 主窗口学习

简介 任何界面应用都有一个主窗口&#xff0c;今天我们谈谈主窗口相关知识。一个主窗口包括菜单栏&#xff0c;工具栏&#xff0c;状态栏&#xff0c;以及中心区域等部分。我们先从菜单栏说起 菜单栏 我们创建一个主窗口应用程序, 在ui文件里的菜单栏里有“在这里输入”的一个…

windows安装conda

1 Conda简介 Conda 是一个开源的软件包管理系统和环境管理系统&#xff0c;用于安装多个版本的软件包及其依赖关系&#xff0c;并在它们之间轻松切换。Conda 是为 Python 程序创建的&#xff0c;适用于 Linux&#xff0c;OS X 和Windows&#xff0c;也可以打包和分发其他软…

mnist的t-SNE二维空间可视化MATLAB

%% filename ‘mnist’; digitDatasetPath fullfile(matlabroot,‘toolbox’,‘nnet’,‘nndemos’, … ‘nndatasets’,‘DigitDataset’); imds imageDatastore(digitDatasetPath, … ‘IncludeSubfolders’,true,‘LabelSource’,‘foldernames’); %% labelCount coun…

【清华大学】《自然语言处理》(刘知远)课程笔记

自然语言处理基础&#xff08;Natural Language Processing Basics, NLP Basics&#xff09; 自然语言处理( Natural Language Processing, NLP)是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言…

RN:Error: /xxx/android/gradlew exited with non-zero code: 1

问题 执行 yarn android 报错&#xff1a; 解决 这个大概率是缓存问题&#xff0c;我说一下我的解决思路 1、yarn doctor 2、根据黄色字体提示&#xff0c;说我包版本不对&#xff08;但是这个是警告应该没事&#xff0c;但是我还是装了&#xff09; npx expo install --…

进军rust:从0开始学习rust语法

一.变量类型 Rust语言中的基础数据类型有以下几种&#xff1a; 1.整数型 整数型简称整型&#xff0c;按照比特位的长度和有无符号位可以分为以下几种 isize和usize两种整数类型是用来衡量数据大小的&#xff0c;它们的位长度取决于所运行的目标平台&#xff0c;如果是32位架…

Springboot+Vue的网上购物商城系统(前后端分离)

技术栈 JavaSpringBootMavenMySQLMyBatisVueShiroElement-UI 角色对应功能 用户商家 功能截图

GPU风扇不旋转:为什么会发生这种情况以及如何修复

GPU在处理数百万像素时往往会发热,因此冷却风扇静音可能会令人担忧,这是可以理解的!如果你注意到你的GPU风扇没有旋转,下面是如何评估是否存在真正的问题,以及如何解决问题。 风扇停止旋转可能是一个功能,而不是一个Bug 如果GPU没有用于密集任务或没有达到高温,则可以…

yarn保姆级安装和使用

目录 前言 一、yarn简介 主要特性 使用场景 二、yarn的安装 yarn的下载 配置环境变量 三、yarn的常用命令 四、yarn的常用配置项 五、npm与yarn的区别 前言 本文旨在介绍如何安装和使用Yarn&#xff0c;以及它的一些常见用法。我们将从Yarn的基本概念开始&#xff0c;…

Foundation Model 通用大模型的评测体系

随着大模型评测需求逐渐增加,相关研究也进一步深入。大模型相比传统模 型&#xff0c;泛化能力更强、灵活性更高、适应性更广&#xff0c;多任务、多场景&#xff0c;评测维度、评测指标和数 据集更复杂&#xff0c;面向大模型的评估方法、评测基准、测试集成为新的研究课题。 …

【Python】Selenium基础入门

Selenium基础入门 一、Selenium简介二、Selenium的安装三、Selenium的使用1.访问web网站2.元素定位根据标签 id 获取元素根据标签 name 属性的值获取元素根据 Xpath 语句获取元素根据标签名获取元素根据CSS选择器获取元素根据标签的文本获取元素&#xff08;精确定位&#xff0…

“论边缘计算及应用”必过范文,突击2024软考高项论文

论文真题 边缘计算是在靠近物或数据源头的网络边缘侧&#xff0c;融合网络、计算、存储、应用核心能力的分布式开放平台(架构)&#xff0c;就近提供边缘智能服务。边缘计算与云计算各有所长&#xff0c;云计算擅长全局性、非实时、长周期的大数据处理与分析&#xff0c;能够在…

宝塔面板和 LNMP 环境下反代 HFish 蜜罐平台的正确方法

最近明月在热心站长好友的支持下搭建了安全、简单、有效并永久免费的蜜罐平台 HFish,因为 HFish 默认是以 https://IP:端口 的 Web 链接形式提供访问的,这会暴露蜜罐平台的真实服务器 IP 不说,还非常不便于快速的访问(反正明月是记不住 IP 的),所以就需要给部署好的 HFis…

OS复习笔记ch8-3

驻留集 驻留集&#xff1a;指请求分页存储管理中给进程分配的内存块的集合。 在采用了虚拟存储技术的系统中&#xff0c;驻留集大小一般小于进程的总大小。 驻留集&#xff0c;从某种角度可以看成是进程可以常驻内存的内存块的集合。 若驻留集太小&#xff0c;会导致缺页频繁…

Windows 10 找不到Microsoft Edge 浏览器

下载链接 了解 Microsoft Edge 手动下载浏览器 问题说明 一般来说&#xff0c;windows10系统应该是自带浏览器edge的&#xff0c;但有的电脑就是没有找到edge浏览器&#xff0c;可能系统是精简过的&#xff0c;可能是被卸载了。如下&#xff0c;控制面板确实没找到程序。 ​ …

大模型相关:ChatGPT的原理与架构

一、大模型面临的挑战 1.1 Transformer模型的缺陷&#xff1a; 与RNN相比Transformer面临以下挑战&#xff1a; 并行计算能力不足。RNN需要按序处理序列数据中的每个时间步&#xff0c;这限制了它在训练过程中充分利用现代GPU的并行计算能力&#xff0c;从而影响训练效率。长…

Llama模型家族之Stanford NLP ReFT源代码探索 (二)Intervention Layers层

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;一&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;二&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;三&#xff09; 基于 LlaMA…

simulink中显示模块中的名字

simulink/matlab version: R2022a 改动前&#xff1a;X那里没有显示名字&#xff1b; 改动方法&#xff1a; 1&#xff09;鼠标左键点击待显示模块&#xff1b; 2&#xff09;菜单栏新增 模块这个选项&#xff1b; 3&#xff09;点击自动名称&#xff1b; 4) 点击名称打开…

Linux 内核参数-相关介绍

Linux 内核参数-相关介绍 今天&#xff0c;介绍Linux内核参数相关内容。由于Linux内核优化需要根据具体需求进行具体优化&#xff0c;同时需要具备一定经验&#xff0c;所以这里不涉及优化操作内容。 不过&#xff0c;遇到面试中有相关题目&#xff0c;不至于答不上来&#x…