当前位置: 首页 > news >正文

cpp刷题打卡记录29——矩阵置零 旋转图像 除了自身以外数组的乘积

矩阵置零

class Solution { public: void setZeroes(vector<vector<int>>& matrix) { int n = matrix.size(); int m = matrix[0].size(); vector<bool> rowZero(n, false); vector<bool> culZero(m, false); for(int i = 0; i<n; i++){ for(int j = 0; j<m; j++){ if(matrix[i][j] == 0){ rowZero[i] = true; culZero[j] = true; } } } for(int i = 0; i<n; i++){ for(int j = 0; j<m; j++){ if(rowZero[i] || culZero[j]){ matrix[i][j] = 0; } } } } };

属于暴力解法,时间复杂度为O(mn),空间复杂度为O(m + n)。

旋转图像

法一:

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

时间复杂度为O(),空间复杂度为O()。其实并没有达到题目要求,题目要求是要原地算法。我还是创建了额外的vector来进行存旋转后的矩阵,所以思路想法比较简单。

法二:

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]); } } } };

很巧妙的思路,是通过翻转来做到顺时针旋转90°的。先按照中心横线进行水平翻转,再按照主对角线进行翻转。(如果是逆时针旋转90°,就先水平翻转再副对角线进行翻转)。

除了自身以外数组的乘积

法一:

class Solution { public: vector<int> productExceptSelf(vector<int>& nums) { vector<int> result; for(int i = 0; i<nums.size(); i++){ int tmp = 1; for(int j = 0; j<nums.size(); j++){ if(j != i){ tmp = tmp*nums[j]; } } result.push_back(tmp); } return result; } };

超出时间限制。

法二:

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

这个思路是定义了一个左数组和一个右数组,然后对应的除了自身以外数组的乘积就是该位置的左边和右边乘积。这个左数组和右数组的赋值有点像前缀和的感觉。left[0]和right[n-1]设置为1是因为left[0]没有左边的数,right[n-1]也没有右边的数。

http://www.jsqmd.com/news/662063/

相关文章:

  • abinit学习日记十九——tgw1_6.abi
  • 2026届学术党必备的六大降重复率方案解析与推荐
  • 如何快速掌握几何无衬线字体:开源字体完全指南
  • QT打印 文本 + png公章
  • 【OS】RTOS的任务切换原理
  • 如何用keil5软件的debug进行仿真调试
  • 硬件级精细温控:FanControl 风扇控制系统的技术架构与实战应用
  • 从EEPROM转战SPI Flash?STM32F103驱动W25Q64,你必须搞懂的‘页卷’与擦除机制
  • 微信小程序反编译实战:深度揭秘Wedecode如何实现跨平台源代码还原
  • 【地平线开发环境实战】基于Docker快速部署与配置全流程解析
  • 如何在3分钟内免费实现跨平台远程桌面控制:BilldDesk Pro完全指南
  • 【VSCode】多文件夹工作区的头文件路径引用
  • 2026年3月光学玻璃品牌推荐,支持来图定制加工,异形件均可按需生产制作 - 品牌推荐师
  • Access练习题(3)
  • 从摇骰子到抽奖机:用Arduino的random和randomSeed函数打造5个小项目
  • SQL利用窗口函数实现轻量级报表设计_实战技巧
  • 致远ZLG 功率分析仪PA2000mini
  • 从滑动窗口到RPN:目标检测候选区域生成技术的演进与核心
  • STM32F4标准库+LAN8720网线热插拔实战:从官方EVAL工程到实际项目的移植避坑指南
  • 2026年葫芦岛汽车贴膜行业选型指南白皮书 - GrowthUME
  • Obsidian Dataview终极指南:5个简单步骤将笔记库变为智能数据库
  • 如何在PC上免费玩Switch游戏?Ryujinx模拟器让你轻松实现
  • 气象科研人必备:用Python+WRF+Cartopy绘制专业雷达回波图(附完整代码)
  • Mapbox GL JS 实战:从零构建交互式地理可视化应用
  • 财务大数据是什么?怎么选财务大数据自动化工具?
  • 2026 年葫芦岛汽车贴膜全流程深度攻略:从选型到交付一站式指南 - GrowthUME
  • 先锁定目标客户,再找获客方法-佛山鼎策创局破局增长咨询
  • 2026年2款HR系统横评:红海云与用友谁更适合制造业?
  • 测试文章2
  • 沙盒测试-前缀和