继续打卡算法题,今天学习的是LeetCode第75题颜色分类,这道题目是道中等题
。算法题的一些解题思路和技巧真的非常巧妙,每天看一看算法题和解题思路,我相信对我们的编码思维和编码能力有一些提升。
分析一波题目
看完题目就知道,其实本题是排序题,本题就是要对数组从小到大排序。
常见的排序算法有冒泡排序,快速排序,归并排序。 而本题数组元素是特殊的,只有可能是0,1,2
, 所以可以不按排序法解决,很多重复元素。
我们可以循环一遍数组将0移动到数组头部,同时记录0的最终位置。
再循环一遍将1移动到数组中间,这样数组就排序了。
时间复杂度O(n^2)。
哈哈,还有一种更加巧妙的办法,那就是双指针法,我们可以使用两个指针p0,p1分别用来交换0和2的
一开始,p0指向数组下标0 ,p1指向数组下标n-1
然后遍历数组,遇到了0,将0移动到p0位置,将p0指针往后移动,遇到了2,将p1指向往前移动
本题解题技巧
1、根据数组中只有0,1,2
的情况,使用两个指针处理0和1的元素,巧妙的解决此题
编码解决
class Solution {
public void sortColors(int[] nums) {
int n = nums.length;
int p0 = 0, p2 = n - 1;
for (int i = 0; i <= p2; ++i) {
while (i <= p2 && nums[i] == 2) {
int temp = nums[i];
nums[i] = nums[p2];
nums[p2] = temp;
--p2;
}
if (nums[i] == 0) {
int temp = nums[i];
nums[i] = nums[p0];
nums[p0] = temp;
++p0;
}
}
}
}
总结
1、双指针法遍历数组很有用,