力扣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; 以…

一个管理全局实例的python框架

一个管理全局实例的框架&#xff0c;利用元类&#xff08;metaclass&#xff09;和混合类&#xff08;mixin&#xff09; 。 1 代码实现 这段代码通过元类和混合类的机制提供了一个可以全局访问且线程安全的单例模式框架。这种设计模式在多线程应用程序中非常有用&#xff0c…

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

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

windows安装conda

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

Web前端放图片位置:深入探索与最佳实践

Web前端放图片位置&#xff1a;深入探索与最佳实践 在Web前端开发中&#xff0c;图片作为重要的视觉元素&#xff0c;其放置位置往往影响着网页的整体布局和用户体验。然而&#xff0c;如何合理地放置图片&#xff0c;以最大化其视觉效果并提升用户体验&#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 角色对应功能 用户商家 功能截图

Linux服务器配置一个简单的DNS

配置一个简单的DNS服务器可以使用BIND (Berkeley Internet Name Domain)。 配置DNS的步骤如下 一、安装BIND sudo apt-update sudo apt-get install bind9 二、配置BIND。 编辑 /etc/bind/named.conf.local 文件&#xff0c;添加一个简单的zone配置 zone "example.c…

【机器学习】基于图注意力网络(GAT)的Cora数据集论文主题预测

1. 引言 1.1. GAT概述 GAT是一种基于图神经网络的深度学习模型&#xff0c;专门用于处理图结构数据。与传统的神经网络不同&#xff0c;GAT能够直接对图结构数据进行学习和推理&#xff0c;通过捕捉和传递节点之间的关系和特征信息&#xff0c;实现对图结构数据的深度分析和挖…

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

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

使用Spring Boot实现Redis多数据库缓存

Redis多数据库存储实现用户行为缓存 在我的系统中&#xff0c;为了优化用户行为数据的存储与访问效率&#xff0c;我引入了Redis缓存&#xff0c;并将数据分布在不同的Redis数据库中。通过这种方式&#xff0c;可以减少单一数据库的负载&#xff0c;提高系统的整体性能。 主要…

GEE案例——利用MODIS数据(NDVI)计算中国大陆2000-2023年的MK、Sens趋势性分析和Z值统计以及方差分析

简介 利用MODIS数据(NDVI)计算2000-2023年中国大陆的MK、Sens趋势性分析和Z值统计以及方差分析 流程 要进行NDVI数据的趋势性分析和统计分析,需要按照以下步骤进行: 1. 数据准备:获取2000-2023年的MODIS NDVI数据,可以从NASA的MODIS数据网站或其他可靠的数据来源获取…

yarn保姆级安装和使用

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

使用try-with-resources语句替代try-finally语句

Java类库中包含许多必须通过调用close方法手动关闭的资源&#xff0c;例如InputStream、OutputStream和java.sql.Connection。 开发人员经常忽视关闭资源&#xff0c;其性能结果可想而知。 从以往来看&#xff0c;try-finally语句是保证资源正确关闭的最佳方式&#xff0c;即使…

Web前端的规划:深度解构与未来展望

Web前端的规划&#xff1a;深度解构与未来展望 在数字化浪潮汹涌的时代&#xff0c;Web前端作为用户与互联网世界的桥梁&#xff0c;其重要性不言而喻。对于前端开发者而言&#xff0c;一份精心规划的Web前端策略&#xff0c;不仅是项目成功的基石&#xff0c;更是技术进步的引…

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

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

Qt图表类介绍

本文主要介绍QCharts相关的模块及类。 Qt中图表模块有以下几种类型&#xff1a;折线图&#xff0c;样条曲线图&#xff0c;面积图&#xff0c;散点图&#xff0c;条形图&#xff0c;饼图&#xff0c;方块胡须图&#xff0c;蜡烛图&#xff0c;极坐标图。 QCharts的图表框架类似…