day37贪心(6)

day37
代码随想录
2024.1.4

1. 738单调递增的数字
这道题其实做法是有点找规律的,得判断变化得规律,首先如果满足条件直接返回原始值;
其次,如果不满足如果是ab,不满足,说明a>b,因为我们找的是小于ab的最大数,所以整体要减小,现在的变动无非就是a和b变大变小的问题,如果a不动,b再怎么变也不行啊,a增大就更扯了,因此结论,a是一定要减小的!因为要找最大的,所以,a减小1就好,那么,a减小后,b呢?还是同理,要最大!所以b直接为9就好,一定满足a<=b;这就是局部最优的逻辑。然后整体遍历就好,不过还有一点要注意的,遍历顺序要从右往左,原理跟那个分发糖果类似,就不再细说了。

class Solution {
public:
    int monotoneIncreasingDigits(int n) {
        string strNum = to_string(n);
        // flag用来标记赋值9从哪里开始
        // 设置为这个默认值,为了防止第二个for循环在flag没有被赋值的情况下执行
        int flag = strNum.size();
        for (int i = strNum.size() - 1; i > 0; i--) {
            if (strNum[i - 1] > strNum[i] ) {
                flag = i;
                strNum[i - 1]--;
            }
        }
        for (int i = flag; i < strNum.size(); i++) {
            strNum[i] = '9';
        }
        return stoi(strNum);
    }
};

你可能感兴趣的:(LeetCode刷题记录,算法)