Algorithm 查找由给定数字的数字组成的最大可能数字

Algorithm 查找由给定数字的数字组成的最大可能数字,algorithm,data-structures,Algorithm,Data Structures,给定一个数字N,从给定的数字中找出可以创建的最大可能的数字X 示例:N=231那么X将是321 这些限制是时间复杂度O(1) 空间复杂度O(1) 我认为这必须通过计数排序来完成 我能做的最好的事情就是O(1)空间和O(log(N))时间。可以肯定的是,这是不可能做得更好的,因为至少你必须分析输入中的每个数字,即log(N) 简单的回答是,按降序排列N的数字 伪代码: 创建一个包含10个整数的数组,所有整数都初始化为零 迭代N的每个数字。增加数组中与每个数字对应的插槽 遍历数组。将字符C的N个实例

给定一个数字N,从给定的数字中找出可以创建的最大可能的数字X

示例:N=231那么X将是321

这些限制是时间复杂度O(1) 空间复杂度O(1)

我认为这必须通过计数排序来完成

我能做的最好的事情就是O(1)空间和O(log(N))时间。可以肯定的是,这是不可能做得更好的,因为至少你必须分析输入中的每个数字,即log(N)

简单的回答是,按降序排列N的数字

伪代码:

  • 创建一个包含10个整数的数组,所有整数都初始化为零
  • 迭代N的每个数字。增加数组中与每个数字对应的插槽
  • 遍历数组。将字符C的N个实例添加到结果字符串的开头,其中N是存储在数组中插槽编号C中的数字
  • Python实现示例:

    N = 231
    slots = [0,0,0,0,0,0,0,0,0,0]
    while N > 0:
        slots[N%10] += 1
        N = int(N / 10)
    
    result = ""
    for slot_idx in range(10):
        for i in range(slots[slot_idx]):
            result = str(slot_idx) + result
    
    print result
    
    结果:


    321

    我不认为该算法比O(n)快多少,因为您必须至少读取输入(长度n)。从这里开始,您还需要一个就地排序,以避免占用超过O(1)个内存。拥有一个由十个元素组成的整数数组是否算作“O(1)空间复杂度”?感觉很像一个家庭作业…@B这就是为什么我一直坚持这一点。意味着O(1)空间复杂度内存使用量是恒定的,与输入无关?您可以只计算一个HashMap,其中所有可能的N作为键,它们对应的值作为值(或者为什么不只是一个数组),因此获取值的时间复杂度也为O(1)。如果maxN不是太大,这个解决方案也是我想到的。感谢您确认o(1)复杂性无法达到。