zoukankan      html  css  js  c++  java
  • 75. Sort Colors

    Given an array with n objects colored red, white or blue, sort them in-place so that objects of the same color are adjacent, with the colors in the order red, white and blue.

    Here, we will use the integers 0, 1, and 2 to represent the color red, white, and blue respectively.

    Note: You are not suppose to use the library's sort function for this problem.

    Example:

    Input: [2,0,2,1,1,0]
    Output: [0,0,1,1,2,2]

    Follow up:

      • A rather straight forward solution is a two-pass algorithm using counting sort.
        First, iterate the array counting number of 0's, 1's, and 2's, then overwrite array with total number of 0's, then 1's and followed by 2's.
      • Could you come up with a one-pass algorithm using only constant space?

    one pass + two pointers

    把数组划分为3个区域,< 1,=1,>1,用两个指针p1, p2分别表示 小于区 和 大于区。从左往右遍历数组,如果:

    当前数< 1:交换当前数与小于区最右的数nums[p1],小于区向右扩大一位,当前数移动至下一个。

    当前数> 1:交换当前数与大于区最左的数nums[p2],大于区向左扩大一位,当前数留在原地。

    当前数= 1:当前数移动至下一个。

    直到当前数的下标大于 大于区最左元素的下标,循环结束。

    时间:O(N),空间:O(1)

    class Solution {
        public void sortColors(int[] nums) {
            if(nums.length < 2) return;
            int p1 = 0, p2 = nums.length - 1, i = 0;
            while(i <= p2) {
                if(nums[i] < 1)
                    swap(nums, i++, p1++);
                else if(nums[i] > 1)
                    swap(nums, i, p2--);
                else
                    i++;
            }
        }
        
        private void swap(int[] nums, int i, int j) {
            int tmp = nums[i];
            nums[i] = nums[j];
            nums[j] = tmp;
        }
    }

    二刷:

    basic idea: use two pointer and sort the array in one-pass

    Divide the array into three parts: < 1, = 1, > 1. Then use two pointers p1, p2 to represent the three parts, p1 is initialized to be at index 0, and p2 is at the last position of the array. Iterate  the array from left to right: if current number < 1, then swap current number with the number that p1 points to, move p1 to the right, and go to the next number; if = 1, skip to the next number; if > 1, swap current number with the number that p2 points to, and move p2 to the left.

    time = O(n), space = O(1)

    class Solution {
        public void sortColors(int[] nums) {
            if(nums == null || nums.length == 0) {
                return;
            }
            int p1 = 0, p2 = nums.length - 1, i = 0;
            while(i <= p2) {
                if(nums[i] < 1) {
                    swap(nums, i++, p1++);
                } else if(nums[i] == 1) {
                    i++;
                } else {
                    swap(nums, i, p2--);
                }
            }
        }
        
        public void swap(int[] nums, int i, int j) {
            int tmp = nums[i];
            nums[i] = nums[j];
            nums[j] = tmp;
        }
    }
  • 相关阅读:
    pytorch实现rnn并且对mnist进行分类
    python中的list按照某一列进行排序的方法
    pytorch实现style transfer
    Pytorch基本变量类型FloatTensor与Variable
    Linux上统计文件夹下文件个数以及目录个数
    python调用caffe实现预测
    python调用caffe环境配置
    JS实现唤起手机APP应用,如果本地没有则跳转到下载地址
    PHP开发中使用的工具
    Linux安装redis服务
  • 原文地址:https://www.cnblogs.com/fatttcat/p/10059690.html
Copyright © 2011-2022 走看看