Leetcode 670题

85 阅读1分钟

很有意思的题目,感觉和之前遇到的一道题很像(好像是下一个最大的数? Leetcode560题)

思路:

1.暴力

枚举所有可能的交换情况,然后找一个最大的数(复杂度o(n的平方))

2.优化

保存所有数字的最后出现位置,然后从前往后遍历,一旦在目标数字后有最大的数字(从后往前找) 就进行交换(扫描两次,复杂度o(n))

class Solution {
    public int maximumSwap(int num) {
        char[] A = Integer.toString(num).toCharArray();
        int[] last = new int[10];
        for (int i = 0; i < A.length; i++) {
            last[A[i] - '0'] = i;
        }

        for (int i = 0; i < A.length; i++) {
            for (int d = 9; d > A[i] - '0'; d--) {
                if (last[d] > i) {
                    char tmp = A[i];
                    A[i] = A[last[d]];
                    A[last[d]] = tmp;
                    return Integer.valueOf(new String(A));
                }
            }
        }
        return num;
    }
}