第一题:88. 合并两个有序数组
一、题目描述
image二、思路
- 此题涉及归并排序思想。
- 搞两个指针,分别指向
nums1
和nums2
两个数组最后一个元素,即3
和6
。再拿一个指针指向nums1
最后一个位置。 - 拿出
nums1
和nums2
两个数组最后一个元素进行比较,将两者中较大值
放在nums1
最后一位指针处,并将该指针位置向前移动一位
。并且较大值
数组指针也向前移动一位
。 - 循环以上步骤,直到
nums2
数组下标小于0
,则排序完成。 - 若
nums1
数组下标小于0
,则只需要将nums2
数组剩余值依次赋给nums1
即完成排序。
三、代码实现
image作者提示:小码哥的实现不严谨,如果num1
的空间大于m+n
,会导致错误。所以cur = m + n - 1
。
第二题:75. 颜色分类
一、题目描述
image二、思路
- 该题目进阶要求空间复杂度
O(1)
,时间复杂度O(n)
。 - 一般题目涉及
扫描一遍即完成排序
的,都会涉及双指针
,三指针
。 - 该题需要准备
三个指针
,紫色指针
代表存放2
,绿色指针
代表存放0
,红色指针
代表遍历数组
。 -
红色指针
遍历时,遇到1
则跳过,红色指针
++,遇到0
则跟绿色指针
交换值,绿色指针
++,红色指针
++。 - 遇到
2
,跟紫色指针
交换位置,紫色指针
--,再次对红色指针
的值进行判断。 - 当
红色指针
的下标大于紫色指针
,则退出排序。
三、代码实现
image image第三题:16.16.部分排序类
一、题目描述
image二、思路
- 该题目思路是寻找
逆序对
。 - 分别
从左往右
和从右往左
找到逆序对
,这样即可确定范围。 -
从左往右
扫描,记录最大值
,如果发现当前值
小于最大值
,则记录它的位置(有可能是逆序对
最大范围),如果当前值
大于最大值
,则覆盖最大值
。 -
从右往左
扫描,记录最小值
,如果发现当前值
大于最小值
,则记录它的位置(有可能是逆序对
最大范围),如果当前值
小于最小值
,则覆盖最小值
。 - 两次扫描记录的位置范围,就是需要排序的范围。
网友评论