【670. 最大交换】

news/2024/7/2 23:55:14

来源:力扣(LeetCode)

描述:

给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。

示例 1 :

输入: 2736
输出: 7236
解释: 交换数字2和数字7

示例 2 :

输入: 9973
输出: 9973
解释: 不需要交换。

注意:

  • 给定数字的范围是 [0, 108]

方法一:直接遍历

由于对于整数 num 的十进制数字位长最长为 8 位,任意两个数字交换一次最多有 28 种不同的交换方法,因此我们可以尝试遍历所有可能的数字交换方法即可,并找到交换后的最大数字即可。(类似选择排序,但是只能交换一次。)

  • 我们将数字存储为长度为 n 的列表,其中 n 为整数 num 的十进制位数的长度。对于位置为 (i, j) 的每个候选交换,我们交换数字并记录组成的新数字是否大于当前答案;
  • 对于前导零的问题,我们也不需要特殊处理。
  • 由于数字只有 8 位,所以我们不必考虑交换后溢出的风险;

代码:

class Solution {
public:
    int maximumSwap(int num) {
        string charArray = to_string(num);
        int n = charArray.size();
        int maxNum = num;
        for (int i = 0; i < n; i++) {
            for (int j = i + 1; j < n; j++) {
                swap(charArray[i], charArray[j]);
                maxNum = max(maxNum, stoi(charArray));
                swap(charArray[i], charArray[j]);
            }
        }
        return maxNum;
    }
};

执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:5.9 MB, 在所有 C++ 提交中击败了10.84%的用户
复杂度分析
时间复杂度:O(log2num),其中整数 num 为给定的数字。num 转换为十进制数,有 O(lognum) 个数字,一共有 O(log2 num) 种不同的交换方法。
空间复杂度:O(lognum),其中整数 num 为给定的数字。 num 转换为十进制数,有 O(lognum) 个数字,需要保存 num 所有的数字。

方法二:贪心

设整数 num 从右向左的数字分别为(d0, d1, d2, ⋯, dn−1),则此时我们可以知道:

num
假设我们对位于 j, k 位上的数字进行交换,其中满足 0 ≤ j < k < n,则可以知道交换后的值 val 如下:

val
根据以上等式我们可以看出,若使得 \textit{val}val 的值最大,应依次满足如下条件:

  • 最优的交换一定需要满足 dj > dk

  • 在满足 dj > dk 时,应该保证索引 k 越大从而使得数字 val 越大;

  • 在同样大小的数字 dk 时,应使得数字 dj 越大从而使得 val 越大;

  • 在同样大小的数字 dj 时,应使得索引 j 越小从而使得 val 越大;

通过以上可以观察到右边越大的数字与左边较小的数字进行交换,这样产生的整数才能保证越大。因此我们可以利用贪心法则,尝试将数字中右边较大的数字与左边较小的数字进行交换,这样即可保证得到的整数值最大。具体做法如下:

  • 我们将从右向左扫描数字数组,并记录当前已经扫描过的数字的最大值的索引为 maxId 且保证 maxId 越靠近数字的右侧,此时则说明 charArray[maxId] 则为当前已经扫描过的最大值。

  • 如果检测到当前数字 charArray[i] < charArray[maxId],此时则说明索引 i 的右侧的数字最大值为 charArray[maxId],此时我们可以尝试将 charArray[i] 与 charArray[maxId] 进行交换即可得到一个比 num 更大的值。我们尝试记录当前可以交换的数对 (i, maxId),根据贪心法则,此时最左边的 i 构成的可交换的数对进行交换后形成的整数值最大。

代码:

class Solution {
public:
    int maximumSwap(int num) {
        string charArray = to_string(num);
        int n = charArray.size();
        int maxIdx = n - 1;
        int idx1 = -1, idx2 = -1;
        for (int i = n - 1; i >= 0; i--) {
            if (charArray[i] > charArray[maxIdx]) {
                maxIdx = i;
            } else if (charArray[i] < charArray[maxIdx]) {
                idx1 = i;
                idx2 = maxIdx;
            }
        }
        if (idx1 >= 0) {
            swap(charArray[idx1], charArray[idx2]);
            return stoi(charArray);
        } else {
            return num;
        }
    }
};

