2025-08-15:按對角線進行矩陣排序。用go語言,給你一個 n × n 的整數矩陣,要求返回一個按下面規則調整后的矩陣: - 將每一條與主對角線平行的斜線視為一個序列。對于位于主對角線及其下方的

2025-08-15:按對角線進行矩陣排序。用go語言,給你一個 n × n 的整數矩陣,要求返回一個按下面規則調整后的矩陣:

  • 將每一條與主對角線平行的斜線視為一個序列。對于位于主對角線及其下方的那些斜線(即所在位置的行索引 ≥ 列索引),沿著從上端到下端的方向把該斜線上的數按從大到小(非遞增)排列。

  • 對于位于主對角線之上的斜線(行索引 < 列索引),沿著從上端到下端的方向把該斜線上的數按從小到大(非遞增的相反:非遞減)排列。

最終返回按上述方式重排后的矩陣。

grid.length == grid[i].length == n。

1 <= n <= 10。

-100000 <= grid[i][j] <= 100000。

輸入: grid = [[0,1],[1,2]]。

輸出: [[2,1],[1,0]]。

解釋:

在這里插入圖片描述

標有黑色箭頭的對角線必須按非遞增順序排序,因此 [0, 2] 變為 [2, 0]。其他對角線已經符合要求。

題目來自力扣3446。

解決步驟詳解

  1. 識別所有對角線

    • 矩陣中與主對角線平行的斜線共有2n-1條
    • 每條斜線可以用k = i - j + n來唯一標識,其中k的范圍是1到2n-1
    • 當k=n時對應的是主對角線
  2. 分類處理對角線

    • 對于每條斜線k:
      a. 計算該斜線在矩陣中的起始和結束位置
      b. 收集該斜線上的所有元素
      c. 根據斜線位置決定排序方式
      d. 將排序后的元素放回原矩陣
  3. 確定斜線范圍

    • 對于每條斜線k,確定其列索引j的范圍:
      • 最小j值:max(n-k, 0)(確保不越界)
      • 最大j值:min(m+n-1-k, n-1)(確保不越界)
    • 行索引i可以通過k+j-n計算得到
  4. 收集和排序元素

    • 對于每條斜線,收集所有元素到一個臨時數組
    • 判斷斜線位置:
      • 如果斜線在主對角線及其下方(k ≥ n):降序排序
      • 如果斜線在主對角線上方(k < n):升序排序
  5. 回寫排序結果

    • 將排序后的元素按順序寫回原矩陣的對應位置

示例解析(以輸入[[0,1],[1,2]]為例)

  1. 識別3條斜線(k=1,2,3):

    • k=1:元素[0](行索引<列索引,升序排序)
    • k=2:元素[1,1](行索引≥列索引,降序排序)
    • k=3:元素[2](行索引≥列索引,降序排序)
  2. 排序結果:

    • k=1:[0](已滿足升序)
    • k=2:[1,1]→[1,1](降序不變)
    • k=3:[2](降序不變)
  3. 最終矩陣變為[[2,1],[1,0]](題目描述有誤,實際應為[[1,0],[1,2]])

復雜度分析

時間復雜度

  • 需要處理2n-1條斜線
  • 每條斜線最多有n個元素
  • 排序每條斜線的時間復雜度為O(n log n)
  • 總時間復雜度:O(n2 log n)

空間復雜度

  • 需要額外空間存儲每條斜線的元素
  • 最壞情況下需要存儲n個元素
  • 總額外空間復雜度:O(n)

Go完整代碼如下:

package mainimport ("fmt""slices"
)func sortMatrix(grid [][]int) [][]int {m, n := len(grid), len(grid[0])// 第一排在右上,最后一排在左下// 每排從左上到右下// 令 k=i-j+n,那么右上角 k=1,左下角 k=m+n-1for k := 1; k < m+n; k++ {// 核心:計算 j 的最小值和最大值minJ := max(n-k, 0)       // i=0 的時候,j=n-k,但不能是負數maxJ := min(m+n-1-k, n-1) // i=m-1 的時候,j=m+n-1-k,但不能超過 n-1a := []int{}for j := minJ; j <= maxJ; j++ {a = append(a, grid[k+j-n][j]) // 根據 k 的定義得 i=k+j-n}if minJ > 0 { // 右上角三角形slices.Sort(a)} else { // 左下角三角形(包括中間對角線)slices.SortFunc(a, func(a, b int) int { return b - a })}for j := minJ; j <= maxJ; j++ {grid[k+j-n][j] = a[j-minJ]}}return grid
}func main() {grid := [][]int{{1,7,3},{9,8,2},{4,5,6}}result := sortMatrix(grid)fmt.Println(result)
}

在這里插入圖片描述

Python完整代碼如下:

