670. 最大交换(贪心算法)

105 阅读2分钟

image.jpeg

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第12天,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

    image.png

  • 题目示例

    image.png

  • 题目解析

    • 给定数字的范围是 [0, 10^8]

二、思路分析:

我们今天拿到本题是 leetcode 难度为中等题 670.最大交换。根据题目要求对一个非负整数,只能至多交换一次任意两位,并返回最大值。对于本题我们需要注意两点:

  • 题目给出的是:非负的整型
  • 交换后两位后,数字是最大的
  • 因此在进行交换前,我们需要将num转换成列表list类型

根据本题,解答本题我们可以使用暴力法和贪心法两种,思路如下:

  • 方法一:暴力法

    • 需要交换num里面的两个数字,直接使用两个for循环
    • 依次两两交换比较,取最大的那个数
    class Solution(object):
        def maximumSwap(self, num):
            strnum = list(str(num))
            n = len(strnum)
            ans = num
            for i in range(n):
                for j in range(i+1,n):
                    strnum[i],strnum[j] = strnum[j],strnum[i]
                    ans = max(ans,int("".join(strnum)))
                    strnum[i],strnum[j] = strnum[j],strnum[i]
            return ans
    
  • 方法二:贪心法

    • 本题核心需要找到两个数字,即左边数字索引index1和右边数字索引index2位置进行交换,保证右边越大的数字与左边较小的数字进行交换,这样就能保证交换后,得到的数字是最大的
    • 首先我们需要定义三个变量:index1,index2和maxide,都位于strnum末尾🔚
    • 初始化定义最大数索引为maxide
    • 从后往前对strnum进行遍历,当strnum[i] > strnum[maxide]时,则maxide更新为i
    • 当strnum[i] < strnum[maxide]时,则更新左边和右边数索引位置index1 = i,index2 = maxide
    • 当idex1小于0时,则不需要进行交换,直接返回num
    • strnum[index1],strnum[index2] 两个数字进行交换即可,join(strnum)转换成字符串,返回int类型
    class Solution(object):
        def maximumSwap(self, num):
            """
            :type num: int
            :rtype: int
            """
            strnum = list(str(num))
            n = len(strnum)
    
            maxide = -1
            idex1,idex2 = -1,-1
    
            for i in range(n-1,-1,-1):
                if strnum[i] > strnum[maxide]:
                    maxide = i
                elif strnum[i] < strnum[maxide]:
                    idex1,idex2 = i,maxide
            if idex1 < 0: return num
            strnum[idex1],strnum[idex2] = strnum[idex2],strnum[idex1]
            return int("".join(strnum))
    

三、总结:

本题考察对贪心算法运用,进行两次贪心,1贪找到左边最小数索引,2贪找到右边最大数索引,然后进行交换即可得到最大数,AC提交记录如下:

image.png

  • 时间复杂度:O(lognum),num是给定的数字
  • 空间复杂度:O(lognum),num是给定的数字

以上是本期内容,欢迎大佬们点赞评论,下期见~~~