用對角線去遍歷矩陣

聲明

該系列文章僅僅展示個人的解題思路和分析過程,并非一定是優質題解,重要的是通過分析和解決問題能讓我們逐漸熟練和成長,從新手到大佬離不開一個磨練的過程,加油!

原題鏈接

用對角線遍歷矩陣https://leetcode.cn/leetbook/read/array-and-string/cuxq3/

算法分析
圖一

圖二

圖三
圖四

? ? ? ?

由上述四個圖可以總結得出以下八個結論:?

結論1:k屬于[0,a(max)+b(max)]。

結論2:每一層遍歷行最多存在min(m,n)個矩陣索引對,min(m,n)表示m和n二者中小的那一個值。

結論3:a屬于[0,m-1],b屬于[0,n-1]。

結論4:若k為偶數則以a為比較對象,此時若k<=a(max)則當前遍歷行的起始索引對為(k,0),反之則起始索引對為(a(max),k-a(max))。

結論5:若k為奇數則以b為比較對象,此時若k<=b(max)則當前遍歷行的起始索引對位(0,k),反之則起始索引對為(k-b(max),b(max))。

結論6:從當前遍歷行的起始索引對開始,若k為偶數,則下一個索引對為(a-1,b+1),反之下一個索引對為(a+1,b-1)。

結論7:遍歷行的結束條件由該矩陣的遍歷行最大索引對個數和a(min)、b(min)共同決定,首先應判斷當前遍歷行訪問的矩陣索引對個數是否達到了該矩陣的遍歷行最大索引對個數,若達到了則完成該遍歷行的遍歷,否則判斷下一個索引對(a,b),若a或b越界則表明完成該遍歷行的遍歷。

結論8:整個矩陣遍歷結束的條件是當前遍歷的矩陣索引對的個數是m×n個。