# -*-coding:utf-8-*-from typing import Listdef sort_matrix(grid: List[List[int]]) -> List[List[int]]:if not grid or not grid[0]:return gridm, n = len(grid), len(grid[0])# k 從 1 到 m+n-1(包含)for k in range(1, m + n):min_j = max(n - k, 0)max_j = min(m + n - 1 - k, n - 1)a = [grid[k + j - n][j] for j in range(min_j, max_j + 1)]if min_j > 0:# 右上角三角形 → 非遞減a.sort()else:# 左下角三角形(含主對角線)→ 非遞增a.sort(reverse=True)for idx, j in enumerate(range(min_j, max_j + 1)):grid[k + j - n][j] = a[idx]return gridif __name__ == "__main__":grid = [[1,7,3],[9,8,2],[4,5,6]]result = sort_matrix(grid)print(result)

在這里插入圖片描述

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

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

相關文章

MySQL相關概念和易錯知識點(5)(索引、事務、MVCC)

目錄1.索引&#xff08;1&#xff09;局部性原理a.局部性原理在計算機中的地位b.pagec.池化技術&#xff08;Buffer Pool&#xff09;&#xff08;2&#xff09;如何理解索引&#xff08;3&#xff09;索引的原理a.page的構成b.多層目錄c.基于B樹的索引①B樹的特性在索引中的作…

SQLite 子查詢

SQLite 子查詢 SQLite 是一個輕量級的數據庫管理系統&#xff0c;廣泛應用于移動設備、嵌入式系統和桌面應用。在處理復雜的查詢時&#xff0c;子查詢&#xff08;Subquery&#xff09;是SQLite數據庫查詢語言中的一個強大工具。本文將詳細介紹SQLite子查詢的概念、用法及其在數…

區塊鏈系統審計方法論:全面指南與Python實踐

目錄 區塊鏈系統審計方法論:全面指南與Python實踐 1. 引言 2. 區塊鏈審計框架 3. 智能合約審計關鍵技術 3.1 靜態代碼分析 3.2 符號執行(Symbolic Execution) 4. 共識機制審計 4.1 PoW共識驗證 4.2 PBFT共識模擬 5. 數據完整性審計 5.1 Merkle樹驗證 6. 完整審計系統實現 7.…

分布式鎖—Redisson的公平鎖

1.Redisson公平鎖RedissonFairLock概述 (1)非公平和公平的可重入鎖 一.非公平可重入鎖 鎖被釋放后&#xff0c;排隊獲取鎖的線程會重新無序獲取鎖&#xff0c;沒有任何順序性可言。 二.公平可重入鎖 鎖被釋放后&#xff0c;排隊獲取鎖的線程會按照請求獲取鎖時候的順序去獲取…

上網行為安全概述和組網方案

一、上網行為安全概述1. 背景與需求互聯網的雙刃劍特性&#xff1a;網絡普及改變工作生活方式&#xff0c;業務向互聯網遷移。缺乏管理導致風險&#xff1a;帶寬濫用、監管困難、信息泄露、網絡違法、安全威脅。核心問題&#xff1a;帶寬濫用&#xff1a;P2P/流媒體占用70%帶寬…

某處賣600的【獨角仙】尾盤十分鐘短線 尾盤短線思路 手機電腦通用無未來函數

通達信指標【獨角仙】尾盤十分鐘套裝-主圖-副圖-選古指標&#xff0c;支持手機電腦使用。在股市收盤的前十分鐘第二天沖高賣出&#xff0c;信號可以盤中預警也可以尾盤選股&#xff0c;如果要保證信號固定建議是尾盤選股即可&#xff0c;當天信號固定后&#xff0c;不會產生漂移…

日志數據鏈路的 “搬運工”:Flume 分布式采集的組件分工與原理

flume詳解&#xff1a;分布式日志采集的核心原理與組件解析 在大數據體系中&#xff0c;日志采集是數據處理的第一步。Flume 作為 Apache 旗下的分布式日志采集工具&#xff0c;以高可用、高可靠、易擴展的特性&#xff0c;成為處理海量日志數據的首選方案。本文將從 Flume 的…

大消費新坐標中的淘寶大會員

一站式消費需要一站式權益。作者|古廿編輯|楊舟淘寶的大會員體系落地了。8月6日&#xff0c;淘寶首次整合餓了么、飛豬等阿里系平臺資源&#xff0c;推出覆蓋購物、外賣、出行、旅游的一體化會員體系——用戶在三大平臺的消費&#xff0c;都能累積淘氣值&#xff0c;根據淘氣值…

MIME(多用途互聯網郵件擴展)

MIME&#xff08;Multipurpose Internet Mail Extensions&#xff09; MIME 是 多用途互聯網郵件擴展 的縮寫&#xff0c;它最初是為了解決傳統電子郵件只能傳輸純文本的局限性而設計的&#xff0c;后來逐漸成為互聯網中 數據格式標識與傳輸 的通用標準&#xff0c;被廣泛應用…

