【LeetCode:2048. 下一个更大的数值平衡数 | 模拟 + 二分 + 打表】

2023-12-13 04:27:07

在这里插入图片描述

🚀 算法题 🚀

🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样?
🌲 作者简介:硕风和炜,CSDN-Java领域新星创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯

🚀 算法题 🚀

在这里插入图片描述

在这里插入图片描述

🚩 题目链接

? 题目描述

如果整数 x 满足:对于每个数位 d ,这个数位 恰好 在 x 中出现 d 次。那么整数 x 就是一个 数值平衡数 。

给你一个整数 n ,请你返回 严格大于 n 的 最小数值平衡数 。

示例 1:

输入:n = 1
输出:22
解释:
22 是一个数值平衡数,因为:

  • 数字 2 出现 2 次
    这也是严格大于 1 的最小数值平衡数。
    示例 2:

输入:n = 1000
输出:1333
解释:
1333 是一个数值平衡数,因为:

  • 数字 1 出现 1 次。
  • 数字 3 出现 3 次。
    这也是严格大于 1000 的最小数值平衡数。
    注意,1022 不能作为本输入的答案,因为数字 0 的出现次数超过了 0 。
    示例 3:

输入:n = 3000
输出:3133
解释:
3133 是一个数值平衡数,因为:

  • 数字 1 出现 1 次。
  • 数字 3 出现 3 次。
    这也是严格大于 3000 的最小数值平衡数。

提示:

0 <= n <= 106

🌟 求解思路&实现代码&运行结果


? 模拟 + 二分 + 打表

🥦 求解思路
  1. 题目给定的数据范围比较大,而我们想找到平衡数,所以,我们可以先取找平衡数,存入到集合中。
  2. 然后根据二分进行查找,找到大于n的最小平衡数。(注意:为什么不直接二分所有数找呢?因为无法保证数的二分,也就是此时二分的数是无法判断接下来的行为的。)
  3. 实现代码如下所示:
🥦 实现代码
class Solution {

    private static ArrayList<Integer> list;

    static{
        list=new ArrayList<>();
        for(int i=1;i<=10000001;i++){
            if(isBalanceNumber(i)) list.add(i);
        }
    }

    public int nextBeautifulNumber(int n) {
        int left=-1;
        int right=list.size();
        while(left+1<right){
            int mid=left+right>>1;
            if(check(mid,n)){
                right=mid;
            }else{
                left=mid;
            }
        }
        return list.get(right);
    }

    private static boolean isBalanceNumber(int mid){
        int[] cnt=new int[10];
        Arrays.fill(cnt,0);
        int temp=mid;
        while(temp!=0){
            int m=temp%10;
            cnt[m]++;
            temp/=10;
        }
        for(int i=0;i<10;i++){
            if(cnt[i]==0) continue;
            if(i!=cnt[i]){
                return false;
            }
        }
        return true;
    }

    private boolean check(int x,int n){
        if(list.get(x)>n){
            return true;
        }
        return false;
    }
}
🥦 运行结果

在这里插入图片描述


💬 共勉

最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉!

在这里插入图片描述

在这里插入图片描述

文章来源:https://blog.csdn.net/Coder_ljw/article/details/134892242
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。