剑指 Offer 21.调整数组顺序使奇数位于偶数前面
解题思路:
-
对撞指针 , 从左边不停的找第一个偶数,从右边不停的找第一个奇数 ,找到后 交换 两者位置
本题与【905. 按奇偶排序数组】几乎雷同。
剑指 Offer 57.和为s的两个数字
本题与【167. 两数之和 II - 输入有序数组】相同
解题思路:
-
1) 对撞指针 ,计算 sum(L + R) 的和,判断与 target 的关系,来决定移动左指针还是右指针
-
2) 二分查找 ,先固定一个 nums[i] ,然后到剩余数组 [ i+1...end ] 中二分查找 target = s - nums[i] 的值
-
注意:题目数组是 递增排序 好的,所以才能用上面两种方法,并且只要找到一个解即可返回。
![](https://i-blog.csdnimg.cn/blog_migrate/853d1e33e98cc2333a35e96f4c1e7459.png)
26.删除有序数组中的重复项
解题思路:
-
1) 快慢指针 , slow 指向 已处理区域 的 最后一个位置 , fast 指向 未处理区域 的 第一个位置 ,初始 slow = 0, fast = 1,不断向后移动 fast
-
若 fast 的值跟 slow 的值 不等 ,就让 slow++ ,把 fast 处的值放到 slow 位置,最后返回 slow + 1 作为 数组长度 。
-
注意:本题能这样做的原因是因为题目的数组是 升序排列 的。
这种算法是不断比较未处理区域的值和已处理区域的最后一个值,由于数组是升序排列的,所以只需要跳过那些与已处理区域最后一个相同的值即可。然后只将不同的值往前面放。
解题思路:
-
2) 快慢指针 , slow 指向 已处理区域 的 下一个位置 , fast 指向 未处理区域 的 第一个位置 , 初始 slow = 1, fast = 1 ,不断向后移动 fast
-
若 fast 的值跟 fast-1 不同时,就把 fast 处的值放到 slow 位置,然后 slow++ , 最后返回 slow 作为 数组长度 。
-
注意:本题能这样做的原因是因为题目的数组是 升序排列 的。
这种算法是不断比较未处理区域的当前值和上一个值,由于数组是升序排列的,所以只需要跳过那些与上一个相同的值即可。然后只将不同的值往前面放。
问题:为什么 slow 和