[Leetcode] 670. Maximum Swap 解题报告

该博客介绍了LeetCode第670题的解决方案,即如何通过最多一次数字交换来获得最大数值。文章阐述了思路,强调在所有逆序对中找到能产生最大结果的交换,并提供了从后向前扫描的高效算法,空间和时间复杂度均为O(n)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

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 1:

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

Example 2:

Input: 9973
Output: 9973
Explanation: No swap.

Note:

  1. The given number is in the range [0, 108]

思路

首先整理一下思路:需要交换位置的一定是逆序对。在所有的逆序对里面怎么选择产生最大结果的swap呢?假设数组中的最大元素是a,那么首先看a之前有没有比a小的数,如果有,则将第一个比a小的数和a交换即可;如果没有,则说明a无法参与交换,这样就再看次大元素b,采用和a同样的处理方法类推即可。

如果我们从后往前扫描,则只需要进行一遍扫描:我们记录一个截止当前的最大值和其对应位置,再记录一下当前参与交换的两个数的值和对应位置。扫描的过程中,如果遇到比最大值还大的数出现,则更新最大值及其对应位置;否则如果发现当前数比截止当前的最大值小,那么就更新swap为当前数和当前最大数之间的swap。这样最终结果就是最佳的swap。算法的空间复杂度是O(n),时间复杂度也是O(n)。

代码

class Solution {
public:
    int maximumSwap(int num) {
        string s = to_string(num);
        int length = s.length();
        int max_index = -1, max_digit = -1;
        int left_index = -1, right_index = -1;
        for (int i = length - 1; i >= 0; --i) {
            if (s[i] > max_digit) {     // found the largest num so far
                max_digit = s[i];
                max_index = i;
                continue;
            }
            if (s[i] < max_digit) {
                left_index = i;
                right_index = max_index;
            }
        }
        if (left_index == -1) {
            return num;
        }
        swap(s[left_index], s[right_index]);
        return stoi(s);
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值