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

    题目链接

    题目大意:将颜色排序,将同颜色的放置在相邻的位置,0表示red,1表示white,2表示blue,即最后的排序颜色应该是0,1,2。(最好能实现遍历一遍,常数空间)

    法一:直接用库函数排序。o(nlgn)。代码如下(耗时1ms):

    1     public void sortColors(int[] nums) {
    2         Arrays.sort(nums);
    3     }
    View Code

    法二:遍历两遍,常数空间。第一遍分别计数有多少个0,1,2,然后根据计数再将0,1,2填入原来的数组中。o(n)。代码如下(耗时1ms):

     1     public void sortColors(int[] nums) {
     2         int cnt0 = 0, cnt1 = 0, cnt2 = 0;
     3         //第一遍遍历计数
     4         for(int i = 0; i < nums.length; i++) {
     5             if(nums[i] == 0) {
     6                 cnt0++;
     7             }
     8             else if(nums[i] == 1) {
     9                 cnt1++;
    10             }
    11             else {
    12                 cnt2++;
    13             }
    14         }
    15         //第二遍遍历重写数组
    16         int k = 0;
    17         for(int i = 0; i < cnt0; i++) {
    18             nums[k++] = 0;
    19         }
    20         for(int i = 0; i < cnt1; i++) {
    21             nums[k++] = 1;
    22         }
    23         for(int i = 0; i < cnt2; i++) {
    24             nums[k++] = 2;
    25         }
    26     }
    View Code

    法三:遍历一遍,常数空间。两个指针,red指向左边开头,blue指向右边结尾,从头开始遍历数组,如果遇到red,则交换到前面,如果遇到blue,则交换到后面。如果遇到white则保持不变。代码如下(耗时1ms):

     1     public void sortColors(int[] nums) {
     2         int red = 0, blue = nums.length - 1;
     3         for(int i = 0; i <= blue; i++) {
     4             //如果当前是red,则将当前元素交换到前面,red位置后移一位
     5             if(nums[i] == 0) {
     6                 int tmp = nums[i];
     7                 //这里不需要回退遍历,因为将0换到前面,肯定不会导致2还排在0的前面遍历不到的情况。
     8                 nums[i] = nums[red];
     9                 nums[red++] = tmp;
    10             }
    11             //如果当前是blue,则将当前元素交换到后面,blue位置前移一位
    12             else if(nums[i] == 2) {
    13                 int tmp = nums[i];
    14                 //这里i--是必须的,因为有可能出现1,2,0的情况,将0换到2的前面,而如果不再遍历0的话,就会导致错误,所以换2之后,需要回退遍历一下
    15                 nums[i--] = nums[blue];
    16                 nums[blue--] = tmp;
    17             }
    18         }
    19     }
    View Code

     法四:遍历一遍,常数空间。巧妙的计数的结合,具体代码如下(耗时1ms):

     1     public void sortColors(int[] nums) {
     2         int cnt0 = -1, cnt1 = -1, cnt2 = -1;
     3         for(int i = 0; i < nums.length; i++) {
     4             if(nums[i] == 0) {
     5                 nums[++cnt2] = 2;
     6                 nums[++cnt1] = 1;
     7                 nums[++cnt0] = 0;
     8             } 
     9             else if(nums[i] == 1) {
    10                 nums[++cnt2] = 2;
    11                 nums[++cnt1] = 1;
    12             }
    13             else {
    14                 nums[++cnt2] = 2;
    15             }
    16         }
    17     }
    View Code
  • 相关阅读:
    jquery滑动效果的运动模块封装
    jquery幻灯片淡入淡出组件封装
    vue目录结构熟悉
    npm安装Vue.js
    jQuery瀑布流插件masonry
    mysql 使用 limit ,从指定条数读取完,-1失效
    jquery二级导航
    带输入提示的搜索框ajax请求
    封装好通用的reset.css base.css 样式重置css文件
    mysql 同时支持多少连接MYSQL 查看最大连接数和修改最大连接数
  • 原文地址:https://www.cnblogs.com/cing/p/9197302.html
Copyright © 2011-2022 走看看