前端力扣刷題 | 6:hot100之 矩陣

73. 矩陣置零

給定一個 m x n 的矩陣,如果一個元素為 0 ,則將其所在行和列的所有元素都設為 0 。請使用 原地 算法。
在這里插入圖片描述

法一:
var setZeroes = function(matrix) {let setX = new Set(); // 用于存儲需要置零的行索引let setY = new Set(); // 用于存儲需要置零的列索引let row = matrix.length;let col = matrix[0].length;for(let i=0;i<row;i++){for(let j=0;j<col;j++){if(matrix[i][j]===0){setX.add(i);setY.add(j);}}}// 將需要置零的行全置為 0for(let i of setX){for(let j=0;j<col;j++){matrix[i][j]=0;}}// 將需要置零的列全置為 0for(let i of setY){for(let j=0;j<row;j++){matrix[j][i]=0;}}
};
  • 時間復雜度:O(m*n)
  • 空間復雜度:O(m+n),額外使用了兩個set來存儲行和列索引
法二:
解題思路:
  1. 使用矩陣的第一行和第一列作為標記區域:
    • 用第一行標記需要置零的列。
    • 用第一列標記需要置零的行。
  2. 步驟概述:
    • 第一步:先遍歷整個矩陣,記錄哪些行和列需要置零(但不要急著修改矩陣)。
      • 使用第一行的元素記錄某一列是否需要置零。
      • 使用第一列的元素記錄某一行是否需要置零。
      • 此外,需要一個變量標記第一行和第一列本身是否需要置零。
    • 第二步:根據第一行和第一列的標記,修改矩陣對應的行和列為零。
    • 第三步:單獨處理第一行和第一列(因為它們被用作標記,最后再更新)。
var setZeroes = function(matrix) {let row = matrix.length;let col = matrix[0].length;// 標記第一列和第一行是否需要置零let firstRowZero = false;let firstColZero = false;for (let i = 0; i < row; i++) {    // 檢查第一列是否需要置零if (matrix[i][0] === 0) {firstColZero = true;break;}}for (let j = 0; j < col; j++) {    // 檢查第一行是否需要置零if (matrix[0][j] === 0) {firstRowZero = true;break;}}for (let i = 1; i < row; i++) {    // 使用第一行和第一列標記需要置零的行和列for (let j = 1; j < col; j++) {if (matrix[i][j] === 0) {matrix[i][0] = 0; // 標記該行需要置零matrix[0][j] = 0; // 標記該列需要置零}}}for (let i = 1; i < row; i++) {    // 遍歷矩陣,根據標記置零(跳過第一行和第一列)for (let j = 1; j < col; j++) {if (matrix[i][0] === 0 || matrix[0][j] === 0) {matrix[i][j] = 0;}}}if (firstColZero) {    // 根據標記處理第一列for (let i = 0; i < row; i++) {matrix[i][0] = 0;}}if (firstRowZero) {    // 根據標記處理第一行for (let j = 0; j < col; j++) {matrix[0][j] = 0;}}
};
  • 時間復雜度:O(m*n)
  • 空間復雜度:O(1),

54 螺旋矩陣

給你一個 m 行 n 列的矩陣 matrix ,請按照 順時針螺旋順序 ,返回矩陣中的所有元素。
在這里插入圖片描述

思路:
  1. 定義邊界:使用四個變量 top、bottom、left、right 分別表示矩陣的上、下、左、右邊界。
  2. 遍歷順序:按照順時針方向,依次遍歷上邊界、右邊界、下邊界和左邊界。
  3. 調整邊界:每遍歷完一個邊界后,調整相應的邊界。
  4. 重復遍歷:直到所有元素都被遍歷。
代碼實現:
var spiralOrder = function(matrix) {let res = [];// 維護四個邊界let left = 0;let right = matrix[0].length-1;let top = 0;let bottom = matrix.length-1;// 遍歷while(left<=right&&top<=bottom){for(let i=left;i<=right;i++){  // 遍歷上邊界res.push(matrix[top][i]);}top++;for(let i=top;i<=bottom;i++){  // 遍歷右邊界res.push(matrix[i][right]);}right--;if(top<=bottom){for(let i=right;i>=left;i--){  // 遍歷下邊界res.push(matrix[bottom][i]);}bottom--;}if(left<=right){for(let i=bottom;i>=top;i--){  // 遍歷左邊界res.push(matrix[i][left]);}left++;}}return res;
};

48. 旋轉圖像

給定一個 n × n 的二維矩陣 matrix 表示一個圖像。請你將圖像順時針旋轉 90 度。

你必須在原地旋轉圖像,這意味著你需要直接修改輸入的二維矩陣。請不要 使用另一個矩陣來旋轉圖像。
在這里插入圖片描述

