【HOT100第四天】除自身以外数组的乘积,矩阵置零,螺旋矩阵,旋转图像

今天感觉是边界值练习专场。。。整体难度不大但是细节还是需要多动手写一写。

238. 除自身以外的数组的乘积

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。

题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在  32 位 整数范围内。

请 不要使用除法,且在 O(n) 时间复杂度内完成此题。

 没看提示前隐隐约约感觉应该用前缀法,但是没想清楚到底要如何下手。原来这道题是要把前缀和后缀结合着一起用!

稍微回顾一下前缀法吧!上一次使用前缀法是在 560.和为K的子数组 这里用的,主要思路就是借助a_{n}=S_{n}-S_{n-1}来推导出一个子串中元素的和如何用前缀和来表示和计算。

这里思路也差不多,不过既然要算的是数组的乘积,就暂且叫它前缀积数组 pre(n,1) 吧!【后面n和1的意思就是长度为n,每一项默认值为1】然后后缀积数组 suf(n,1) 。

思考一下 ans 数组的每一项是怎么计算出来的,以{1,2,3,4}为例,ans[0]=2x3x4,ans[1]=1x3x4。。。。如果把乘进去的数字分类,不就可以分成 i 之前的数字和 i 之后的数字吗?这不就是(前缀积x后缀积)吗。这样代码就可以写出来了👇【三个for循环可以写成两个,后两个可以合并在一起写】

class Solution {
public:vector<int> productExceptSelf(vector<int>& nums) {int n=nums.size();vector<int> ans(n,1),pre(n,1),suf(n,1);for(int i=1;i<n;i++){pre[i]=pre[i-1]*nums[i-1];}for(int i=n-2;i>=0;i--){suf[i]=suf[i+1]*nums[i+1];}for(int i=0;i<n;i++){ans[i]=pre[i]*suf[i];}return ans;}
};

因为考虑到只要数组中有一个数字是0,那么ans中除了0这个位置的乘积以外,其他地方一定为零,那可以尝试剪枝。

但写完比较了一下执行用时并没有显著提升,还不如从 把第二个和第三个for循环写在一起 的方法出发来改进。因为思路还是一样的所以就不写了。

class Solution {
public:vector<int> productExceptSelf(vector<int>& nums) {int n=nums.size(),flag=-1;vector<int> ans(n),pre(n,1),suf(n,1);for(int i=1;i<n;i++){pre[i]=pre[i-1]*nums[i-1];if(nums[i]==0){flag=i;break;}}for(int i=n-2;i>=0;i--){suf[i]=suf[i+1]*nums[i+1];if(flag>0&&i==flag) break;}if(flag>0){ans[flag]=pre[flag]*suf[flag];return ans;}for(int i=0;i<n;i++){ans[i]=pre[i]*suf[i];}return ans;}
};

一点点小感想:以后做算法题,如果看到 “数组” “元素之间的计算” “无序” 这几个属性,多半就可以考虑一下是不是应该用前缀法做了。

 73. 矩阵置零

给定一个 m x n 的矩阵,如果一个元素为 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法

进阶:

  • 一个直观的解决方案是使用  O(mn) 的额外空间,但这并不是一个好的解决方案。
  • 一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。
  • 你能想出一个仅使用常量空间的解决方案吗?

定睛一看专业对口,之前做数独游戏的时候,高亮选中数字的行和列时也用过相似的算法,只要保存好要处理的行和列,最后修改一下就行了。

class Solution {
public:void setZeroes(vector<vector<int>>& matrix) {int rows = matrix.size();int cols = matrix[0].size();vector<bool> zeroRows(rows, false);vector<bool> zeroCols(cols, false);for (int i = 0; i < rows; ++i) {for (int j = 0; j < cols; ++j) {if (matrix[i][j] == 0) {zeroRows[i] = true;zeroCols[j] = true;}}}for (int i = 0; i < rows; ++i) {if (zeroRows[i]) {for (int j = 0; j < cols; ++j) {matrix[i][j] = 0;}}}for (int j = 0; j < cols; ++j) {if (zeroCols[j]) {for (int i = 0; i < rows; ++i) {matrix[i][j] = 0;}}}}
};

结果一看进阶要求,居然可以仅用一个常量空间解决吗??

 先挖个坑改天看看。。。太困了。。。

54. 螺旋矩阵

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

 

第一眼:有点意思

第二眼:纯折磨(。。。)

主要就是找到应该如何循环,然后划分成四个方向(也就是四个for循环),还有四个边界(top、bottom、left、right),上下左右,每次遍历完一个方向,就通过减小边界值来缩小边界。

注意while循环的边界值,如果只有一行数了,将会出现top=bottom和left=right的情况,所以要带上等于。

【如果一直内存地址溢出,就多看看边界值是不是设错了,m和n是不是设反了】

