zoukankan      html  css  js  c++  java
  • 【100题】第四十九题 排序,要求时间复杂度O(n),空间复杂度O(1)

    一,题目

            如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)

     

    二,解答

            关键:哈希表,空间复杂度O(1)中1的含义(只要是常量就可以)
            看上去似乎任何已知的算法都无法做到,如果谁做到了,那么所有的排序方法:QuickSort,ShellSort,HeapSort,BubbleSort等等等等,都可以扔掉了,还要这些算法干吗阿?不过实际上,在数字范围有限制的情况下,是有一个这样的算法的,只需要用一个数组记录每个数字出现次数就可以了。
            假定你的数字范围在0到65535范围之内,定义一个数组count[65536](这个空间是常量,和n无关,所以是O(1) ),初值全部为0。
            那么假设有下面这些数字:
                    100,200,300,119,0,6...
            那么对于每个这个数字,都做在count中记录一下:
                   100 => count[100]++
                   200 => count[200]++
                   300 => count[300]++
                   119 => count[119]++
                   0 => count[0]++
                    6 => count[6]++
             ...
           最后,遍历一边所有这些数字就可得到0~65535每个数字的个数(在count数组中),然后再顺序遍历count数组,count[n] = m,则输出m个n,(比如说有count[3] = 2, 那么说明有2个数字3),依次输出,最后可得结果。第一次遍历是O(n),第二次遍历是O(1),为常量,所以最后的时间复杂度为O(n),而空间复杂度为
    O(1)
    这个算法很简单,相信大家都会,只是这个题太过于变态了,一般会把面试者吓住。

  • 相关阅读:
    面试中要注意的 3 个 JavaScript 问题
    angularJS遇到的坑
    为什么你的前端工作经验不值钱?
    ceph pg常见的几种状态
    k8s网络之flannel
    k8s流量访问之service
    lvs+keepalived高可用
    iptables【学习笔记】
    Linux和OpenStack中的网络知识【学习笔记】
    服务器BIOS设置
  • 原文地址:https://www.cnblogs.com/secbook/p/2654958.html
Copyright © 2011-2022 走看看