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