思路:
  1. 轉置矩陣:將矩陣的行和列互換(即 matrix[i][j] 和 matrix[j][i] 交換)。
  2. 翻轉每一行:將轉置后的矩陣的每一行反轉。
代碼實現:
var rotate = function(matrix) {for(let i=0;i<matrix.length;i++){for(let j=i;j<matrix.length;j++){[matrix[i][j],matrix[j][i]] = [matrix[j][i],matrix[i][j]];}}for(let i=0;i<matrix.length;i++){matrix[i].reverse();}
};

240. 搜索二維矩陣 II

編寫一個高效的算法來搜索 m x n 矩陣 matrix 中的一個目標值 target 。該矩陣具有以下特性:

  • 每行的元素從左到右升序排列。
  • 每列的元素從上到下升序排列。
    在這里插入圖片描述
思路:從右上角或左下角開始搜索
  1. 從右上角開始:

    • 初始化指針在矩陣的右上角(即 row = 0,col = n - 1)。
    • 如果當前元素等于 target,返回 true。
    • 如果當前元素大于 target,說明目標值不可能在當前列,因此向左移動一列(col–)。
    • 如果當前元素小于 target,說明目標值不可能在當前行,因此向下移動一行(row++)。
    • 重復上述步驟,直到找到目標值或指針越界。
  2. 從左下角開始:

    • 初始化指針在矩陣的左下角(即 row = m - 1,col = 0)。
    • 如果當前元素等于 target,返回 true。
    • 如果當前元素大于 target,說明目標值不可能在當前行,因此向上移動一行(row–)。
    • 如果當前元素小于 target,說明目標值不可能在當前列,因此向右移動一列(col++)。
    • 重復上述步驟,直到找到目標值或指針越界。
代碼實現(從右上角開始)
var searchMatrix = function(matrix, target) {if (matrix.length === 0 || matrix[0].length === 0) return false;let row = 0;let col = matrix[0].length-1;while(row<matrix.length && col>=0){if(matrix[row][col]===target){return true;}else if(matrix[row][col]>target){col--;}else{row++;}}return false;
};

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/67814.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/67814.shtml
英文地址,請注明出處:http://en.pswp.cn/web/67814.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

每日一題——有效括號序列

有效括號序列 題目描述數據范圍&#xff1a;復雜度要求&#xff1a; 示例題解代碼實現代碼解析1. 定義棧和棧操作2. 棧的基本操作3. 主函數 isValid4. 返回值 時間和空間復雜度分析 題目描述 給出一個僅包含字符 (, ), {, }, [, ] 的字符串&#xff0c;判斷該字符串是否是一個…

集合通訊概覽

&#xff08;1&#xff09;通信的算法 是根據通訊的鏈路組成的 &#xff08;2&#xff09;因為通信鏈路 跟硬件強相關&#xff0c;所以每個CCL的庫都不一樣 芯片與芯片、不同U之間是怎么通信的&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 很重要…

紅黑樹的封裝

一、封裝思路 在 STL 中 map set 的底層就是封裝了一棵紅黑樹。 其中連接紅黑樹和容器的是迭代器&#xff0c;map set 暴露出的接口都不是自己寫的&#xff0c;而是紅黑樹寫的&#xff0c;外部接口封裝紅黑樹接口。 所以寫出紅黑樹為 map set 寫的接口&#xff0c;再在上層的…

java異常處理——try catch finally

單個異常處理 1.當try里的代碼發生了catch里指定類型的異常之后&#xff0c;才會執行catch里的代碼&#xff0c;程序正常執行到結尾 2.如果try里的代碼發生了非catch指定類型的異常&#xff0c;則會強制停止程序&#xff0c;報錯 3.finally修飾的代碼一定會執行&#xff0c;除…

使用QMUI實現用戶協議對話框

