670. 最大交换-贪心

Posted hequnwang10

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了670. 最大交换-贪心相关的知识,希望对你有一定的参考价值。

一、题目描述

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

示例 1:
输入: 2736
输出: 7236
解释: 交换数字2和数字7。
示例 2:
输入: 9973
输出: 9973
解释: 不需要交换。

二、解题

贪心算法

0-9总共10个数,所以先将数字转为字符串数组,记录每个数字的最远下标,然后从9开始遍历,与字符串数组比较,判断下标数组是否存在9,然后比较9所在的下标是否大于当前字符串的下标,若大于直接交换,本题只允许最多交换一次。

class Solution 
    public int maximumSwap(int num) 
        //贪心算法
        char[] charnum = String.valueOf(num).toCharArray();
        int length = charnum.length;
        //0-9 总共十个数
        int[] indexlast = new int[10];
        for(int i = 0;i<length;i++)
            indexlast[charnum[i]-'0'] = i;
        

        //开始遍历字符串
        for(int i = 0;i<length;i++)
            //从最大值9开始往前遍历 如果9大于当前字符串数组的值,则交换两个位置
            for(int j = 9;j > charnum[i]-'0';j--)
                if(indexlast[j] > i)
                    //i是当前字符串的下标,indexlast[j]表示最大值在字符串中的下标
                    swap(charnum,i,indexlast[j]);
                    return Integer.valueOf(new String(charnum));
                
            
        
        return num;
    
    public void swap(char[] charnum,int left,int right)
        char temp = charnum[left];
        charnum[left] = charnum[right];
        charnum[right] = temp;
    

时间复杂度:O(n);

空间复杂度:O(1)。

以上是关于670. 最大交换-贪心的主要内容,如果未能解决你的问题,请参考以下文章

每日一题670. 最大交换

每日一题670. 最大交换

数组670. 最大交换

670. Maximum Swap

LeetCode 0670. 最大交换

2021 ICPC沈阳 H.Line Graph Matching(并查集+贪心)