Go 刷 LeetCode 系列:螺旋矩陣

2021-03-02 Go語言中文網

歸納:

   對於螺旋矩陣之類的題目有很多變形,但是除了邊界條件不同外,都是兩層循環的左右邊界向外擴展或者向內收斂的問題,因此一般只要控制好循環左右上下邊界的增減,問題便解決了

給定一個包含 m x n 個元素的矩陣(m 行, n列),請按照順時針螺旋順序,返回矩陣中的所有元素。

示例 1:

輸入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
輸出: [1,2,3,6,9,8,7,4,5]

示例 2:

輸入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
輸出: [1,2,3,4,8,12,11,10,9,5,6,7]

func spiralOrder(matrix [][]int) []int {  if len(matrix) < 1 {    return []int{}  }  left := 0  up := 0  down := len(matrix) - 1  right := len(matrix[0]) - 1  var r []int  for left <= right && up <= down {    for i := left; i <= right; i++ {      r = append(r, matrix[up][i])    }    for j := up + 1; j <= down; j++ {      r = append(r, matrix[j][right])    }    if left < right && up < down {      for i := right - 1; i >= left; i-- {        r = append(r, matrix[down][i])      }      for j := down - 1; j >= up+1; j-- {        r = append(r, matrix[j][left])      }    }
left++ right-- up++ down-- fmt.Println(r) } return r}

給定一個正整數 n,生成一個包含 1 到 n2 所有元素,且元素按順時針順序螺旋排列的正方形矩陣。

示例:

輸入: 3
輸出:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]

func generateMatrix(n int) [][]int {  if n < 1 {    return [][]int{}  }  left := 0  up := 0  down := n - 1  right := n - 1    r:=make([][]int,n)    for i:=0;i<n;i++{        r[i]=make([]int,n)    }    k:=1  for left <= right && up <= down {    for i := left; i <= right; i++ {      r[up][i]=k            k++    }    for j := up + 1; j <= down; j++ {            r[j][right]=k            k++    }    if left < right && up < down {      for i := right - 1; i >= left; i-- {           r[down][i]=k            k++      }      for j := down - 1; j >= up+1; j-- {           r[j][left]=k            k++      }    }
left++ right-- up++ down-- } return r}

在 R 行 C 列的矩陣上,我們從 (r0, c0) 面朝東面開始

這裡,網格的西北角位於第一行第一列,網格的東南角位於最後一行最後一列。

現在,我們以順時針按螺旋狀行走,訪問此網格中的每個位置。

每當我們移動到網格的邊界之外時,我們會繼續在網格之外行走(但稍後可能會返回到網格邊界)。

最終,我們到過網格的所有 R * C 個空間。

按照訪問順序返回表示網格位置的坐標列表。

 

示例 1:

輸入:R = 1, C = 4, r0 = 0, c0 = 0
輸出:[[0,0],[0,1],[0,2],[0,3]]

 

示例 2:

輸入:R = 5, C = 6, r0 = 1, c0 = 4
輸出:[[1,4],[1,5],[2,5],[2,4],[2,3],[1,3],[0,3],[0,4],[0,5],[3,5],[3,4],[3,3],[3,2],[2,2],[1,2],[0,2],[4,5],[4,4],[4,3],[4,2],[4,1],[3,1],[2,1],[1,1],[0,1],[4,0],[3,0],[2,0],[1,0],[0,0]]

 

提示:

1 <= R <= 100

1 <= C <= 100

0 <= r0 < R

0 <= c0 < C

