Monday, October 2, 2023

Leetcode 670. Maximum Swap

第一感就是从最左边数位开始查找,如果该数位的右边有更大的数,那么我们应该交换;进而想到应该维护一个数组,表示该数位右边的最大数字,这个数组可以通过由右向坐遍历一遍得到;再进一步想到,如果有多个相同的最大值,那么应该记录最靠右的那个index,这样交换之后的数更大。最后如果该数位本身已经是最大值了就不用交换。

时间复杂度: O(N)

空间复杂度: O(N) ,因为额外数组

class Solution {
public:
    int maximumSwap(int num) {
        string numStr = to_string(num);
        vector<int> rightLargest(numStr.size());
        int curMaxIndex = numStr.size()-1;
        for(int i=numStr.size()-1; i>=0; i--){
            if(numStr[i]-'0'>numStr[curMaxIndex]-'0'){
                rightLargest[i] = i;
                curMaxIndex = i;
            }else{
                rightLargest[i] = curMaxIndex;
            }
        }

        string res = numStr;
        for(int i=0; i<numStr.size(); i++){
            //this is critical, only swap if number in right max index is larger than current number
            if(numStr[rightLargest[i]]-'0' > numStr[i]-'0'){
                res[i] = numStr[rightLargest[i]];
                res[rightLargest[i]] = numStr[i];
                return stoi(res);
            }
        }


        return num;
    }
};

No comments:

Post a Comment

Leetcode 316. Remove Duplicate Letters

 这道题表面问的是如何删除重复,实际在问如何从多个字符选取一个保留,从而让整个字符串按升序排列。那么策略就是对于高顺位的字符比如‘a',就要选靠前位置的保留,而低顺位字符如’z'则应该尽量选取靠后位置保留。 算法大概思路:每看到一个字符,我们要决定是否保留 1. ...