?代碼示例(C#)
public int[] FindDiagonalOrder(int[][] mat)
{int m = mat.Length;//矩陣的行數int n = mat[0].Length;//矩陣的列數int[] result = new int[m * n];//結果數組//a:索引對的a,b:索引對的b,k:a+b,count:當前已遍歷的矩陣索引對個數,minA:a的最小值//minB:b的最小值,index:結果數組中的索引指針int a, b, k = 0, count = 0, minA = 0, minB = 0, index = 0;int maxA = m - 1;//a的最大值int maxB = n - 1;//b的最大值int maxIndexsCount = m <= n ? m : n;//該矩陣中遍歷行的矩陣索引對個數的最大值int lineIndexsCount;//遍歷行當前已遍歷的矩陣索引對個數while (count < m * n){lineIndexsCount = 0;//若k%2為0則表示k為偶數,反之則為奇數if (k % 2 == 0){if (k <= maxA){a = k;b = 0;}else{a = maxA;b = k - maxA;}}else{if (k <= maxB){a = 0;b = k;}else{a = k - maxB;b = maxB;}}while (lineIndexsCount < maxIndexsCount){//a或b越界則完成此次遍歷行的遍歷if ((a < minA || a > maxA) || (b < minB || b > maxB)) break;//記錄結果result[index++] = mat[a][b];count++;if (k % 2 == 0){a--;b++;}else{a++;b--;}}k++;}return result;
}
算法解說?

????????按照原題的思路我們列舉出了四種矩陣,嚴格來說只有三種,分別是矩陣行數大于列數、行數等于列數、行數小于列數,而為了保證后續結論的真實性,我們列舉了兩個行數等于列數的矩陣。

????????圖中我們完成了四個矩陣的制定,然后按照題目要求去遍歷了四個矩陣并且將遍歷的結果記錄下來,從行列定義上我們可以將矩陣構建在二維平面中,從而為每一個元素設立一個唯一的坐標值,在本題中我們把這個坐標值稱為索引對。有了索引對我們可以進一步按照索引對兩個數值之和對遍歷結果進行分組,在本題中我們把索引對兩個數值之和相同的一組索引對稱為遍歷行,為了簡便后續將索引對兩個數值之和稱為索引對結果值。

????????將遍歷行按照索引對結果值從小到大的順序進行排列,為了能夠發現更多有用的結論,我們把每一層遍歷行的索引對結果值、結果值的奇偶性、索引對與k值的關系列舉出來,除此之外還需要列舉出矩陣行列數以及索引對兩個數值的取值范圍,至于為什么要去列舉這些東西,實際上還是通過嘗試和思考,就像上學時做數學題,瀏覽題目之后列舉出題目中給定的條件,然后根據條件去解題。

????????這一步我們可以理解為進一步細化和剖析已知條件,我們的目的是從已知條件中獲取可靠的結論,從而根據結論解決問題,因此我們總結出了上文的八個結論。

????????那么已知結論后如何去編寫代碼呢?本人是按照以下幾個問題去解決的。

????????1.我們需要明白輸入和輸出是什么?

????????2.我們需要定義哪些變量?

????????3.函數主體是什么?

????????4.某些過程的結束條件是什么?

????????實際上,就是將我們的八個結論構建為代碼,簡單劃分就是定義變量和邏輯主體,定義變量就看結論中需要記錄數據的描述,邏輯主體就看結論中對于邏輯處理、結束條件的描述。

????????當然這樣轉換出來的代碼比較粗糙,所以后續還可以結合自己的編程知識再去優化自己的代碼,讓它變得更加簡潔精致。

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

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

相關文章

wsl2(debian)安裝python的不同版本例如3.8

要在Debian上安裝 Python 3.8&#xff0c;可以按照以下步驟操作&#xff1a; 1.確保你的 Debian 系統已經更新到最新版本&#xff0c;可以使用以下命令更新&#xff1a; sudo apt update sudo apt upgrade2.安裝 Python 3.8 的依賴項&#xff0c;以及構建 Python 時需要的工具…

django中實現事務的幾種方式

1.實現事務的三種方式 1.1 全局開啟事務---> 全局開啟事務&#xff0c;綁定的是http請求響應整個過程 DATABASES {default: {#全局開啟事務&#xff0c;綁定的是http請求響應整個過程ATOMIC_REQUESTS: True, }} from django.db import transaction# 局部禁用事務 transac…

數據結構——棧(C語言)

需求&#xff1a;無 棧的概念&#xff1a; 棧&#xff1a;一種特殊的線性表&#xff0c;其只允許在固定的一端進行插入和刪除元素操作。進行數據插入和刪除操作的一端稱為棧頂&#xff0c;另一端為棧底。棧中的數據元素遵守后進先出&#xff08;LIFO&#xff09;原則。壓棧&…

GPIO 配置 和 PINCTRL有啥區別

GPIO&#xff08;通用輸入/輸出&#xff09;和 PINCTRL&#xff08;引腳控制器&#xff09;是在嵌入式系統中用于管理和控制硬件引腳的關鍵概念。它們在硬件層面上起著不同的作用。 GPIO配置&#xff1a; GPIO 是一種通用的硬件接口&#xff0c;用于控制和讀取數字信號。每個 …

自動駕駛——駛向未來的革命性技術

自動駕駛——駛向未來的革命性技術 自動駕駛的組件自動駕駛的優勢自動駕駛的應用自動駕駛的未來中國的自動駕駛 自動駕駛是一種技術&#xff0c;它允許車輛在沒有人類駕駛員的情況下自主地進行行駛。它利用各種傳感器、計算機視覺、人工智能和機器學習算法來感知和理解周圍環境…

.net連接mysql,提示找不到請求的 .Net Framework Data Provider。可能沒有安裝

開發完成的.net程序需要連接mysql數據庫&#xff0c;在個人電腦上運行沒問題&#xff0c;別人運行時提示“提示找不到請求的 .Net Framework Data Provider。可能沒有安裝”。經過查詢&#xff0c;安裝Connector/NET 8.1.0&#xff0c;下載地址如下所示&#xff1a; https://d…

Linux touch 命令指南大全

1. 概述 在本教程中,我們將學習touch命令。簡而言之,這個命令允許我們更新文件或目錄的最后修改時間和最后訪問時間。 因此,我們將重點關注如何使用該命令及其各種選項。 請注意,我們使用 Bash 測試了此處顯示的所有命令;但是,它們應該與任何兼容 POSIX 的 shell 一起使…

使用騰訊云輕量服務器Matomo應用模板建網站流量統計系統

騰訊云百科分享使用騰訊云輕量應用服務器Matomo應用模板搭建網站流量統計系統&#xff0c;Matomo 是一款開源的網站數據統計軟件&#xff0c;可以用于跟蹤、分析您的網站的流量&#xff0c;同時充分保障數據安全性、隱私性。該鏡像基于 CentOS 7.6 64位操作系統&#xff0c;已預…

postgresql字段被截斷問題

前言 最近遇到一個問題就是字段名過長&#xff0c;會被pg給截斷&#xff0c;導致原始字段和下游用的的字段不一樣&#xff0c;就會報錯。當然&#xff0c;小伙伴可能會說為什么會用那么長的字段名&#xff0c;每個應用程序里面處理不一樣&#xff0c;我們數據字段每次被使用就…

06-加密算法

加密算法 一、前言知識1、加密解密2、MD5&#xff08;最常見&#xff09;3、SHA4、進制5、時間戳6、URL編碼7、base64編碼8、unescape編碼9、AES加密10、DES&#xff08;類似于base64&#xff09; 二、常見加密形式算法解析三、演示案例1、某 CTF 比賽題目解析2、某 CMS 密碼加…

爆肝整理,Python自動化測試-Pytest參數化實戰封裝,一篇打通...

目錄&#xff1a;導讀 前言一、Python編程入門到精通二、接口自動化項目實戰三、Web自動化項目實戰四、App自動化項目實戰五、一線大廠簡歷六、測試開發DevOps體系七、常用自動化測試工具八、JMeter性能測試九、總結&#xff08;尾部小驚喜&#xff09; 前言 參數化&#xff1…

uniapp案例30余種實戰項目

uniapp案例30余種實戰項目 mpvue框架仿滴滴出行didi-masteruni-app自定義導航欄title-customvue-mpvue-ChatRobot聊天機器人vue-mpvue-ChatRobot-master一款播課類小程序, 基于 mpvue 構建mp-podcast-mpvue-mastermpVue高仿美團小程序教程mpvue-meituan-masteruni-app 二維碼生…

【RS485 - 為什么要接收端計算時間偏移量】

我以前一直以為計算機等的信號傳輸速率都是非常快的&#xff0c;不用計算時間差。 然而在實際應用中發現信息是需要傳輸時間的&#xff0c;而這些時間somehow是可以計算的。 前提信息 波特率 9600&#xff1b; 控制器和執行器通過RS485通信&#xff1b; 控制器發出同步的命令…

spring框架,以及和spring框架相關的Java面試題和spring ioc的注入方式

目錄 一.spring來源&#xff0c;以及介紹 1.spring誕生的背景 2.spring框架 介紹 3.spring框架在使用中的優點以及不足 3.1優點 3.2不足 3.3總結 4.為什么要使用spring 二.將spring框架部署在IDEA中 1.替換pom.xml 2.構建spring所需要的xml文件 三.spring的三種注入…

網絡通信原理IP頭部格式(第四十二課)

字段作用解析:1)版本: 指的IP地址的版本 (IPv4 或 IPV6)2)首部長度: 次數據包的首部長度一共是多少,沒有加可選項3)優先級與服務類型:表示****數據包是否需要優選傳遞4)總長度: 表示的是整個數據包的大小,也就****是首部+數據5)標識符、標志、段偏移量:的作用將拆開的…