func spiralMatrixIII(R int, C int, r0 int, c0 int) [][]int {
if R <=0 || C<=0 { return [][]int{} } a := make([][]int, R) for i := 0; i < R; i++ { a[i] = make([]int, C) } k := 1 right := 1 down := 1 left := 0 up := 0 a[r0][c0] = k k++ var r [][]int r=append(r,[]int{r0,c0}) for c0+right < C || r0+down < R || c0-left >= 0 || r0-up >= 0 { for i := c0 - left + 1; i <= c0+right; i++ { if r0-up >= 0 && i < C && i>=0 { a[r0-up][i] = k k++ r=append(r,[]int{r0-up,i}) } } fmt.Println(a) for j := r0 - up + 1; j <= r0+down; j++ { if c0+right < C && j < R && j>=0{ a[j][c0+right] = k k++ r=append(r,[]int{j,c0+right}) } } fmt.Println(a) for i := c0 + right - 1; i >= c0-left-1; i-- { if r0+down < R && i>=0 && i<C { a[r0+down][i] = k k++ r=append(r,[]int{r0+down,i}) } } fmt.Println(a) for j := r0 + down - 1; j >= r0-up-1; j-- { if j >= 0 && c0-left-1 >= 0 && j<R { a[j][c0-left-1] = k k++ r=append(r,[]int{j,c0-left-1}) } } fmt.Println(a) left++ up++ right++ down++
} return r}

推薦閱讀

喜歡本文的朋友,歡迎關注「Go語言中文網」:

Go語言中文網啟用微信學習交流群,歡迎加微信:274768166

