LeetCode //C - 59. Spiral Matrix II

59. Spiral Matrix II

Given a positive integer n , generate an n x n matrix filled with elements from 1 to n 2 n^2 n2 in spiral order.

Example 1:

Input: n = 3
Output: \[1,2,3,8,9,4,7,6,5]

Example 2:

Input: n = 1
Output: \[1]

Constraints:

  • 1 <= n <= 20

From: LeetCode

Link: 59. Spiral Matrix II


Solution:

Ideas:

1. Initialize Variables:

  • Initialize the 2D array (the matrix) to be returned.
  • Initialize pointers for the number of rows and the size of each row to be returned.
  • Initialize variables for the top, bottom, left, and right boundaries of the current "layer" of the spiral.
  • Initialize a variable val to 1 for the next value to be inserted into the matrix.

2. Loop Until Done:

  • Loop as long as top <= bottom and left <= right.

3. Fill Values:

  • Top Row: Fill the top row from left to right and then increment the top boundary.
  • Right Column: Fill the right column from top to bottom and then decrement the right boundary.
  • Bottom Row: Fill the bottom row from right to left (if top <= bottom) and then decrement the bottom boundary.
  • Left Column: Fill the left column from bottom to top (if left <= right) and then increment the left boundary.

4. Increment Value: After filling each cell, increment the value of val for the next cell.

5. Return the Filled Matrix: Return the 2D array once it's completely filled.

Code:
c 复制代码
/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *returnColumnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */
int** generateMatrix(int n, int* returnSize, int** returnColumnSizes){
    // Initialize the output array and sizes
    int** output = (int**)malloc(n * sizeof(int*));
    *returnColumnSizes = (int*)malloc(n * sizeof(int));
    for (int i = 0; i < n; ++i) {
        output[i] = (int*)malloc(n * sizeof(int));
        (*returnColumnSizes)[i] = n;
    }
    *returnSize = n;

    // Initialize variables for boundaries and direction
    int top = 0, bottom = n - 1, left = 0, right = n - 1;
    int val = 1;

    // Loop through the matrix to fill values
    while (top <= bottom && left <= right) {
        // Fill top row
        for (int i = left; i <= right; ++i) {
            output[top][i] = val++;
        }
        ++top;

        // Fill right column
        for (int i = top; i <= bottom; ++i) {
            output[i][right] = val++;
        }
        --right;

        // Fill bottom row
        if (top <= bottom) {
            for (int i = right; i >= left; --i) {
                output[bottom][i] = val++;
            }
            --bottom;
        }

        // Fill left column
        if (left <= right) {
            for (int i = bottom; i >= top; --i) {
                output[i][left] = val++;
            }
            ++left;
        }
    }

    return output;
}
相关推荐
辰烨chenye3 小时前
LeetCode Hot 100 题解 · 普通数组篇
算法·leetcode·职场和发展
hqyjzsb6 小时前
零 AI 项目经验,学 Python 转型 AI 的正确顺序是什么?
开发语言·人工智能·python·算法·职场和发展·数据挖掘·数据分析
辰烨chenye6 小时前
LeetCode Hot 100 题解 · 二分篇
java·算法·leetcode
微功夫信息技术6 小时前
分层多智能体强化学习驱动的非急救转运公平 - 效率统一调度系统研究与实践
人工智能·学习·算法·动态规划
T1mzhou7 小时前
ARM64 Linux 6.10内核启动流程7-ioremap和readl writel
linux·服务器·c语言
sanjiaomao3337 小时前
从论文公式到Python实现:用单元测试校验滑动平均算法
python·算法·单元测试
乐迪信息7 小时前
如何通过AI防爆摄像机精准判断船舶超速?
大数据·人工智能·算法·安全·目标跟踪
大圣编蚕8 小时前
Java ByteArrayInputStream 详解:从入门到实战
java·开发语言·算法
小玮看世界9 小时前
[Python]OD算法在OD实际运用转化参考清单
开发语言·python·算法
黎阳之光9 小时前
数字孪生赋能全域水网,实现水资源管控与节水降碳双向提升
人工智能·物联网·算法·安全·数字孪生