使用QMUI實現用戶協議對話框 懶加載用于初始化 TermServiceDialogController 對象。 懶加載 lazy var 的作用 lazy var dialogController: TermServiceDialogController {let r TermServiceDialogController()r.primaryButton.addTarget(self, action: #selector(primaryC…

C++進階: 紅黑樹及map與set封裝

紅黑樹總結整理 紅黑色概述&#xff1a; 紅黑樹整理與AVL樹類似&#xff0c;但在對樹的平衡做控制時&#xff0c;AVL樹會比紅黑樹更嚴格。 AVL樹是通過引入平衡因子的概念進行對樹高度控制。 紅黑樹則是對每個節點標記顏色&#xff0c;對顏色進行控制。 紅黑樹控制規則&…

在Qt中,slots 關鍵字有什么用?

有下面的Qt代碼&#xff1a; #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACEclass MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent nullptr…

列表標簽(無序列表、有序列表)

無序列表 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head><…

Kanass基礎教程-創建項目

Kanass是一款國產開源免費的項目管理工具&#xff0c;工具簡潔易用&#xff0c;開源免費&#xff0c;之前介紹過kanass的一些產品簡介及安裝配置方法&#xff0c;本文就從如何創建第一個項目來開始kanass上手之旅吧。 1. 創建項目 點擊項目->項目添加 按鈕進入項目添加頁面…

【Numpy核心編程攻略:Python數據處理、分析詳解與科學計算】2.10 ndarray內存模型:從指針到緩存優化

2.10 ndarray內存模型&#xff1a;從指針到緩存優化 目錄 #mermaid-svg-p0zxLYqAnn59O2Xe {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-p0zxLYqAnn59O2Xe .error-icon{fill:#552222;}#mermaid-svg-p0zxLYqAnn59O…

80-《紅球姜》

紅球姜 紅球姜&#xff08;學名&#xff1a;Zingiber zerumbet (L.) Smith&#xff09;是姜科姜屬多年生草本植物&#xff0c;根莖塊狀&#xff0c;株高可達2米。葉片披針形至長圓狀披針形&#xff0c;無柄或短柄&#xff1b;總花梗長可達30厘米&#xff0c;花序球果狀&#xf…

Hive之數據定義DDL

Hive之數據定義DDL 文章目錄 Hive之數據定義DDL寫在前面創建數據庫查詢數據庫顯示數據庫查看數據庫詳情切換當前數據庫 修改數據庫刪除數據庫創建表管理表(內部表)外部表管理表與外部表的互相轉換 修改表重命名表增加、修改和刪除表分區增加/修改/替換列信息 刪除表 寫在前面 …

DeepSeek 核心技術全景解析

DeepSeek 核心技術全景解析&#xff1a;突破性創新背后的設計哲學 DeepSeek的創新不僅僅是對AI基礎架構的改進&#xff0c;更是一場范式革命。本文將深入剖析其核心技術&#xff0c;探討 如何突破 Transformer 計算瓶頸、如何在 MoE&#xff08;Mixture of Experts&#xff09…

UE 5.3 C++ 對垃圾回收的初步認識

一.UObject的創建 UObject 不支持構造參數。 所有的C UObject都會在引擎啟動的時候初始化&#xff0c;然后引擎會調用其默認構造器。如果沒有默認的構造器&#xff0c;那么 UObject 將不會編譯。 有修改父類參數的需求&#xff0c;就使用指定帶參構造 // Sets default value…

點擊WPS 任務欄上的圖標,不是馬上進入工作頁面,而是呈現多個文檔頁面選擇時的處理方法

問題&#xff1a; 點擊WPS以后不是直接進入 解決&#xff1a; 首頁-配置和修復工具-高級-兼容設置-改為與microsoft office 2010兼容(D)

批量處理多個模型的預測任務

#!/bin/bash# 檢查是否傳入必要的參數&#xff0c;若未傳入參數則打印用法并退出 if [ "$#" -lt 1 ]; thenecho "用法: $0 <file_path>"echo "示例: $0 /home/aistudio/work/PaddleSeg/city/cityscapes_urls_extracted.txt"exit 1 fi# 讀取…

【LLM-agent】(task4)搜索引擎Agent

note 新增工具&#xff1a;搜索引擎Agent 文章目錄 note一、搜索引擎AgentReference 一、搜索引擎Agent import os from dotenv import load_dotenv# 加載環境變量 load_dotenv() # 初始化變量 base_url None chat_model None api_key None# 使用with語句打開文件&#xf…

【自然語言處理(NLP)】基于Transformer架構的預訓練語言模型:BERT 訓練之數據集處理、訓練代碼實現

文章目錄 介紹BERT 訓練之數據集處理BERT 原理及模型代碼實現數據集處理導包加載數據生成下一句預測任務的數據從段落中獲取nsp數據生成遮蔽語言模型任務的數據從token中獲取mlm數據將文本轉換為預訓練數據集創建Dataset加載WikiText-2數據集 BERT 訓練代碼實現導包加載數據構建…

LeetCode435周賽T2貪心

題目描述 給你一個由字符 N、S、E 和 W 組成的字符串 s&#xff0c;其中 s[i] 表示在無限網格中的移動操作&#xff1a; N&#xff1a;向北移動 1 個單位。S&#xff1a;向南移動 1 個單位。E&#xff1a;向東移動 1 個單位。W&#xff1a;向西移動 1 個單位。 初始時&#…

【Numpy核心編程攻略:Python數據處理、分析詳解與科學計算】2.5 高級索引應用:圖像處理中的區域提取

2.5 高級索引應用&#xff1a;圖像處理中的區域提取 目錄/提綱 #mermaid-svg-BI09xc20YqcpUam7 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-BI09xc20YqcpUam7 .error-icon{fill:#552222;}#mermaid-svg-BI09xc20…