🎨自動填補 迴旋矩陣IV_Spiral Matrix IV_Leetcode 2326

更新於 發佈於 閱讀時間約 1 分鐘

題目敘述 2326. Spiral Matrix IV


題目給定一個Linked list和對應的矩陣高度m、寬度n。

依照順時針的拜訪順序,
從左上角出發,依照次序把Linked List的內容填到矩陣裡。

如果有剩餘不足的空位,就填補-1


最後將填補好的矩陣返回作為答案。


測試範例

Example 1:

raw-image
Input: m = 3, n = 5, head = [3,0,2,6,8,1,7,9,4,2,5,5,0]
Output: [[3,0,2,6,8],[5,0,-1,-1,1],[5,2,4,9,7]]
Explanation: The diagram above shows how the values are printed in the matrix.
Note that the remaining spaces in the matrix are filled with -1.


Example 2:

raw-image
Input: m = 1, n = 4, head = [0,1,2]
Output: [[0,1,2,-1]]
Explanation: The diagram above shows how the values are printed from left to right in the matrix.
The last space in the matrix is set to -1.

約束條件

Constraints:

  • 1 <= m, n <= 10^5

高度、寬度都介於1~十萬之間。

  • 1 <= m * n <= 10^5

格子點總數介於1~十萬之間。

  • The number of nodes in the list is in the range [1, m * n].

Linked list長度介於 1~格子點總數之間。

  • 0 <= Node.val <= 1000

所有節點值都介於0~1000之間。


演算法 模擬順時針迴旋路徑


先建立一個高度m 寬度n的二維陣列,陣列元素值都初始化成-1。


接著,依照題意進行順時針迴旋路徑的模擬,

依照順序把Linked List的內容填到對應的陣列位置上。


最後,回傳二維陣列作為答案即可。


Python程式碼 模擬順時針迴旋路徑

class Solution:
def spiralMatrix(self, m: int, n: int, head: "ListNode") -> List[List[int]]:
# Store the east, south, west, north movements in a matrix.
x, y = 0, 0

# Go east on starting point
direction = 0

# Direction vector:
# Easr , South , West , North
vector = [[1, 0], [0, 1], [-1, 0], [0, -1]]
res = [[-1 for _ in range(n)] for _ in range(m)]

# Keep filling array cell one by one on spiral path
while head is not None:
res[y][x] = head.val

newx = x + vector[direction][0]
newy = y + vector[direction][1]

# If we meet an edge or an already filled cell, change the direction clockwise.
if ( newy < 0 or newx < 0 or newy >= m or newx >= n or res[newy][newx] != -1):
direction = (direction + 1) % 4

x += vector[direction][0]
y += vector[direction][1]

head = head.next

return res

Go程式碼 模擬順時針迴旋路徑


func spiralMatrix(m int, n int, head *ListNode) [][]int {

result := make( [][]int, m)

// Create 2D Array with height m * width n
for y := 0 ; y < m ; y++{
result[y] = make( []int, n)

for x := 0 ; x < n ; x++{
result[y][x] = -1
}
}

// Moving Vector
// East , South , West , North
vector := [][]int{ {1, 0}, {0, 1}, {-1, 0}, {0, -1}}

// Direction
direction := 0

// Starting point
x, y := 0, 0

// Keep moving in spiral path, filling with node value in linked list
for head != nil{

result[y][x] = head.Val

// Turn right if next position is edge or out of boundary.
nx, ny := x + vector[direction][0], y + vector[direction][1]

if (nx >= n) || (nx < 0) || (ny >= m) || (ny < 0) || ( result[ny][nx] != -1 ) {
direction = (direction + 1) % 4
}

// Go to next array cell in spiral path
x, y = x + vector[direction][0], y + vector[direction][1]

// Go to next node of linked list
head = head.Next
}

// Return 2D Array
return result
}

複雜度分析

時間複雜度 O(mn)

建立二維陣列,依序拜訪每個格子點一次,總共耗時O(m * n)


空間複雜度 O(mn)

建立二維陣列,總共所需空間為O(m * n)


Reference

[1] Spiral Matrix IV - LeetCode

