LeetCode算法题——Maximum Swap

题目概述

Given a non-negative integer, you could swap two digits at most once to get the maximum valued number. Return the maximum valued number you could get.

Example:

Input: 2736
Output: 7236
Explanation: Swap the number 2 and the number 7.

分析

希望得到最大的数字,最理想的情况是实现高位小数字和低位大数字的互换。具体实施的办法:

  • 得到高位数字:设计外层循环,从高位到低位进行遍历
  • 得到低位大数字:使用一个桶,存储每个数字从左到右最后出现的位置,之后设计内层循环,优先从获取大数字的位置开始遍历

桶的设计比较容易,因为一共只有0~9十个数字,设计一个长度为10的数组即可。在存入桶之前,使用string库里自带的函数可以方便地将整数转为string。

具体代码如下:

int maximumSwap(int num) {
    string str = to_string(num);
    vector bucket(10, 0);
    for (int i = 0; i < str.size(); i++) bucket[str[i] - '0'] = i; // 记录每个数字所在的最右位置
    for (int i = 0; i < str.size(); i++) 
        for (int j = 9; j > str[i] - '0'; j--) { // 从大桶开始遍历
            if (bucket[j] <= i) continue; // 大桶数字位置大于当前数字的位置,说明低位数字大于当前高位数字
            swap(str[i], str[bucket[j]]);
            return stoi(str);
        }
    return num;
}

时间复杂度为O(10*N) = O(N),取决于传入整数的长度;空间复杂度为O(N),只需要考虑桶和字符串的长度

总结

  • 桶排序在这种元素范围有限(0~9)的情况下比较方便
  • 本质上两层循环设计属于贪心算法的体现
  • string库中部分类型转换函数的使用

你可能感兴趣的:(LeetCode算法题——Maximum Swap)