【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
🌟 求解思路&实现代码&运行结果
? 模拟 + 二分 + 打表
🥦 求解思路
- 题目给定的数据范围比较大,而我们想找到平衡数,所以,我们可以先取找平衡数,存入到集合中。
- 然后根据二分进行查找,找到大于n的最小平衡数。(注意:为什么不直接二分所有数找呢?因为无法保证数的二分,也就是此时二分的数是无法判断接下来的行为的。)
- 实现代码如下所示:
🥦 实现代码
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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!