执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:5.7 MB, 在所有 C++ 提交中击败了81.75%的用户
复杂度分析
时间复杂度:O(lognum),其中整数 num 为给定的数字。num 转换为十进制数,有 O(lognum) 个数字,需要遍历一次所有的数字即可。
空间复杂度:O(lognum),其中整数 num 为给定的数字。num 转换为十进制数,有 O(lognum) 个数字,需要保存 num 所有的数字。
author:LeetCode-Solution


http://lihuaxi.xjx100.cn/news/3646.html

相关文章

Python多线程(基本使用、防止重复、杀死线程)

目录 一、基本使用 1.方式一直接用 2.方式二创建类 二、守护进程 1.以第一种方式为例 2.以第二种方式为例 三、共享全局变量和互斥锁 四、防止重复 五、杀死线程 六、总结 由于Python中的多线程受GIL锁的限制&#xff0c;导致不能利用机器多核的特性&#xff0c;只能…

风控违约场景如何预测,来看看这份常见的三种模型实现算法对比

在机器学习算法中&#xff0c;树模型在风控、营销等实际业务场景应用中始终备受青睐。其中对于GBDT集成学习树模型&#xff0c;我们是非常熟悉的&#xff0c;而且在此基础上发展而来的XGBoost、LightGBM更是我们日常建模场景中经常接触到的&#xff0c;可以称为是Boosting算法体…

Java毕设项目——智能仓储系统(java+SSM+Maven+Mysql+Jsp)

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM 技术&#xff1a;Jsp JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7/8.0 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a…

计算机毕业设计Java演出票在线预定网站系统(源码+系统+mysql数据库+Lw文档)

计算机毕业设计Java演出票在线预定网站系统&#xff08;源码系统mysql数据库Lw文档&#xff09; 计算机毕业设计Java演出票在线预定网站系统&#xff08;源码系统mysql数据库Lw文档&#xff09;本源码技术栈&#xff1a; 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Ja…

经验分享:产品经理面试的5大技巧

​感谢Andy 老师给这个机会给大家分享一下我的一些面试心得&#xff0c;做了一个简单的总结给大家说一下。 今天的分享内容一共有6方面&#xff1a; 1、个人职业的总结 2、面试前学习的内容 3、我们如何去寻找面试机会 4、我们该如何准备面试 5、面试过程中遇到的常见问题…

postgresSQL多种字符串分割及查询汇总

目录 表及数据准备 SPLIT_PART函数应用及说明 string_to_array函数应用及说明 基于指定规则查询该列所有 按需分割后产生的字符串单独判断 按需分割后产生的字符串及其它列混合查询 以按需分割查询为条件查询其它列 array_length函数应用及说明 表及数据准备 测试表 …

艾美捷Abnova MYOC (人)抗体对说明书

MYOC 编码蛋白质肌纤蛋白&#xff0c;据信它在细胞骨架功能中起作用。MYOC 在包括小梁网在内的许多眼组织中表达&#xff0c;并被揭示为小梁网糖皮质激素诱导反应蛋白 (TIGR)。小梁网是调节眼压所必需的特殊眼组织&#xff0c;MYOC 的突变已被确定为遗传性青少年型开角型青光眼…

使用Softing为西门子工业边缘开发的edgePlug软件简化了设备与应用程序的连接

一 为西门子工业边缘应用轻松提供控制器数据 作为西门子工业边缘市场的一部分&#xff0c;Softing edgePlug软件产品通过西门子工业边缘&#xff08;一个由边缘设备、应用程序和设备管理组成的开放、即用型边缘计算平台&#xff09;将西门子PLC连接到应用程序。 这意味着&…