leetcode----75. Sort Colors

链接:

https://leetcode.com/problems/sort-colors/

大意:

给定一个数组nums,其内元素由0,1,2组成。对数组排序,要求按0,1,2的顺序排序。不准使用额外空间,即空间复杂度为O(1)。并且只准遍历一次数组。例子:

思路:

记录两个变量,first1以及first2。分别表示已排序数组中第一个1以及第一个2所在的位置(知道第一个2也就知道了最后一个1的位置)。

若当前遍历到的元素值为0,则令nums[first1] = 0;nums[first2] = 1;nums[i] = 2;first1++;first2++; 

若当前遍历到的元素值为1,则令nums[first2] = 1;nums[i] = 2;first2++;

若当前遍历到元素值为2,则不进行元素移动。

当然,以上情况是在first1和first2都确定了的情况。另外得讨论若当前元素为第一个0,第一个1或者第一个2的情况。

详情请看如下代码。

代码:

class Solution {
    public void sortColors(int[] nums) {
        if (nums.length <= 1)
            return ;
        int first1 = -1, first2 = -1; // first1:已排序部分数组中首个1的位置
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] == 0) { // 当前元素为0的情况
                if (first1 == -1 && first2 == -1) // 之前出现的数字全为0的情况 
                    continue ; 
                else if (first1 == -1) { // 表明1还未出现过
                    nums[first2++] = 0;
                    nums[i] = 2;
                } else if (first2 == -1) { // 表明2还未出现过
                    nums[first1++] = 0;
                    nums[i] = 1;
                } else { // 表明1和2都已经出现过
                    nums[first1++] = 0;
                    nums[first2++] = 1;
                    nums[i] = 2;
                }
            } else if (nums[i] == 1) {
                if (first2 == -1) { //还未出现过2的情况
                    if (first1 == -1) // 还未出现过1 
                        first1 = i;
                } else if (first1 == -1) { // 出现过2但未出现过1的情况
                    nums[first2] = 1;
                    nums[i] = 2;
                    first1 = first2++;
                } else { // 1和2都出现过的情况
                    nums[first2++] = 1;
                    nums[i] = 2;
                }
            } else if (first2 == -1) { // 2之前未出现过
                first2 = i;
            }
        }
    }
}

结果:

结论:

这题主要就是一个逻辑。逻辑清楚了,跟着逻辑写代码即可。 

 

猜你喜欢

转载自blog.csdn.net/smart_ferry/article/details/88948575