Sort Colors — LeetCode「建议收藏」

Sort Colors — LeetCode

大家好,又见面了,我是全栈君。

原题链接: 
http://oj.leetcode.com/problems/sort-colors/
 


这道题也是数组操作的题目。事实上就是要将数组排序,仅仅是知道数组中仅仅有三个元素0,1,2。熟悉
计数排序
的朋友可能非常快就发现这事实上就是使用计数排序,元素空间仅仅须要三个元素就可以。代码例如以下: 

public void sortColors(int[] A) {
    if(A==null || A.length==0)
        return;
    int[] res = new int[A.length];
    int[] helper = new int[3];
    for(int i=0;i<A.length;i++)
    {
        helper[A[i]]++;
    }
    for(int i=1;i<3;i++)
    {
        helper[i]=helper[i]+helper[i-1];
    }
    for(int i=A.length-1;i>=0;i--)
    {
        res[helper[A[i]]-1] = A[i];
        helper[A[i]]--;
    }
    for(int i=0;i<A.length;i++)
    {
        A[i] = res[i];
    }
}

上面的代码是计数排序的标准解法。能够看到总共进行了三次扫描,事实上最后一次仅仅是把结果数组拷贝到原数组而已。假设不须要in-place的结果仅仅须要两次扫描。


事实上就算返回元素组也能够是两次扫描,这须要用到元素仅仅有0,1,2的本质。我们知道helper[i]中是包括着0,1,2的元素数量,我们仅仅须要依照helper[0,1,2]的数量依次赋值过来就可以(每层循环把helper[i]–,假设helper[i]到0就i++就能够了)。仅仅是这样就不是计数排序比較标准的解法,我希望还是复习一下。


这样的方法的时间复杂度是O(2*n),空间是O(k),k是颜色的数量,这里是3。


上述方法须要两次扫描。我们考虑怎么用一次扫描来解决。事实上还是利用了颜色是三种这一点,道理事实上也简单。就是搞两个指针。一个指在当前0的最后一个下标,还有一个是指在当前1的最后一个下标(2不须要指针由于剩下的都是2了)。进行一次扫描,假设遇到0就两个指针都前进一步并进行赋值,假设遇到1就后一个指针前进一步并赋值。代码例如以下: 

public void sortColors(int[] A) {
    if(A==null || A.length==0)
        return;
    int idx0 = 0;
    int idx1 = 0;
    for(int i=0;i<A.length;i++)
    {
        if(A[i]==0)
        {
            A[i] = 2;
            A[idx1++] = 1;
            A[idx0++] = 0;
        }
        else if(A[i]==1)
        {
            A[i] = 2;
            A[idx1++] = 1;
        }
    }
}

上述方法时间复杂度还是O(n)。仅仅是仅仅须要一次扫描,空间上是O(1)(假设颜色种类是已知的话)。


这道题我认为主要还是熟悉一下计数排序计数排序是线性排序中比較重要的一种,关于排序要搞个专题专门的复习一下。非常多排序的基本思想都对解题有帮助哈。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/116155.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 【获奖公布】“我的2016”主题征文活动

    【获奖公布】“我的2016”主题征文活动还记得2015的年末,2016的新年伊始,你给自己定下的目标,对自己许下的诺言么?时光荏苒,一年又在指缝间溜走了,离2016的结束还剩十多天,在接下来的这十几天里,让我们用博客记录下这或开心、或痛苦,或特殊,或平淡的2016年,愿剩下的每一天我们都不会虚度~值此岁末之际,CSDN博客频道携手“图灵教育”开展了“我的2016”主题征文活动,听大家聊聊2016年的工作、生活中的点滴感动、喜悦和收获,

  • Maven 配置篇之 pom.xml

    Maven 配置篇之 pom.xml

  • RUST开服教程、常用指令及心得[通俗易懂]

    RUST开服教程、常用指令及心得[通俗易懂]【前言】【开始前你需要了解的事情】①常用网址②更新与删档日期③目前国服环境【服务器硬件的选择】【标准服务器】①下载和更新服务器②制作服务器的启动脚本③选择你的服务器地图④运行服务器【模组服务器】①完成标准服务器的下载和设置②安装Oxide插件平台③下载插件④安装插件⑤调试插件⑥模组服的更新⑦在标准服中使用插件功能【在自己的电脑上运行服务端】①…

  • 一体化能源行业大数据平台建设,让能源更“聪明”

    一体化能源行业大数据平台建设,让能源更“聪明”现在能源行业,不论是政府政策还是群众呼应,都要求建设智能智慧能源行业,今天我们从为什么,怎么做来为大家讲解如何建设能源行业大数据。能源大数据理念是将电力、石油、燃气等能源领域数据进行综合采集、处理、分析与应用的相关技术与思想。能源大数据不仅是大数据技术在能源领域的深入应用,也是能源生产、消费及相关技术革命与大数据理念的深度融合,将加速推进能源产业发展及商业模式创新。随着信息化的深入和两化的深度融合,大数据在石油石化行业应用的前景将越来越广阔。大数据与能源行业的结合目前主要体现在三个行业。(1)石

  • vue组件注册可以是以下哪种方式_注册组件失败怎么办

    vue组件注册可以是以下哪种方式_注册组件失败怎么办组件的组织通常一个应用会以一棵嵌套的组件树的形式来组织:例如,你可能会有页头、侧边栏、内容区等组件,每个组件又包含了其它的像导航链接、博文之类的组件。为了能在模板中使用,这些组件必须先注册以便

  • fillna函数用法_fill…with

    fillna函数用法_fill…withinplace参数的取值:True、FalseTrue:直接修改原对象False:创建一个副本,修改副本,原对象不变(缺省默认)method参数的取值:{‘pad’,‘ffill’,‘backfill’,‘bfill’,None},defaultNonepad/ffill:用前一个非缺失值去填充该缺失值backfill/bfill:用下一个非缺失值填充该缺失…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号