class Solution {
public:vector<int> spiralOrder(vector<vector<int>>& matrix) {int m = matrix.size(), n = matrix[0].size();if (m == 0 || n == 0)return {};int top = 0, bottom = m - 1, left = 0, right = n - 1;vector<int> ans;while (top <= bottom && left <= right) {for (int i = left; i <= right; i++) ans.emplace_back(matrix[top][i]);top++;if (top > bottom) break;for (int i = top; i <= bottom; i++) ans.emplace_back(matrix[i][right]);right--;if (left > right) break;for (int i = right; i >= left; i--) ans.emplace_back(matrix[bottom][i]);bottom--;if (top > bottom) break;for (int i = bottom; i >= top; i--) ans.emplace_back(matrix[i][left]);left++;if (left > right) break;}return ans;}
};

48.旋转图像

给定一个 × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。

你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。

想学线性代数的有福了。思考一下可不可以通过简单的矩阵变换,让当前矩阵变成旋转90度的样子?

有的,先延水平轴翻转一下,再延对角线翻转,像这样:

\begin{bmatrix} 1 & 2 & 3\\ 4 & 5 & 6\\ 7& 8& 9 \end{bmatrix}  水平向下翻转👉\begin{bmatrix} 7 & 8 &9 \\ 4& 5& 6\\ 1 & 2 & 3 \end{bmatrix}  最后延对角翻转👉 \begin{bmatrix} 7 & 4 &1 \\ 8& 5& 2\\ 9 & 6 & 3 \end{bmatrix}

注意,代码中想要实现翻转,只需要遍历一半的数组,不是全部(不然就翻转回来了)。

class Solution {
public:void rotate(vector<vector<int>>& matrix) {int n=matrix.size();for(int i=0;i<n/2;i++){for(int j=0;j<n;j++){swap(matrix[i][j],matrix[n-i-1][j]);}}for(int i=0;i<n;i++){for(int j=0;j<i;j++){swap(matrix[i][j],matrix[j][i]);}}}
};

 

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

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

相关文章

Angular中的ngOnchange()的汇总

ngOnChanges() 是 Angular 中的一个生命周期钩子函数&#xff0c;它在组件或指令的 输入属性&#xff08;Input()&#xff09;发生变化时被调用。这个钩子可以帮助你检测输入数据的变化&#xff0c;并对数据变化做出反应。 1.监听的对象 ngOnChanges() 监听的是 通过 Input() …

百度智能云千帆大模型平台引领企业创新增长

本文整理自百度世界大会 2024——「智能跃迁 产业加速」论坛的同名演讲。 更多大会演讲内容&#xff0c;请访问&#xff1a; https://baiduworld.baidu.com 首先&#xff0c;跟大家分享一张图&#xff0c;这个是我们目前大模型应用落地的场景分布。可以看到&#xff0c;大模型…

记录java Collections.sort踩的坑

前言 java Collections.sort 排序失效&#xff1f;为什么会排序失效呢&#xff1f; 需求和问题 需求&#xff1a;获取指定文件夹下的所有文件&#xff0c;并且按照修改时间顺序从大到小排序&#xff0c;如果修改时间相同&#xff0c;则按照创建时间从大到小排序 // 输入lis…

【企业级分布式系统】ELK优化

文章目录 Elasticsearch作为日志存储时的优化优化ES索引设置优化线程池配置锁定内存&#xff0c;不让JVM使用Swap减少分片数、副本数 Elasticsearch作为日志存储时的优化 linux内核优化、JVM优化、ES配置优化、架构优化&#xff08;filebeat/fluentd代替logstash、加入kafka做…

【Flutter 问题系列第 84 篇】如何清除指定网络图片的缓存

这是【Flutter 问题系列第 84 篇】&#xff0c;如果觉得有用的话&#xff0c;欢迎关注专栏。 博文当前所用 Flutter SDK&#xff1a;3.24.3、Dart SDK&#xff1a;3.5.3&#xff0c;网络图片缓存用的插件 cached_network_image: 3.4.1&#xff0c;缓存的网络图像的存储和检索用…

亚马逊商品详情API接口解析,Json数据示例返回

亚马逊的商品详情API接口&#xff08;如Amazon Product Advertising API&#xff09;允许开发者获取商品的详细信息&#xff0c;包括价格、描述、图片URL等。以下是一个示例的JSON数据返回结构&#xff0c;以及相应的解析说明。请注意&#xff0c;实际返回的数据结构可能会根据…

SIMCom芯讯通A7680C在线升级:FTP升级成功;http升级腾讯云对象储存的文件失败;http升级私有服务器的文件成功

从事嵌入式单片机的工作算是符合我个人兴趣爱好的,当面对一个新的芯片我即想把芯片尽快搞懂完成项目赚钱,也想着能够把自己遇到的坑和注意事项记录下来,即方便自己后面查阅也可以分享给大家,这是一种冲动,但是这个或许并不是原厂希望的,尽管这样有可能会牺牲一些时间也有哪天原…

uniapp实现中英文切换

