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)(假设颜色种类是已知的话)。


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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python-人像转漫画

    python-人像转漫画

    2021年9月18日
    270
  • LaTeX详细安装步骤和简明教程

    LaTeX详细安装步骤和简明教程第一步:环境配置配置TeXLive和TeXstudio。TeXLive是编译器为Latex提供运行所需的环境;TeXstudio编辑器,提供操作界面,需要先安装好TeXLive之后,TeXstudio才能使用。TeXLive下载:TeXLive下载地址:(清华镜像)https://mirrors.tuna.tsinghua.edu.cn/ctan/systems/texlive/Images/下载“.iso”文件–>“texlive2020.iso3.7GiB…

    2022年5月18日
    58
  • cadence快捷键大全(work bertrand russell)

    一、File相关Ctrl+Shift+N:新建一个窗口,即新打开一个ericCtrl+N:新建一个窗口,即编辑代码的窗口Ctrl+O:打开文件Ctrl+Shift+S:另存为Ctrl+Q:关闭eric二、Edit相关Ctrl+Z:撤回Ctrl+Shift+Z:撤回上次的撤回(你懂得,斜眼笑)Ctrl+Y:恢复到上次保存的状态Alt+Shift+C:清楚当前代…

    2022年4月16日
    87
  • 华为交换机的基本配置命令_华为交换机配置手册

    华为交换机的基本配置命令_华为交换机配置手册华为交换机基础配置命令参考基础配置用户模式登陆设备后,直接进入用户模式,只能执行少量查看配置的命令;视图模式用户模式下,输入system-view进入视图模式,可执行设备全局配置的命令;局部配置模式视图模式下,输入局部配置命令,如interfaceGE1/0/0,进入GE1/0/0端口配置模式,此外局部配置模式有很多种,可根据不同需求进入vla…

    2022年4月19日
    59
  • 让人“眼前一亮、不明觉厉”的互联网技术PPT「建议收藏」

    让人“眼前一亮、不明觉厉”的互联网技术PPT「建议收藏」为什么选择分享一起如此“鸡肋”的博文呢?我一直有个习惯:理论和实践,两手抓两手也要硬,最近一直搞技术,手里很多的新技术资料还未来得及消化,遂学习总结,加以分享。在做互联网产品功能介绍、互联网产品技术路线、技术人年度总结、互联网教育培训、互联网技术宣讲、技术人毕业答辩等场合时,可以参照以下PPT,让你思如泉涌,格调升级,瞬间征服观众~

    2022年6月1日
    42
  • 查看本机ip地址用什么命令linux_Linux查看服务器ip

    查看本机ip地址用什么命令linux_Linux查看服务器ip1)ifconfig命令输出如下:[root@topgun/home/cly]#ifconfigeth0:flags=4163mtu1500inet192.168.128.132netmask255.255.255.0broadcast192.168.128.255inet6fe80::20c:29ff:fe45:63baprefixlen64scopeid…

    2025年6月18日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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