zoukankan      html  css  js  c++  java
  • 单调递增的数字-贪心

    package Leetcode;
    /**
     * 给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。
    (当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。)
     */
    /**
     * 注意到如果减小 str[i]str[i] 以后不满足 str[i-1] <= str[i]str[i−1]<=str[i],那么肯定有 str[i-1] == str[i]str[i−1]==str[i],此时就需要再 str[i-1] - 1str[i−1]−1,递归地会处理到某个位置 idxidx,我们发现 str[idx] == str[idx + 1] == ... = str[i]str[idx]==str[idx+1]==...=str[i] 。然后只要str[idx] - 1str[idx]−1,然后后面都补上 99 即可。
    所以代码写起来很简单了。遍历各位数字的时候,求当前最大的数字 max。然后只在 max < arr[i]max<arr[i] 的时候才更新 max 对应的 idx(写法类似于查找数组中最大的元素,返回最小的下标)。接着判断是否有 arr[i] > arr[i + 1]arr[i]>arr[i+1],如果是,那么 idx 位置数字减 11,后面的位置全部置 99 即可。
     */
    public class dizengshuzi {
        public static void main(String[] args) {
            int N=332;
            System.out.println(monotoneIncreasingDigits(N));     
        }
        public static int monotoneIncreasingDigits(int N) {
            char []c=Integer.toString(N).toCharArray();
            int i=1;
            while(i<c.length&&c[i-1]<=c[i]){
                i+=1;
            }
            if(i<c.length){
                while(i>0&&c[i-1]>c[i]){
                    c[i-1]-=1;
                    i=i-1;
                }
                for(i+=1;i<c.length;i++){
                    c[i]='9';
                }
            }
            return Integer.parseInt(new String(c));
        }
        
    }
  • 相关阅读:
    js判断选择时间不能小于当前时间的代码
    shell脚本编程之for语句、if语句使用介绍
    linux命令 chattr超级权限控件
    教你配置linux服务器登陆欢迎信息
    PHP基础入门教程 PHP循环函数
    php获取客户端ip地址
    PHP获取域名、IP地址的方法
    两日期间的间隔
    mysql 案例 ~ pt-archiver 归档工具的使用
    mysql 案例 ~ pt修复工具的使用
  • 原文地址:https://www.cnblogs.com/jieyi/p/14141295.html
Copyright © 2011-2022 走看看