home.js const data {ZH: {content1: "苹果",},EN: {content1: “Apple”,} } export default dataindex.js import home from "./home.js" export default {home }en.js import part1 from ./data/part1/index.js const en {language: {name: "…

Android Studio 控制台输出的中文显示乱码

1. Android Studio 控制台输出的中文显示乱码 1.1. 问题 安卓在调试阶段&#xff0c;需要查看app运行时的输出信息、出错提示信息。乱码&#xff0c;会极大的阻碍开发者前进的信心&#xff0c;不能及时的根据提示信息定位问题&#xff0c;因此我们需要查看没有乱码的打印信息。…

活着就好20241120

今天是20号&#xff0c;周三&#xff0c;亲爱的朋友们&#xff0c;大家早上好&#xff01;在连续两天的努力之后&#xff0c;我们迎来了这个同样充满希望与挑战的周三早晨。让我们带着前两天的收获与经验&#xff0c;怀揣着新的目标和梦想&#xff0c;继续在这丰富多彩的一天中…

基于yolov8、yolov5的行人检测识别系统(含UI界面、训练好的模型、Python代码、数据集)

摘要&#xff1a;行人检测在交通管理、智能监控和公共安全中起着至关重要的作用&#xff0c;不仅能帮助相关部门实时监控人群动态&#xff0c;还为自动化监控系统提供了可靠的数据支撑。本文介绍了一款基于YOLOv8、YOLOv5等深度学习框架的行人检测模型&#xff0c;该模型使用了…

Java安全—log4j日志FastJson序列化JNDI注入

前言 log4j和fastjson都是这几年比较火的组件&#xff0c;前者是用于日志输出后者则是用于数据转换&#xff0c;今天我们从源码来说一下这两个组件为何会造成漏洞。 实验环境 这里的idea要进行一下配置&#xff0c;因为我们要引用第三方组件&#xff0c;而这些第三方组件都是…

【白话机器学习系列】白话 Softmax

文章目录 什么是 SoftmaxSoftmax 函数详解示例编程实现对矩阵应用 Softmax 函数 什么是 Softmax Softmax 函数&#xff0c;又称归一化指数函数&#xff0c;它使用指数函数将输入向量归一化为概率分布&#xff08;每一个元素的范围都在 ( 0 , 1 ) (0,1) (0,1) 之间&#xff0c;…

golang通用后台管理系统10(退出登录,注销token)

1.实现思路&#xff1a;将登录用户的token加入黑名单 2. //1.2 用户退出 exploreRouter.POST("/logout", sysCtrl.Logout) 3.loginController.go //用户退出 func Logout(c *gin.Context) {logger : commonLog.InitLogger()sysUser : service.GetProfile1(c)fmt.…

uniapp 页面跳转及页面返回传值

跳转传值&#xff1a; 传值页面A const data {name:0Math.random() * 100}; // 跳转页面方法 uni.navigateTo({//url: /pages/patrol/patrol?dataencodeURIComponent(JSON.stringify(data)),// 有值url: /pages/patrol/patrol?dataencodeURIComponent(JSON.stringify(null)…

C++系列之继承

&#x1f497; &#x1f497; 博客:小怡同学 &#x1f497; &#x1f497; 个人简介:编程小萌新 &#x1f497; &#x1f497; 如果博客对大家有用的话&#xff0c;请点赞关注再收藏 &#x1f31e; 继承的概念 继承机制是面向对象程序设计使代码可以复用的最重要的手段&#xf…

Swift从0开始学习 对象和类 day3

类&#xff08;Class&#xff09; 是一种类型或模板&#xff0c;描述了对象的特征和行为。对象&#xff08;Object&#xff09; 是类的实例&#xff0c;实际的实体&#xff0c;拥有自己的数据。 新入门的教学都喜欢用“人”来举例为类&#xff0c;在这里我也用“人”吧 //&…

【算法设计与分析实训】第1关:求序列的最大字段和

务描述 本关任务&#xff1a;编写用动态规划解决最大字段和问题。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;动态规划。 编程要求 给定由n个整数&#xff08;可能为负数&#xff09;组成的序列&#xff1a;a1,a2,……,an, 求该序列的最大子段和。当所有整…

Android开发实战班 - 第一部分:Android开发基础

本课程旨在帮助学员系统掌握Android开发的基础知识与技能&#xff0c;为后续深入学习与实战开发打下坚实基础。本部分课程将涵盖开发环境搭建、Kotlin语言基础、Android项目结构、Gradle构建系统、Activity生命周期以及UI布局基础等内容。内容比较基础&#xff0c;就系统的幸的…

高防服务器实现防御的方式,高防服务器的优势

高防服务器通过多种防御机制来实现对网络攻击的防护&#xff0c;确保服务器的稳定性和数据的安全性。 高防服务器实现防御的方式 - 硬件配置&#xff1a;高防服务器通常配备高性能的硬件&#xff0c;包括专业的硬件防火墙&#xff0c;以应对大流量攻击。 - 带宽资源&#xff1a…