算法leetcode|59. 螺旋矩阵 II(rust重拳出击)

这篇具有很好参考价值的文章主要介绍了算法leetcode|59. 螺旋矩阵 II(rust重拳出击)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。



59. 螺旋矩阵 II:

给你一个正整数 n ,生成一个包含 1n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix

样例 1:

算法leetcode|59. 螺旋矩阵 II(rust重拳出击)

输入:
	
	n = 3
	
输出:
	
	[[1,2,3],[8,9,4],[7,6,5]]

样例 2:

输入:
	
	n = 1
	
输出:
	
	[[1]]

提示:

  • 1 <= n <= 20

分析:

  • 面对这道算法题目,二当家的再次陷入了沉思。
  • 可以每次循环移动一步,判断移到边界就变换方向,巧用数组可以减少逻辑判断的复杂性。
  • 也可以每次循环都换完4次方向,也就是完成一次顺时针,然后缩圈,就像剥洋葱一样,一层一层的从外向内,非常好理解。
  • 和 54. 螺旋矩阵 非常类似,但是之前是读,而现在相当于是写。
  • 边界的判断和边界的缩小依然是关键。
  • 一个方向的最后位置,同样可以作为下一个方向的开始值,要当心不要重复,方法是一样的,只是细节上有差异。
  • 相对来说,按层的方式,一次遍历完成一个顺时针比较直观,逻辑更加清晰,不容易出错,每次遍历都完成相同的内容。
  • 每次循环完成一步的方式,要有个状态切换的问题,把握不准容易出错。

题解:

rust:

impl Solution {
    pub fn generate_matrix(n: i32) -> Vec<Vec<i32>> {
        let mut ans = vec![vec![0; n as usize]; n as usize];
        
        let mut num = 0;
        let (mut left, mut right, mut top, mut bottom) = (0, n as usize - 1, 0, n as usize - 1);
        while left <= right && top <= bottom {
            (left..right + 1).for_each(|column| {
                num += 1;
                ans[top][column] = num;
            });
            (top + 1..bottom + 1).for_each(|row| {
                num += 1;
                ans[row][right] = num;
            });
            if left < right && top < bottom {
                (left..right).rev().for_each(|column| {
                    num += 1;
                    ans[bottom][column] = num;
                });
                (top + 1..bottom).rev().for_each(|row| {
                    num += 1;
                    ans[row][left] = num;
                });
            }
            if right == 0 || bottom == 0 {
                break;
            }
            left += 1;
            right -= 1;
            top += 1;
            bottom -= 1;
        }
        
        return ans;
    }
}

go:

func generateMatrix(n int) [][]int {
    ans := make([][]int, n)
	for i := range ans {
		ans[i] = make([]int, n)
	}

	num := 0
	left, right, top, bottom := 0, n-1, 0, n-1
	for left <= right && top <= bottom {
		for column := left; column <= right; column++ {
			num++
			ans[top][column] = num
		}
		for row := top + 1; row <= bottom; row++ {
			num++
			ans[row][right] = num
		}
		if left < right && top < bottom {
			for column := right - 1; column >= left; column-- {
				num++
				ans[bottom][column] = num
			}
			for row := bottom - 1; row > top; row-- {
				num++
				ans[row][left] = num
			}
		}
		left++
		right--
		top++
		bottom--
	}

	return ans
}

c++:

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> ans(n, vector<int>(n));

        int num = 0;
        int left = 0, right = n - 1, top = 0, bottom = n - 1;
        while (left <= right && top <= bottom) {
            for (int column = left; column <= right; ++column) {
                ans[top][column] = ++num;
            }
            for (int row = top + 1; row <= bottom; ++row) {
                ans[row][right] = ++num;
            }
            if (left < right && top < bottom) {
                for (int column = right - 1; column >= left; --column) {
                    ans[bottom][column] = ++num;
                }
                for (int row = bottom - 1; row > top; --row) {
                    ans[row][left] = ++num;
                }
            }
            ++left;
            --right;
            ++top;
            --bottom;
        }

        return ans;
    }
};

python:

class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        ans = [[0] * n for _ in range(n)]
        num = 0
        left, right, top, bottom = 0, n - 1, 0, n - 1
        while left <= right and top <= bottom:
            for column in range(left, right + 1):
                num += 1
                ans[top][column] = num
            for row in range(top + 1, bottom + 1):
                num += 1
                ans[row][right] = num
            if left < right and top < bottom:
                for column in range(right - 1, left - 1, -1):
                    num += 1
                    ans[bottom][column] = num
                for row in range(bottom - 1, top, -1):
                    num += 1
                    ans[row][left] = num
            left, right, top, bottom = left + 1, right - 1, top + 1, bottom - 1
        return ans


