【LeetCode笔记】54. 螺旋矩阵(Java、迭代、递归)

文章目录

  • 题目描述
  • 思路 & 代码
      • 递归
      • 迭代
      • 更新版 - 递归

题目描述

  • 递归和迭代都实现了,递归相对比较好理解,也比较好实现
    在这里插入图片描述

思路 & 代码

递归

  • 每次都把最外圈的元素跑完
  • 一行 or 一列的时候,跑一次结束
  • 边界:left > right || low > height 的时候也 return
class Solution {List<Integer> ans = new ArrayList<>();public List<Integer> spiralOrder(int[][] matrix) {// 试试递归recursion(matrix, 0, matrix.length - 1, 0, matrix[0].length - 1);return ans;}// 一次一圈void recursion(int[][] matrix, int low, int height, int left, int right){if(low > height || left > right){return;}// 一行情况if(height == low){for(int i = left; i <= right; i++){ans.add(matrix[low][i]);}return;}// 一列情况else if(left == right){for(int i = low; i <= height; i++){ans.add(matrix[i][left]);}return;}// 其他情况for(int i = left; i <= right; i++){ans.add(matrix[low][i]);}for(int i = low + 1; i <= height; i++){ans.add(matrix[i][right]);}for(int i = right - 1; i >= left; i--){ans.add(matrix[height][i]);}for(int i = height - 1; i > low; i--){ans.add(matrix[i][left]);}recursion(matrix, low + 1, height - 1, left + 1, right - 1);}
}

迭代

  • 贴一贴吧,不过看递归的也够了
class Solution {public List<Integer> spiralOrder(int[][] matrix) {// 迭代写法List<Integer> ans = new ArrayList<>();// 一行的情况if(matrix.length == 1){for(int i = 0; i < matrix[0].length; i++){ans.add(matrix[0][i]);}return ans;}if(matrix[0].length == 1){for(int i = 0; i < matrix.length; i++){ans.add(matrix[i][0]);}return ans;}// 碰壁改变方向,更新墙壁值int left = 0, right = matrix[0].length - 1;int low = 1, height = matrix.length - 1;// 右 -》 下,下 -》左,左 -》上,上 => 右边// 右下左上 0,1,2,3int[][] directions = new int[][]{{0, 1}, {1, 0}, {0, -1}, {-1, 0}};int forDir = 0;int[] direction = directions[forDir];int x = 0, y = 0;ans.add(matrix[x][y]);boolean flag = true;while(flag){flag = false;    if(forDir == 0){while(y + 1 <= right){ans.add(matrix[x][y + 1]);flag = true;y++;}forDir++;right--;}else if(forDir == 1){while(x + 1 <= height){ans.add(matrix[x + 1][y]);flag = true;x++;}forDir++;height--;}else if(forDir == 2){while(y - 1 >= left){ans.add(matrix[x][y - 1]);flag = true;y--;}forDir++;left++;}else if(forDir == 3){while(x - 1 >= low){ans.add(matrix[x - 1][y]);flag = true;x--;}forDir = 0;low++;}}return ans;}
}

更新版 - 递归

