在这里,我们将使用0,1和2的整数分别表示红色,白色和蓝色。将所有的0,1,2元素进行排序

给定一个n个对象颜色为红色,白色或蓝色的数组,对其进行排序,使相同颜色的对象相邻,颜色为红色,白色和蓝色。

在这里,我们将使用0,1和2的整数分别表示红色,白色和蓝色。

优化前的思路及代码:

class Solution {
    public void sortColors(int[] nums) {
        //时间复杂度:O(n)空间复杂度:O(1)
        int[] count = {0,0,0};//存放0,1,2三个元素的出现频率
        
        for(int num : nums){
            if(num >= 0 && num <= 2)//确保数组中元素的值都为0,1,2
                count[num]++;
            else
                System.out.println("您输入的数组元素有误");
        }
        
        int index = 0;//原来数组的下标,重新排序
        int j = 0;//数组中的元素
        while(j < count.length){
            
           for(int i = 0;i<count[j];i++){
                nums[index++] = j;
            } 
            j++;
        }
    
    }
}
参考三路快排后的思路及代码:

class Solution {
    public void sortColors(int[] nums) {
        //时间复杂度:O(n)空间复杂度:O(1)[只遍历一遍完成题目的要求]
        int zero = -1;          //nums[0...zero] == 0;
        int two = nums.length;  //nums[two,n-1] == 2;
        
        for(int i = 0;i < two;){
            if(nums[i]==1) {
                i++;
            }else if(nums[i] == 2) {
                //two--;
                int temp = nums[i];
                nums[i] = nums[--two];
                nums[two] = temp;
            }else {
                if(nums[i] == 0){
                    //zero++;
                    int tmp = nums[++zero];
                    nums[zero] = nums[i];
                    nums[i] = tmp;
                    i++;
                    
                }else{
                    System.out.println("您输入的数组的数据有误!!!");
                }
            }
        }
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章