题目描述
给定一个非负整数,你 至多 可以交换一次数字中的任意两位。返回你能得到的最大值。
示例 1 :
1 2 3
| 输入: 2736 输出: 7236 解释: 交换数字2和数字7。
|
示例 2 :
1 2 3
| 输入: 9973 输出: 9973 解释: 不需要交换。
|
注意:
来源:力扣(LeetCode)
题解
直接遍历
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| public int maximumSwap(int num) { char[] chars = String.valueOf(num).toCharArray(); int maximum = num; for (int i = 0; i < chars.length; i++) { for (int j = i + 1; j < chars.length; j++) { swap(chars, i, j); maximum = Math.max(maximum, Integer.parseInt(new String(chars))); swap(chars, i, j); } } return maximum; }
private void swap(char[] charArr, int i, int j) { char temp = charArr[i]; charArr[i] = charArr[j]; charArr[j] = temp; }
|
- 时间复杂度: O(log^3num)*,其中整数 num 为给定的数字。num 转换为十进制数,有 *O(lognum) 个数字,一共有 O(log^2num) 种不同的交换方法,每种方法需要重新构造一个新的整数,需要的时间为 *O(lognum)*,因此总的时间复杂度为 *O(log^3num)*。
- 空间复杂度: O(lognum)*,其中整数 num 为给定的数字。num 转换为十进制数,有 *O(lognum) 个数字,需要保存 num 所有的数字。
贪心
右边越大的数字与左边较小的数字进行交换,这样产生的整数才能保证越大。因此我们可以利用贪心法则,尝试将数字中右边较大的数字与左边较小的数字进行交换,这样即可保证得到的整数值最大。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public int maximumSwap(int num) { char[] chars = String.valueOf(num).toCharArray(); int max = chars.length - 1; int i = -1, j = -1; for (int k = chars.length - 1; k >= 0; k--) { if (chars[k] > chars[max]) { max = k; } else if (chars[k] < chars[max]) { i = k; j = max; } } if (i >= 0) { swap(chars, i, j); return Integer.parseInt(new String(chars)); } return num; }
|
- 时间复杂度: O(lognum)*,其中整数 num 为给定的数字。num 转换为十进制数,有 *O(lognum) 个数字,需要遍历一次所有的数字即可。
- 空间复杂度: O(lognum)*,其中整数 num 为给定的数字。num 转换为十进制数,有 *O(lognum) 个数字,需要保存 num 所有的数字。
选择排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| public int maximumSwap(int num) { char[] chars = String.valueOf(num).toCharArray(); for (int i = 0; i < chars.length; i++) { int index = i; for (int j = chars.length - 1; j > i; j--) { if (chars[j] > chars[index]) index = j; } if (index != i) { swap(chars, i, index); return Integer.parseInt(new String(chars)); } } return num; }
private void swap(char[] charArr, int i, int j) { char temp = charArr[i]; charArr[i] = charArr[j]; charArr[j] = temp; }
|
- 时间复杂度: O(n^2)
- 空间复杂度: O(n)
参考资料
__END__