相關焦點

  • ​LeetCode刷題實戰54:螺旋矩陣
    今天和大家聊的問題叫做 螺旋矩陣,我們先來看題面:https://leetcode-cn.com/problems/spiral-matrix/Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in
  • 一起刷 leetcode 之螺旋矩陣(頭條和美團真題)
    問題或建議,請公眾號留言;如果你覺得文章對你有幫助,歡迎關注與轉發題目描述給定一個包含 m*n 個元素的矩陣(m 行,n 列),請按順時針螺旋順序,返回矩陣中所有元素leetcode 第 54 題https://leetcode-cn.com/problems/spiral-matrix/示例示例 1
  • leetcode刷題最強指南(版本1.0)
    為什麼會有這篇刷題指南很多剛開始刷題的同學都有一個困惑:面對leetcode上近兩千道題目,從何刷起
  • 【LeetCode溫故而知新】螺旋矩陣
    問題或建議,請公眾號留言;如果你覺得文章對你有幫助,歡迎關注分享題目 給定一個包含 m x n 個元素的矩陣(m 行, n 列),請按照順時針螺旋順序,返回矩陣中的所有元素。假設有個大小為 m*n 的矩陣,解題步驟如下定義方向private static int DIRECTION_RIGHT = 0;private static int DIRECTION_DOWN = 1;private static int DIRECTION_LEFT = 2;private static int DIRECTION_UP
  • 六十四、開始刷Leetcode之旅(Python版本)
    其實Leetcode上的一部分題我都基本刷過,那麼我就開始吧。註冊Leetcode帳號目前Leetcod有國際和中文的兩個版本,下圖就是我的中文版本,刷的不夠,其實我也挺菜的。這個是中文的網址:https://leetcode-cn.com/problemset/all/下圖就是我的國際版本,其實我主要在國際版混日子,刷了100多題,其實我很菜的。這是它的官網,https://leetcode.com。
  • 【SQL刷題系列】:leetcode180 Consecutive Numbers
    點擊上方 ↑ 藍色關注「Python數據科學」SQL刷題系列為此,Python數據科學開啟了SQL刷題的系列,希望可以幫助有需要的朋友們。題目來源:本篇內容為Leetcode上SQL題庫180難易程度:中等▌刷題回顧【SQL刷題系列】:leetcode178 Rank Scores【SQL刷題系列】:leetcode183
  • Go 實現 LeetCode 全集
    Water - https://leetcode.com/problems/container-with-most-water/Binary[X] Sum of Two Integers - https://leetcode.com/problems/sum-of-two-integers/[X] Number of 1 Bits - https://leetcode.com
  • Go 刷 leetcode|樹系列之對稱二叉樹
    來源:力扣(LeetCode)連結:https://leetcode-cn.com/problems/symmetric-tree著作權歸領扣網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。解題思路 關於「樹」的題目,大多使用「遞歸」思想來解決。
  • leetcode 45. 跳躍遊戲--每天刷一道leetcode算法系列!
    leetcode 45. 跳躍遊戲--每天刷一道leetcode算法系列!(本篇)題目描述給定一個非負整數數組,你最初位於數組的第一個位置。數組中的每個元素代表你在該位置可以跳躍的最大長度。你的目標是使用最少的跳躍次數到達數組的最後一個位置。
  • 【SQL刷題系列】:leetcode183 Customers Who Never Order
    (點擊上方藍色,快速關注)SQL刷題系列:SQL作為一種資料庫查詢和程序設計語言,是從事數據技術人員必備的技能
  • 一起刷 leetcode 之旋轉矩陣(頭條/華為/陌陌真題)
    https://leetcode-cn.com/problems/rotate-matrix-lcci/示例示例 1給定 matrix = [  [1,2,3],  [4,5,6],  [7,8,9]],原地旋轉輸入矩陣,使其變為:[  [7,4,1],  [8,5,2],  [9,6,3
  • LeetCode 系列-數組和矩陣
    helper[i] == 1 {            return i        }    }    return len(nums) + 1}48 Rotate ImageLeetCode/力扣給定一個 n × n 的二維矩陣表示一個圖像
  • C#刷遍Leetcode面試題系列連載(2): No.38 - 報數
    前言前文傳送門:C#
  • C#刷遍Leetcode面試題系列連載(1) - 入門與工具簡介
    刷 OJ 時,大家還會常用兩個詞:刷題時大家的一致感覺是: AC一時爽,一直AC一直爽!LeetCode刷題時的心態建設在本文開頭,我們提到了很多行內名廠需要考察與 LeetCode 難度難度相當的算法題。
  • 如何科學的刷 Leetcode
    這是它的官網,https://leetcode.com。Leetcode 官網很久以前,還是在大學的時候,有師兄對我意味深長的說,如果把 Leetcode 上面的題目做上七遍,就有很大概率能夠通過谷歌的面試。雖然有點誇張,這句話還是對我幼小的內心,產生了不小的震撼。
  • leetcode 刷500道題,筆試/面試穩嗎?
    如果我在 leetcode 堅持刷它個 500 道題,以後筆試/面試穩嗎?這裡我說下我的個人看法,我認為不穩。下面說說為啥不穩以及算法題應該如何刷、如何學才比較好,當然,也會推薦自己學過的資料。一、先說說筆試題在刷 leetcode 的時候,你會發現,每道題的題意都很短,你只需要花十幾秒的時間,就知道這道題是要你幹嘛了,並且每道題所用道的算法思想都很明確,動態規劃、遞歸、二分查找等,你可能很快就知道該用哪種方法,只是你不懂如何把代碼寫出來而已。
  • LeetCode刷題指南(數組和矩陣)
    人在江湖不迷路作者:CYC2018文章連結:https://github.com/CyC2018/CS-Notes/blob/master/docs/notes/Leetcode%20%E9%A2%98%E8%A7%A3.mdLeetCode題解是CYC2018的力作,我也是通過他的題解來完成算法刷題的
  • leetcode刷對了麼
    今天,逆行君就帶你從世界觀和方法論兩方面走進「leetcode」 leetcode之世界觀 什麼是leetcode 簡單來說,leetcode是一個美國的在線編程網站,它收集了各大公司的經典算法面試題,用戶可以選擇不同的語言進行代碼的在線編寫、編譯和調試。
  • leetcode 39. 組合總和--每天刷一道leetcode算法系列!
    leetcode 39. 組合總和--每天刷一道leetcode算法系列!(本篇)題目描述給定一個無重複元素的數組 candidates 和一個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的數字可以無限制重複被選取。
  • LeetCode刷題第三周【數組(簡單)】
    參考資料[1]Leetcode網站: https://leetcode-cn.com/[2]以上文字描述均來自 LeetCode數組模塊: https://leetcode-cn.com/tag/array/[3]刷題請點擊或見附錄:1539.