94、贪心-LeetCode-738.单调递增的数字

题目

当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。

给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增 。

来源:力扣(LeetCode)

思路

1)暴力:for循环挨个比较,挨个对比!

2)贪心:后一位比前一位小,就前一位减一,后全部变为9!最优

3)注意的点:

①java中幂运算Math.pow(底数,幂次);返回值位 double

②要记得求 幂次方的地方前面的 值要加上;如 a *  和 9 *

4)还可以将数字转换为字符串再转换为 字符数组,处理起来更方便,但是时间和空间效率都比不上这个代码!

String.valueOf(参数);可以将其他形式的内容转换为字符串!

Integer.parseInt():转换为int型数字

代码

1)错误:超出时间限制!

class Solution {
    public int monotoneIncreasingDigits(int n) {
        //1.暴力:从该数字递减对比!超时
        for(int i = n;i >= 0;i--){
            //取各个位置上的数
            int a = i % 10;//取得余数
            int b = i / 10;//将数值缩小
            while(b != 0){
                if(b % 10 > a) break;//该数字不符合要求
                else if(b % 10 <= a){
                    a = b % 10;
                    b = b / 10;
                }
            }
            if(b == 0) return i;
        }
        return 0;
    }
}

2)贪心:大大降低了时间复杂度

class Solution {
    public int monotoneIncreasingDigits(int n) {
        //返回的结果
        double res = 0;
        int num = -1;
        
        while(n != 0){
            num++;
            int a = n % 10;
            n /= 10;//去掉后一位
            if(n % 10 <= a){
                res = res + a * Math.pow(10.0,num);//计算位置
            }
            else if(n % 10 > a){//将后面的内容全部变为9,前面一位减一
                res = 0;
                int k = num;
                while(k >= 0){
                    res += 9 * Math.pow(10,k);//后面的每位数都设置为 9
                    k--;
                }
                n -= 1;//将前一位减1
            }
        }
        return (int)res;
    }
}

3)转换为 字符数组后的操作

class Solution {
    public int monotoneIncreasingDigits(int n) {
        //转换为字符数组进行操作
        String s = String.valueOf(n);
        char[] chars = s.toCharArray();
        //记录后面需要转化为9的位置
        int start = s.length();
        //后面都是与 i + 1比较,所以从倒数第二个位置开始
        for (int i = s.length() - 2; i >= 0; i--) {
            if (chars[i] > chars[i + 1]) {
                chars[i]--;//前一位要 -1
                start = i+1;//更新换为9的起始位置
            }
        }
        //从start开始!start最小为 1 
        for (int i = start; i < s.length(); i++) {
            chars[i] = '9';
        }
        return Integer.parseInt(String.valueOf(chars));
    }
}

你可能感兴趣的:(贪心,贪心算法,leetcode)