关注
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;
}
查看原帖
点赞 评论
相关推荐
![](https://static.nowcoder.com/fe/file/oss/1716965564844UEBJN.png)
![](https://static.nowcoder.com/fe/file/oss/1716965585666UBBME.png)
腾讯
| 校招
| 超多精选岗位
点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 如果重来一次你还会读研吗 #
153939次浏览 1689人参与
# 读研or工作,哪个性价比更高? #
22923次浏览 310人参与
# 文科生还参加今年的春招吗 #
2934次浏览 27人参与
# 选择和努力,哪个更重要? #
40728次浏览 461人参与
# 如果再来一次,你还会学硬件吗 #
102329次浏览 1230人参与
# 影石Insta360求职进展汇总 #
107235次浏览 961人参与
# 打工人的工作餐日常 #
24521次浏览 220人参与
# 如果公司降薪,你会跳槽吗? #
44012次浏览 343人参与
# 机械制造公司评价 #
98318次浏览 286人参与
# 一人推荐一个值得去的通信/硬件公司 #
160864次浏览 1734人参与
# 我的国央企投递进展 #
35768次浏览 242人参与
# 招聘要求与实际实习内容不符怎么办 #
38578次浏览 460人参与
# 我的工作日记 #
52662次浏览 758人参与
# 小厂实习有必要去吗 #
31354次浏览 215人参与
# 大疆今年的机械笔试难吗? #
35221次浏览 408人参与
# 大疆的机械笔试比去年难吗 #
64020次浏览 577人参与
# 24届市场营销薪资爆料 #
9368次浏览 62人参与
# 你的秋招简历被谁挂了? #
216338次浏览 2403人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
68244次浏览 493人参与
# 正在实习的你,有转正机会吗? #
335618次浏览 2689人参与