  • 注意单列单行递归结束几种情况不能漏!
class Solution {List<Integer> ans = new ArrayList<>();public List<Integer> spiralOrder(int[][] matrix) {get(matrix, 0, 0, matrix.length - 1, matrix[0].length - 1);return ans;}void get(int[][] matrix, int xMin, int yMin, int xMax, int yMax) {if(xMin > xMax || yMin > yMax) {return;}if(xMin == xMax) {for(int j = yMin; j <= yMax; j++) {ans.add(matrix[xMin][j]);}return;}if(yMin == yMax) {for(int i = xMin; i <= xMax; i++) {ans.add(matrix[i][yMin]);}return;}int i = xMin, j = yMin;for(; j < yMax; j++) {ans.add(matrix[i][j]);}for(; i < xMax; i++) {ans.add(matrix[i][j]);}for(; j > yMin; j--) {ans.add(matrix[i][j]);}for(; i > xMin; i--) {ans.add(matrix[i][j]);}get(matrix, xMin + 1, yMin + 1, xMax - 1, yMax - 1);} 
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/504433.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu boot空间不足_安装 Ubuntu 双系统

在很久以前就想试一试Linux了&#xff0c;一直没有实践。一是觉得太麻烦&#xff0c;二是怕把电脑弄坏。后来实践了一次后发现&#xff0c;其实并没有想象中那么难&#xff0c;这是一个完全独立的系统&#xff0c;与隔壁的Windows半毛钱关系都没有。把引导搞定就不怕了。另外&a…

【LeetCode笔记】112 113. 路径总和 I II(Java、递归、DFS)

文章目录路径总和 I路径总和 II比较简单&#xff0c;就连着一起写了 路径总和 I 注意&#xff1a;一定得走到叶子才算 直接看代码吧&#xff0c;注释也就几行。 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* T…

安装python环境与运行_linux下怎么安装python的运行环境

展开全部 1、2113linux下安装python3 a、 准备编译环境(环境如果不对的5261话&#xff0c;可能遇到各种问题&#xff0c;比如wget无法下4102载1653https链接的文件)1 2 yum groupinstall Development Tools yum install zlib-devel bzip2-devel openssl-devel ncurses-devel2 下…

【LeetCode笔记】437. 路径总和III(Java、双重递归、二叉树)

文章目录题目描述思路 & 代码题目描述 说实话确实比I & II要恶心一点这里直接用双递归秒了&#xff08;今天才发现我是之前先写的III&#xff0c;再写的I & II&#xff09;有前缀和的写法&#xff0c;但是懒得整了 思路 & 代码 和之前不同&#xff0c;这里…

python中break和continue的区别_python中break和continue的区别

原博文 2017-08-01 09:56 − break和continue 1.break 意思为结束循环 例&#xff1a; i 0 while i<10: i1 if i5: #当i5时&#xff0c;结束整个循环 ...030778 相关推荐 2019-12-20 11:37 − 1、break break的使用场景&#xff1a;循环语句和switch-case分支语句。 它的作…

【LeetCode笔记】128. 最长连续序列(Java、哈希表、动态规划)

文章目录题目描述思路 & 代码变式题&#xff1a;返回答案数组更新可恶。。居然碰到了周一面试没撕出最优复杂度的题 题目描述 难点在于时间复杂度O(n)&#xff0c;否则来个sort()还是很轻松的 思路 & 代码 一般来说&#xff0c;时间复杂度可以用空间复杂度来弥补&a…

【LeetCode笔记】148. 排序链表(Java、归并排序、快慢指针、双重递归)

文章目录题目描述思路 & 代码二刷题目描述 难点在于时空复杂度的要求 思路 & 代码 转化成&#xff1a;归并排序 合并两个有序链表 即可利用快慢指针来拆分成两条链表注意&#xff1a;链表的拆分 & 连接时间复杂度O(n * logn)&#xff0c;空间复杂度 O(1) /**…

java substring截取字符串_lt;12gt;深入了解字符串

深入了解字符串完整视频教程&#xff1a;Java轻松入门经典教程[柠檬学院]-学习视频教程-培训课程-腾讯课堂​ke.qq.com字符串主要用于编程&#xff0c;用于概念说明、函数解释、用法详述等&#xff0c;字符串在存储上类似于字符数组&#xff0c;所以它的每一个单元都是可以提取…

【LeetCode笔记】88. 合并两个有序数组(Java、双指针)

文章目录题目描述思路 & 代码更新题目描述 比较简单&#xff0c;直接看思路吧&#xff01; 思路 & 代码 从后往前进行填数即可&#xff08;正确性可以保证&#xff09;时间复杂度 O(n) class Solution {public void merge(int[] nums1, int m, int[] nums2, int n…

thymealf如何实现传单个变量给html_梦回2013,看尤大vue的第一行代码,如何用30行代码实现vue(超简洁,适合初学者)...

非非非标题党&#xff0c;干货预警&#xff01;&#xff01;&#xff01;介绍大家好&#xff0c;我是清池交友 app 开发日记&#xff0c;记录清池交友 app 开发中学习过程和踩坑日记&#xff0c;伪全栈[1]技术栈&#xff1a;前端 js&#xff0c;vue&#xff0c;uniapp&#xff…

【LeetCode笔记】142. 环形链表 II(Java、快慢指针)

文章目录题目描述思路 & 代码更新版三刷 - 再更新题目描述 相对于环形链表&#xff0c;这里要求找到环的起点难点在于 O(1)&#xff0c;否则可以直接哈希表冲 思路 & 代码 找出快慢指针的路程关系&#xff0c;得出结论&#xff08;详见代码注释&#xff09; /*** …

python找出在原图中的位置_Python 通过截图匹配原图中的位置(opencv)实例

安装依赖 1&#xff09;下载安装opencv-2.4.9&#xff0c;并将cv2.pyd拷贝到python安装目录的site-package下 2&#xff09;pip install numpy 3&#xff09;pip install aircv 准备一张原图和截图 原图截图代码 import cv2 import aircv as ac # print circle_center_pos def …

【LeetCode笔记】287. 寻找重复数(Java、快慢指针、原地、链表)

文章目录题目描述思路 & 代码更新题目描述 可以理解成数组版本的 环形链表 II更多详细思路可见以上超链接。 思路 & 代码 如何转化成逻辑上的链表&#xff1f;nums[i] 是 第 i 个结点的 next 指针构造成一个有 nums.length - 重复次数 个结点的链表如此&#xff0…

【LeetCode笔记】338. 比特位计数(Java、位运算、动态规划)

文章目录题目描述思路 & 代码无注释二刷题目描述 难点在于 O(n) 思路 & 代码 理解题意&#xff0c;分析出 O(n) 复杂度应该是要用到之前的值来得到当前值——动态规划核心结论&#xff1a;奇数比前一个数多一个1&#xff0c;偶数和偶数除二后的数的1数量一样边界 &…

【LeetCode笔记】560. 和为K的子数组(Java、前缀和、哈希表)

文章目录题目描述思路 & 代码暴力法 O(n2n^2n2)前缀和 哈希表 O(n)二刷题目描述 第一道前缀和题目&#xff5e; 思路 & 代码 暴力法 O(n2n^2n2) 固定一个值&#xff0c;从后往前找满足的条件即可 class Solution {public int subarraySum(int[] nums, int k) {i…

caffe不支持relu6_国产AI框架再进化!百度Paddle Lite发布:率先支持华为NPU在线编译,全新架构更多硬件支持...

乾明 边策 发自 凹非寺 量子位 报道 | 公众号 QbitAI国产AI框架飞桨刚刚带来新进化&#xff1a;Paddle Lite正式发布&#xff01;高扩展、高性能、轻量化&#xff0c;还是首个支持华为NPU在线编译的深度学习端侧推理框架&#xff0c;剑指加大力度攻占移动端侧场景。而且大环境如…

【LeetCode笔记】1143. 最长公共子序列(Java、动态规划、字符串)

文章目录题目描述思路 & 代码二刷三刷题目描述 算是很高频的面试题了&#xff0c;而且题号还挺后的 思路 & 代码 注意&#xff1a;dp[i]][j] 和 charAt(i) 有1的下标差&#xff08;dp初始化边界&#xff09;核心思想&#xff1a;当前值可构成新的最大子串就左上角值…

【LeetCode笔记】139. 单词拆分(Java、动态规划、字符串、哈希表)

文章目录题目描述思路 & 代码二刷更新题目描述 漏网之题。。一个月前写的居然没写博客 思路 & 代码 HashSet 存储 word&#xff0c;便于查询动态规划三要素在注释中思路&#xff1a;如果dp[j] true且[j1,i]可以组成单词&#xff0c;则dp[i] true class Solution…

mysqlfor循环中出错继续_Python学习笔记(循环)

循环语句1. while 循环while语句最基本的形式包括一个位于顶部的布尔表达式&#xff0c;一个或多个属于while代码块的缩进语句。while 布尔表达式:代码块while循环的代码块会一直循环执行&#xff0c;直到布尔表达式的值为布尔假。如果布尔表达式不带有<、>、、&#xff…

bootstrap table格式化字符串_你要的PHP字符串处理函数都在这了!

php中文网最新课程每日17点准时技术干货分享打印输出函数说明echo输出一个或多个字符串print输出字符串printf输出格式化字符串sprintfReturn a formatted stringfprintf将格式化后的字符串写入到流sscanf根据指定格式解析输入的字符vfprintf将格式化字符串写入流vprintf输出格…