java:

class Solution {
    public int[][] generateMatrix(int n) {
        final int[][] ans = new int[n][n];

        int num  = 0;
        int left = 0, right = n - 1, top = 0, bottom = n - 1;
        while (left <= right && top <= bottom) {
            for (int column = left; column <= right; ++column) {
                ans[top][column] = ++num;
            }
            for (int row = top + 1; row <= bottom; ++row) {
                ans[row][right] = ++num;
            }
            if (left < right && top < bottom) {
                for (int column = right - 1; column >= left; --column) {
                    ans[bottom][column] = ++num;
                }
                for (int row = bottom - 1; row > top; --row) {
                    ans[row][left] = ++num;
                }
            }
            ++left;
            --right;
            ++top;
            --bottom;
        }

        return ans;
    }
}

非常感谢你阅读本文~
欢迎【点赞】【收藏】【评论】~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文由 二当家的白帽子:https://le-yi.blog.csdn.net/ 博客原创~文章来源地址https://www.toymoban.com/news/detail-510767.html


到了这里,关于算法leetcode|59. 螺旋矩阵 II(rust重拳出击)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法leetcode|63. 不同路径 II(rust重拳出击)

    一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。 现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径? 网格中的障碍

    2024年02月16日
    浏览(49)
  • 算法leetcode|92. 反转链表 II(rust重拳出击)

    给你单链表的头指针 head 和两个整数 left 和 right ,其中 left = right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。 链表中节点数目为 n 1 = n = 500 -500 = Node.val = 500 1 = left = right = n 你可以使用一趟扫描完成反转吗? 将链表分成3部分,即前面不需要反转的部

    2024年02月05日
    浏览(50)
  • 算法leetcode|81. 搜索旋转排序数组 II(rust重拳出击)

    已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同。 在传递给函数之前, nums 在预先未知的某个下标 k ( 0 = k nums.length )上进行了 旋转 ,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]] (下标 从 0 开始 计数)。例如, [0,1,2,4,4,4,5,6,

    2024年02月07日
    浏览(45)
  • 算法leetcode|80. 删除有序数组中的重复项 II(rust重拳出击)

    给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 说明 : 为什么返回数值是整数,但输出的答案是

    2024年02月09日
    浏览(51)
  • 算法leetcode|74. 搜索二维矩阵(rust重拳出击)

    给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非递减顺序排列。 每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。 m == matrix.length n == matrix[i].length 1 = m, n = 100 -10 4 = matrix[i][j],

    2024年02月11日
    浏览(37)
  • 算法leetcode|73. 矩阵置零(rust重拳出击)

    给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 m == matrix.length n == matrix[0].length 1 = m, n = 200 -2 31 = matrix[i][j] = 2 31 - 1 一个直观的解决方案是使用 O(mn) 的额外空间,但这并不是一个好的解决方案。 一个简单的改进方案是使

    2024年02月11日
    浏览(32)
  • 算法leetcode|82. 删除排序链表中的重复元素 II(rust重拳出击)

    给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。 链表中节点数目在范围 [0, 300] 内 -100 = Node.val = 100 题目数据保证链表已经按升序 排列 面对这道算法题目,二当家的再次陷入了沉思。 这道题目和 83. 删除排序

    2024年02月08日
    浏览(38)
  • LeetCode59 螺旋矩阵 II

    螺旋矩阵 II 循环不变量的应用 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1: 输入:n = 3 输出:[[1,2,3],[8,9,4],[7,6,5]] 示例 2: 输入:n = 1 输出:[[1]] 提示: 1 = n = 20

    2024年01月23日
    浏览(39)
  • LeetCode 59. 螺旋矩阵 II

    题目链接:LeetCode 59. 螺旋矩阵 II 本题不涉及算法,只是简单的模拟,但是由于边界条件比较多,因此容易出错。 分析题干:题目要求按照右、下、左、上、这样的顺序对数组进行填充,填充的值为 1 ~ n*n ,因此问题的关键就是找到待填充的位置,将其值赋值为 i 即可。 由于

    2024年02月02日
    浏览(38)
  • 【LeetCode-中等题】59. 螺旋矩阵 II

    定义四个边界条件,每转一圈,把数值填进去,然后缩小一圈,直到不满足条件位置 结束循环条件可以是: 两种结束条件都可以,但是一定要注意每次处理一条边界的范围 不能重复赋值

    2024年02月09日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包