留言
avatar-img
留言分享你的想法!
肥來啦😆
小松鼠-avatar-img
發文者
2024/09/09
林燃(創作小說家) 好可愛的同類! >////<
avatar-img
小松鼠的演算法樂園
96會員
427內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
2024/09/26
Leetcode 729. My Calendar I 給定一個行事曆的class定義和行程安排的介面interface。 請完成下列function 1.建構子MyCalendar() 初始化MyCalendar物件 2.boolean book(int start, int end) 插入新行程
Thumbnail
2024/09/26
Leetcode 729. My Calendar I 給定一個行事曆的class定義和行程安排的介面interface。 請完成下列function 1.建構子MyCalendar() 初始化MyCalendar物件 2.boolean book(int start, int end) 插入新行程
Thumbnail
2024/09/10
Insert Greatest Common Divisors in Linked List 題目給定一個鏈結串列, 請在兩兩節點之間加入一個新節點,新節點的值為兩者之間的最大公因數。 最後返回新串列的head node作為答案。
Thumbnail
2024/09/10
Insert Greatest Common Divisors in Linked List 題目給定一個鏈結串列, 請在兩兩節點之間加入一個新節點,新節點的值為兩者之間的最大公因數。 最後返回新串列的head node作為答案。
Thumbnail
2024/09/02
 Binary Tree Inorder Traversal 題目給定一個二元樹的根結點。 請輸出中序拜訪(In-order traversal)的拜訪序列。 中序拜訪的定義: 1.拜訪左子樹。 2.拜訪目前的節點。 3.拜訪右子樹。
Thumbnail
2024/09/02
 Binary Tree Inorder Traversal 題目給定一個二元樹的根結點。 請輸出中序拜訪(In-order traversal)的拜訪序列。 中序拜訪的定義: 1.拜訪左子樹。 2.拜訪目前的節點。 3.拜訪右子樹。
Thumbnail
看更多
你可能也想看
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
2326. Spiral Matrix IV 題目給定一個Linked list和對應的矩陣高度m、寬度n。 請依照順時針的拜訪順序, 從左上角出發,依照次序把Linked List的內容填到矩陣裡。 如果有剩餘不足的空位,就填補-1。 最後將填補好的矩陣返回作為答案。
Thumbnail
2326. Spiral Matrix IV 題目給定一個Linked list和對應的矩陣高度m、寬度n。 請依照順時針的拜訪順序, 從左上角出發,依照次序把Linked List的內容填到矩陣裡。 如果有剩餘不足的空位,就填補-1。 最後將填補好的矩陣返回作為答案。
Thumbnail
題目敘述: 給定一個二維陣列的高與寬,並且給定起點位置座標。 請從起點位置開始順時針拜訪陣列元素,並且把沿路走過的座標記錄下來。 以陣列的形式返回答案。
Thumbnail
題目敘述: 給定一個二維陣列的高與寬,並且給定起點位置座標。 請從起點位置開始順時針拜訪陣列元素,並且把沿路走過的座標記錄下來。 以陣列的形式返回答案。
Thumbnail
給定一個Linked list鏈結串列的Head node, 請判斷這條Linked list是否存在環路(Cycle)? 如果有環路,回傳True。 如果沒有,回傳False。
Thumbnail
給定一個Linked list鏈結串列的Head node, 請判斷這條Linked list是否存在環路(Cycle)? 如果有環路,回傳True。 如果沒有,回傳False。
Thumbnail
題目敘述 題目給定我們一個輸入陣列nums 要求我們以正、負交叉排列的方式重組陣列,並且必須保持原本的相對順序。 並且以陣列的形式輸出返回答案。 例[5, 1, -2, -3] 重排後為 [5, -2, 1, -3] 題目的原文敘述 測試範例 Example 1: Input:
Thumbnail
題目敘述 題目給定我們一個輸入陣列nums 要求我們以正、負交叉排列的方式重組陣列,並且必須保持原本的相對順序。 並且以陣列的形式輸出返回答案。 例[5, 1, -2, -3] 重排後為 [5, -2, 1, -3] 題目的原文敘述 測試範例 Example 1: Input:
Thumbnail
題目敘述 題目會給我們一個輸入陣列arr,起始點固定在索引為0的位置, 終點固定在索引為n-1的位置。 假設當下所在的索引位置為i,那麼每次移動的時候,可以跳到i-1,i+1,或者其他和我有相同元素值的位置arr[j], where arr[j] = arr[i]。 例如: 假設當下在i=3
Thumbnail
題目敘述 題目會給我們一個輸入陣列arr,起始點固定在索引為0的位置, 終點固定在索引為n-1的位置。 假設當下所在的索引位置為i,那麼每次移動的時候,可以跳到i-1,i+1,或者其他和我有相同元素值的位置arr[j], where arr[j] = arr[i]。 例如: 假設當下在i=3
Thumbnail
題目會給我們一個方陣,要求我們計算兩條對角線的元素總和。
Thumbnail
題目會給我們一個方陣,要求我們計算兩條對角線的元素總和。
Thumbnail
究竟誰是 i、誰又是 j?矩陣問題務必趁腦子清楚時才解 XDD
Thumbnail
究竟誰是 i、誰又是 j?矩陣問題務必趁腦子清楚時才解 XDD
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News