给定一个正整数(以数字数组的形式)。我们可以交换给定数字中的一对数字。我们需要返回可以获得的最小整数。请注意,它应该是一个有效的整数,即,不应包含前导 0。
例如:-
- 93561 返回 13569
- 596 返回 569
- 10234 返回 10234
- 120 返回 102
- 10091 返回 10019
- 98761111 返回 18761119
有没有O(n)
解决这个问题的算法。我为此想到了几种方法:-
- 找到最小值。给定整数(0除外)中的数字(
minDIgit
)并将其与MSB交换,如果MSB != minDigit
。如果MSB==minDigit
,然后找到下一个分钟。位并将其与最重要的但 1 位数字交换,依此类推。这可能是O(n^2)
最坏的情况。 - 做一个
array/vector
并按std::pair
升序对其进行排序(根据数字值;首先保留较低的索引以匹配数字值)。遍历排序后的数组。将 MSB 与第一位数字交换。如果最小的数字有对应的索引作为 MSB,则将 MSB 但 1 位与下一个最小数字交换。如果下一个 min 数字有相应的 MSB 索引但 1 位,则将 MSB 但 2 位与下一个 min 交换。位数等等。这应该是O(nlog(n))
。
有人可以建议一个更好的算法。
更新1:
经过一番思考,我提出的第二种算法可以很好地工作(可能除了少数极端情况,可以单独处理)。此外,我可以使用计数排序(根据数字值)对对(数字,索引)进行排序,这是一种稳定的排序O(n)
排序,这是一种及时的稳定排序。我的论点有缺陷吗?
更新 2:
我的第二个算法可以工作(尽管对极端情况和 0 进行了更多检查),并且O(n)
与counting sort
. 但是@GaborSch 给出的解决方案要简单得多,所以我不会真的费心为我的算法提供正确的代码。