例如 num[2]=1,那我们就把它放到下标1的位置 。
接着遍历 , 元素发现它应该待的坑已经被它的双胞胎兄弟给占了,它就知道,它是多余的那个 。
原地置换
代码如下:
时间复杂度:O(n) 。
空间复杂度:O(1)
题目:41. 缺失的第一个正数 ()
难度:复杂
描述:
给你一个未排序的整数数组nums,请你找出其中没有出现的最小的正整数 。
请你实现时间复杂度为O(n)并且只使用常数级别额外空间的解决方案 。
题目示例
思路
「辅助数组」
这道题有一个非常巧妙地的办法![1]
可以引入一个辅助数组,从1开始,在对应的位置存入原数组对应的元素 。如原数组num[0]=1,那么这个元素就应该存入辅助数组 helper[1] 。
然后遍历辅助数组,发现的第一个坑就是缺失的第一个正数 。
辅助数组
代码如下:
时间复杂度:O(n) 。
空间复杂度:O(n) 。
「原地置换法」
我们上面用了原地置换法解决了一个问题,降低了空间复杂度,我们这道题是不是也可以呢?
原地置换没法修改数组长度,我们肯定不能nums[i] 存 i 了 , 我们左移一下,num[i-1]存i 。
原地置换
代码实现如下:
时间复杂度:O(n) 。
空间复杂度:O(1) 。
题目:54. 螺旋矩阵 ()
难度:中等
描述:
给你一个m行n列的矩阵matrix,请按照「顺时针螺旋顺序」,返回矩阵中的所有元素 。
示例 1:
示例2
思路
这道题,思路比较容易想,就是上右下左四个方向顺时针遍历数组 。
顺时针遍历数组
但是这道题的细节是魔鬼 。
有两种,一种是一圈遍历完成,上下左右的位置移动,遍历是左闭右开[的条件 。
我们采用的是第二种 , 每遍历完一条边,就移动对应的位置,遍历就是左闭右闭的条件 。
还有一点细节就是值得注意的是,遍历过程中可能会出现出现 topbottom || leftright , 其中一对边界彼此交错了 。
这意味着此时所有项都遍历完了,如果没有及时 break ,就会重复遍历 。
代码如下:
时间复杂度:O(mn),其中 m 和 n 分别是输入矩阵的行数和列数 。
题目:59. 螺旋矩阵 II ()
难度:中等
描述:
给你一个正整数n,生成一个包含1到n2所有元素,且元素按顺时针顺序螺旋排列的n x n正方形矩阵matrix。
示例
思路
和上面一道题基本一模一样,我们往里面套就行了 。
代码如下:
时间复杂度:O(n2)
剑指 Offer 29. 顺时针打印矩阵 也是一道类似的题目 。
写了个顺口溜总结一下:
螺旋矩阵java代码的介绍就聊到这里吧,感谢你花时间阅读本站内容 , 更多关于螺旋矩阵java实现、螺旋矩阵java代码的信息别忘了在本站进行查找喔 。
推荐阅读
- 玩具直播间投放技巧,玩具直播间装修图
- gislog表示的简单介绍
- flutter快捷设置,flutter widget key
- html5设置表格颜色,html表格底色如何设置
- 计算ln的函数名c语言 c语言求lnx函数
- 调用net程序集,net调用api
- phpcms分页实例,php分页页码动态的实现
- vb转换成vbnet vb格式转换
- 电脑减号怎么拉宽,电脑减号怎么按