BiruLyu
9/6/2017 - 9:24 PM

670. Maximum Swap.java

class Solution {
    private class Node {
        int val;
        int idx;
        public Node(int val, int idx) {
            this.val = val;
            this.idx = idx;
        }
    }
    private int arrToNum(LinkedList<Integer> numArr) {
        int res = 0;
        for (int i = 0; i < numArr.size(); i++) {
            res = res * 10 + numArr.get(i);
        }
        return res;
    }
    public int maximumSwap(int num) {
        PriorityQueue<Node> maxHeap = new PriorityQueue<>(new Comparator<Node>(){
            public int compare(Node a, Node b) {
                if (a.val == b.val) {
                    return b.idx - a.idx;
                }
                return b.val - a.val;
            }
        });
        LinkedList<Integer> numArr = new LinkedList<>();
        while (num != 0) {
            numArr.addFirst(num % 10);
            num /= 10;
        }
        for (int i = 0; i < numArr.size(); i++) {
            maxHeap.offer(new Node(numArr.get(i), i));
        }
        for (int i = 0; i < numArr.size(); i++) {
            Node cur = maxHeap.poll();
            if (numArr.get(i) == cur.val && i != cur.idx) {
                List<Node> backup = new ArrayList<>();
                while (!maxHeap.isEmpty() && maxHeap.peek().val == cur.val) {
                    backup.add(maxHeap.poll());
                }
                maxHeap.offer(cur);
                for (Node n : backup) {
                    if (n.idx != i) {
                        maxHeap.offer(n);
                    }
                }
            } else if (numArr.get(i) != cur.val) {
                int temp = numArr.get(i);
                //numArr.get(i) = numArr.get(cur.idx);
                //numArr.get(cur.idx) = temp;
                numArr.set(i, numArr.get(cur.idx));
                numArr.set(cur.idx, temp);
                return arrToNum(numArr);
            }
        }
        return arrToNum(numArr);
    }
}

/*
2736
9973
1357
1993
*/