Featured image of post Maximum Swap

Maximum Swap

670. 最大交换

分析

  1. 将数字转为字符串,方便逐位操作;
  2. 从左往右找到第一个不是降序的拐点,记为 i,即 s[i] < s[i + 1]
    • 说明从这一位起,后面可能有更大的数字
  3. 从该拐点 i + 1 向右寻找最大的数字,且取最靠右的那个最大值(使前面替换的数字尽量大)
  4. 然后从左到右找到第一个比这个最大值小的数字,交换两者
  5. 由于只交换一次,直接返回交换后的值即可
  6. 如果整个数字是降序排列的,说明已经是最大值,直接返回原值

时间复杂度

时间复杂度 O(n^2)

空间复杂度

空间复杂度为 O(n)

C++代码

 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
27
28
29
30
class Solution
{
public:
    int maximumSwap(int num)
    {
        std::string s = std::to_string(num); // 转换为字符串方便操作

        for (int i = 0; i + 1 < s.size(); ++ i)
        {
            if (s[i] < s[i + 1])  // 找到第一个非降序的位置
            {
                int k = i + 1;
                // 找到从 i + 1 开始最大的数字,取最靠右的那个(保证交换尽可能早的位)
                for (int j = k + 1; j < s.size(); ++ j)
                    if (s[k] <= s[j])
                        k = j;

                // 从左到右找第一个比 s[k] 小的数,交换
                for (int j = 0; ; ++ j)
                    if (s[j] < s[k])
                    {
                        std::swap(s[j], s[k]);
                        return std::stoi(s);  // 返回交换后的整数
                    }
            }
        }

        return num;  // 如果没有找到下降点,原数就是最大值
    }
};
Built with Hugo
Theme Stack designed by Jimmy