关注
private ArrayList<Integer> num = new ArrayList<>();
private int max = 0;
private int[] result; // 存储选择的每一个数
private final int[][] contain = new int[10][2]; // 存在与否 小于自己的第一个数的索引
public int maxNum(int n, int[] arr){
if (arr == null || arr.length == 0) return 0;
Arrays.sort(arr); // O(1)
int tmp = n;
// 计算n的长度
while (tmp != 0){ // O(N)
num.add(tmp % 10);
tmp /= 10;
}
// 维护hash数组
for (int i : arr) { // O(1)
contain[i][0]++;
}
// 维护hash数组最小链 O(1)
int small = -1;
for (int i = 0; i < contain.length; i++) {
contain[i][1] = small;
if (contain[i][0] != 0){
small = i;
}
}
result = new int[num.size()];
int head = num.get(num.size() - 1);
// 分情况处理 1. 最高位存在,则进行dfs 2. 最高位不存在但是存在一个比它小的值(2500 不存在2但是有1)
// 3. 剩余位填充数组里的最大值即可
if (contain[head][0] != 0){
if(dfs(0,arr,n)) return max;
}else if (contain[head][1] != -1){
max = contain[head][1];
}
for (int i = 0; i < num.size() - 1; i++) {
max = max * 10 + arr[arr.length - 1];
}
// 提供的数字都大于n最高位,只能返回n-1位长度
return max;
}
private boolean dfs(int depth, int[] arr, int n){
if (depth == num.size()){
return arrToInt() < n;
}
// 如果前一位已经小于模式数了,剩下的直接选择最大值比如(4 5 00与4 4 99)
if (depth > 0 &;&; result[depth - 1] < num.get(num.size() - depth)){
while (depth < num.size()){
result[depth++] = arr[arr.length - 1];
}
return true;
}
// 到此说明前一位仍是选择了相同的数,dfs不可能选择大于的,因为这样得到的数必然大于n
int cur = num.get(num.size() - 1 - depth);
// 存在则选择,不存在选更小的
cur = contain[cur][0] != 0 ? cur : contain[cur][1];
while (cur != -1) {
result[depth] = cur;
if (dfs(depth + 1,arr,n)) return true;
cur = contain[cur][1];
}
return false;
}
private int arrToInt(){
int sum = 0;
for (int j : result) {
sum = sum * 10 + j;
}
return sum;
}
查看原帖
点赞 评论
相关推荐
点赞 评论 收藏
分享
牛客热帖
更多
- 1... 毕业啦!我们要一起去广州打拼啦!2.8W
- 2... 毕业了,有些话只能藏在心里了2.4W
- 3... 2026春招到底卷成什么样了?填问卷说出真相,最高领200元现金红包2.1W
- 4... 字节 中国交易与广告 后端一面1.7W
- 5... 华为暑期实习1.2W
- 6... 从腾讯 字节到阿里 从前端到Agent 感谢一路走来的我自己😭1.0W
- 7... 别人:阿里 字节 腾讯9908
- 8... 211本,130投0面,agent应用开发,简历求助!8654
- 9... 大三下了 学校不放实习怎么办8515
- 10... 从阿里被裁到快手升P6,我花了四年7711
正在热议
更多
# 如果春招能重来,我会___ #
28639次浏览 281人参与
# 机械人还在等华为开奖吗? #
339055次浏览 1652人参与
# 在爱玛,骑向未来 #
19814次浏览 388人参与
# 这个offer值得去吗? #
30245次浏览 215人参与
# 华为池子有多大 #
177800次浏览 930人参与
# 你会因为行情,降低找工作标准吗? #
44064次浏览 320人参与
# 联宝杯大学生创新大赛,你的技术值得产业级答案 #
50316次浏览 778人参与
# 24秋招避雷总结 #
1019589次浏览 7098人参与
# 机械人,你的秋招第一份简历被谁挂了 #
268634次浏览 2450人参与
# 远程面试的尴尬瞬间 #
363690次浏览 2062人参与
# 大学最后一个寒假,我想…… #
103211次浏览 846人参与
# 机械求职避坑tips #
103600次浏览 589人参与
# 校招薪资来揭秘 #
960114次浏览 4060人参与
# 记录我的毕业季 #
4154次浏览 111人参与
# 26届春招投递记录 #
8522次浏览 71人参与
# 网易求职进展汇总 #
213004次浏览 1523人参与
# 刚入职就____,这样正常吗? #
148711次浏览 709人参与
# 选择和努力,哪个更重要? #
211694次浏览 1566人参与
# 去年你投递实习了吗? #
32800次浏览 339人参与
# 你被哪些公司挂了? #
194688次浏览 1056人参与
# 春招前还要继续实习吗? #
66859次浏览 330人参与
# 字节开奖 #
159119次浏览 781人参与
查看16道真题和解析