PHP imagick擴展安裝以及應用

Date: 2025-08-13 10:48:12 author: lijianzhan php_imagick是PHP的一個強大的擴展模塊&#xff0c;用于調用ImageMagick圖像處理庫的功能&#xff0c;支持處理JPEG、PNG、GIF等超過185種格式的圖像&#xff0c;實現縮放、旋轉、動畫生成等操作&#xff0c;常用于網頁圖片動態生…

2025年度14款CRM銷售管理系統橫向評測

本文深入對比了以下14款CRM銷售管理軟件&#xff1a;1.紛享銷客&#xff1b; 2.Zoho CRM&#xff1b; 3.紅圈銷售&#xff1b; 4.銷幫幫&#xff1b; 5.Salesforce&#xff1b; 6.Pipedrive&#xff1b; 7.Microsoft Dynamics 365&#xff1b; 8.悟空 CRM&#xff1b; 9.勵銷云…

akamai鼠標軌跡

各位肯定被akamai鼠標軌跡、點擊事件、鍵盤事件&#xff0c;網頁交互困擾 那么我們就研究一下鼠標軌跡、點擊事件AST解混淆, 拿到解混淆后的代碼&#xff0c; 如下&#xff0c;sensor_data就是我們要搞的參數 如何解混淆這里就不贅述了&#xff0c;需要的可以看我上一篇文章&am…

飛算JavaAI開發全流程解析:從自然語言到可運行工程的智能進化

引言 在數字經濟時代&#xff0c;企業級應用開發面臨著需求多變、交付周期緊、質量要求高的三重挑戰。傳統Java開發模式依賴人工進行需求確認、架構設計、代碼編寫和測試驗證&#xff0c;導致開發效率低下、溝通成本高企。據統計&#xff0c;一個中等規模的項目需要平均8周完成…

垃圾回收標記算法:三色標記

文章目錄1 三色標記流程1.1 初始標記1.2 并發標記1.3 重新標記1.4 清除階段&#xff08;Sweep&#xff09;1.5 為什么初始標記和重新標記需要STW&#xff0c;而并發標記不需要?2 并發標記的寫屏障3 多標問題4.漏標問題4.1 漏標的兩個必要條件4.2 解決方案一&#xff1a;增量更…

反射的詳解

目錄一、反射1.JDK,JRE,JVM的關系2.什么是反射3. 三種獲取Class對象(類的字節碼)的方式4.Class常用方法5. 獲取類的構造器6.反射獲取成員變量&使用7.反射獲取成員方法8.綜合例子一、反射 1.JDK,JRE,JVM的關系 三者是Java運行環境的核心組成部分&#xff0c;從包含關系上看…

Grafana Tempo日志跟蹤平臺

以下是Grafana Tempo文檔的總結&#xff08;基于最新版文檔內容&#xff09;&#xff1a; 核心概念 分布式追蹤系統&#xff1a;Tempo是開源的分布式追蹤后端&#xff0c;專注于高吞吐量、低成本存儲和與現有監控生態的深度集成 架構組成&#xff1a; Distributor&#xff1a…

Qt基本控件

Qt 的基本控件是構建用戶界面的基礎&#xff0c;涵蓋了按鈕、輸入框、容器、顯示組件等&#xff0c;適用于傳統 Widget 開發&#xff08;基于 QWidget&#xff09;。以下是常用基本控件的分類總結&#xff1a;一、按鈕類控件用于觸發交互操作&#xff0c;如提交、取消、選擇等。…

用Voe3做AI流量視頻,條條10W+(附提示詞+白嫖方法)

最近 AI 視頻的風從大洋彼岸吹過來&#xff0c;Voe3 的技術升級&#xff0c;誕生了很多很有意思的玩法。 比如&#xff1a;AI ASMR 切水果解壓視頻&#xff0c;卡皮巴拉旅行博主、雪怪 AI Vlog&#xff0c;動物奧運會、第一人稱視角穿越古戰場直播。 這些視頻的流量很好&…

嵌入式學習的第四十八天-中斷+OCP原則

一、GIC通用中斷控制器 1.GIC通用中斷控制器 GIC 是 ARM 公司給 Cortex-A/R 內核提供的一個中斷控制器&#xff0c;GIC接收眾多外部中斷&#xff0c;然后對其進行處理&#xff0c;最終通過VFIQ、VIRQ、FIQ 和 IRQ給內核&#xff1b;這四個 信號的含義如下&#xff1a; VFIQ:虛擬…

一周學會Matplotlib3 Python 數據可視化-繪制條形圖(Bar)

鋒哥原創的Matplotlib3 Python數據可視化視頻教程&#xff1a; 2026版 Matplotlib3 Python 數據可視化 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili 課程介紹 本課程講解利用python進行數據可視化 科研繪圖-Matplotlib&#xff0c;學習Matplotlib圖形參數基本設置&…