我有一个问题,我必须从给定数字的数字集中找到最大的兄弟姐妹。例如,123的兄弟是123,213,321,312,132,312,231。其中最大的是321。
这也可以使用数组来完成。
实施1。
实施2。
但是这也消耗了O(n),因为我需要遍历整个堆栈。
欢迎任何最佳解决方案。
答案 0 :(得分:1)
任何解决方案都需要对数字的数字进行排序。比较排序为O(n log n)
,其中n
是要排序的对象数,但由于数字是一组受限制的元素,因此您可以使用计数排序来实现O(n)
。
搜索互联网(或算法设计的任何基础教科书)应该很容易获得更多细节,但这里有几个维基百科链接可以帮助您入门:
答案 1 :(得分:0)
我建议使用一种能让效果接近O(1)
的替代方案:
在解析数字(提取小数或其他组件)时,只需在结果位掩码中设置位,其大小等于基数(如果是小数,则为10)。
设置完所有位后,您可以查找位设置并创建输出。
虽然算法的任何部分都不是O(1)
,但在实践中,您可能会认为它接近于此。有些平台有汇编指令,可以帮助解决问题。
答案 2 :(得分:0)
如果不允许重复数字,则有一个O(1)解决方案,因为列表的长度有一个上限。为什么?因为有一定数量的数字字符,所以列表的长度超过了鸽子校长的数字字符数。
请注意,当且仅当列表的长度存在上限时,才会有一个O(1)解决方案。
证明:
如果列表的长度存在上限,则存在有限数量的可能输入。解析任何输入将花费有限的时间,并且有限多个有限值的最大值将仅是常数。不同的算法可能会改变常数,但假设您只考虑正确的算法,每个算法仍然会在一定时间限制的时间内完成。
相反,如果所需时间是O(1),则需要考虑多少位数的上限。由于只需要考虑有限数量的数字,因此在列表长度上必须有一个上限,否则,您无法确定列表中有多少9个。
假设列表的长度没有上限(因此,允许重复),最好的办法是计算所需的每个数字的数量,然后显示按重复顺序排列数字的数字。