無涯教程-Perl - syswrite函數

描述 此函數嘗試將SCALAR中的LENGTH個字節寫入與FILEHANDLE相關的文件。如果指定了OFFSET,則從提供的SCALAR中的OFFSET字節中讀取信息。該函數使用C /操作系統的write()函數,該函數繞過普通緩沖。 語法 以下是此函數的簡單語法- syswrite FILEHANDLE, SCALAR, LENGTH, OFFS…

draw.io導出矢量圖到word報錯text is not svg - cannot display

先參考https://blog.csdn.net/a625750076/article/details/126384831 如果不行&#xff0c;可能是轉存的問題 解決方法&#xff1a;直接在draw.io上操作 第一步 第二步 然后再word中粘貼&#xff0c;依舊是矢量圖哦&#xff01;

Ajax入門+aixos+HTTP協議

一.Ajax入門 概念:AJAX是瀏覽器與服務器進行數據通信的技術 axios使用: 引入axios.js使用axios函數:傳入配置對象,再用.then回調函數接受結果,并做后續處理 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>01.axios使用…

面試題. 零矩陣

編寫一種算法&#xff0c;若M N矩陣中某個元素為0&#xff0c;則將其所在的行與列清零。 示例 1&#xff1a; 輸入&#xff1a; [[1,1,1],[1,0,1],[1,1,1] ] 輸出&#xff1a; [[1,0,1],[0,0,0],[1,0,1] ] 示例 2&#xff1a; 輸入&#xff1a; [[0,1,2,0],[3,4,5,2],[1,3…

獲取excel中的圖片(包含wps中嵌入單元格圖片)

項目中有excel導入功能,并且需要導入excel中的圖片;模板如圖: 已知office中插入的圖片為浮動形式;如圖: wps中可以插入浮動圖片,也可以插入嵌入單元格圖片;如圖: 并且在wps嵌入單元格形式的圖片可以看到使用的是公式;如圖: 問題來了,如何獲取圖片 并且將圖片與單元格進行對應 …