分治—快排(leetcode75—颜色划分)
·

题目解析:
题目很简单,给出一个只含有0,1,2的数组,它们分别代表不同的颜色,题目的要求是让我们在不使用库函数sort的情况下,将它排成一个有序的数组;
算法原理:
“三指针” (自创名词罢了,类似双指针用法)
所谓”三指针”就是定义三个指针,每个指针有着不同作用,随着指针的移动会将数组分为四个部分,以此来接近我们所要的结果;
板书如下:

我相信大家看了这个板书已经初步理解这个算法原理了,这时候我们只需要去遍历这个数组判断该位置的值,并做一下指针的移动即可;
板书:

解释:数组中就0,1,2三个数值,所以将数组的值分为三种情况讨论,当i位置为0时,由于我们定义的left指针指向0区域的最后一个位置,所以我们要将此时i位置的0和left后一个位置交换,这样才能保证我们left指针的正确性;当i位置为1时,我们不做处理,让i++即可,保证[left+1,i-1]全为1。当i位置为2时,由于我们的right指针指向2区域的第一个位置,所以我们将该i位置的2,要和right指针的前一个位置进行交换,但是这里就有细节我们不能给i++,由于我们的i指针是从左向右移动扫描的,[i,right-1]区间还未扫描,交换后还需要进行判断,不可直接跳过!
AC代码:
class Solution {
public:
void sortColors(vector<int>& nums) {
int n = nums.size();
int left = -1;
int i = 0;
int right = n;
while (i < right) {
if (nums[i] == 0) {
swap(nums[i++], nums[++left]);
} else if (nums[i] == 2) {
swap(nums[i], nums[--right]);
} else
i++;
}
}
};
更多推荐
所有评论(0)