题目
思路与算法
- 这题没啥思路上的障碍,我们先模拟一遍整个过程
- 4321,首先把1挪到最前面,也就是需要三步,4321到4312到4132到1432,第一轮最小的1送最前面,然后2再开始送就行但我们需要注意细节,本例中k为4,也就是第一轮完了还剩1次机会,那么我们只能得到1342而不能得到1423.也就是说我们交换的时候从最高位往低位送。
- 整理一下,第一轮比4小且是最小的是1,所以把4,3和2往后挪,把1换到第1位,再找剩下的432中比4小的除了1之外的最小的是2,所以3往后挪一位,把2插进去。结束
- 但很明显这个解法是个超时解,数据弱才能通过。目前作为196周周赛压轴题确实不该数据这么松散的。
- 但对于本人来讲能写出这个TLE的解法目前是可以接受的。记录下来供学习参考。
代码实现
class Solution {
public String minInteger(String num, int k) {
char[] ch = num.toCharArray();
String res = String.valueOf(Bubble(ch,0,k));
return res;
}
public char[] Bubble(char[] ch,int index,int cnt){
if (index == ch.length || cnt == 0) {
return ch;
}
int minIndex = index;
char min = ch[index];
for (int i = index; i < ch.length && i - index <= cnt;i++) {
if (ch[i] < min) {
min = ch[i];
minIndex = i;
}
}
for (int i = minIndex; i > index; i--) {
ch[i] = ch[i-1];
}
ch[index] = min;
return Bubble(ch,index + 1,cnt - (minIndex - index));
}
}
复杂度分析
- 投机取巧的解,不值一提,时间复杂度为O(N²)。
- 明天继续写动态规划和本题的最佳解。