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; }
点赞 评论

相关推荐

钱嘛数字而已:辅导员肯定不能同意,不然你出事了,他要承担责任。但是,脚和脑子都长在你自己身上,使用它还需要向辅导员报告么? 辅导员必须按流程拒绝你,然后你拿出成年人的态度,做自己的选择。
点赞 评论 收藏
分享
正在热议
更多
# 长得好看会提高面试通过率吗? #
3876次浏览 45人参与
# 离家近房租贵VS离家远但房租低,怎么选 #
16896次浏览 137人参与
# MiniMax求职进展汇总 #
25132次浏览 321人参与
# 春招至今,你的战绩如何? #
15716次浏览 144人参与
# 你的实习产出是真实的还是包装的? #
3051次浏览 53人参与
# 沪漂/北漂你觉得哪个更苦? #
1513次浏览 40人参与
# 米连集团26产品管培生项目 #
7286次浏览 226人参与
# HR最不可信的一句话是__ #
1078次浏览 32人参与
# AI面会问哪些问题? #
935次浏览 23人参与
# 你做过最难的笔试是哪家公司 #
1228次浏览 22人参与
# AI时代,哪个岗位还有“活路” #
2814次浏览 51人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152901次浏览 889人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
8007次浏览 43人参与
# XX请雇我工作 #
51155次浏览 171人参与
# 简历第一个项目做什么 #
32131次浏览 360人参与
# 简历中的项目经历要怎么写? #
311028次浏览 4264人参与
# 投格力的你,拿到offer了吗? #
178337次浏览 891人参与
# 你最满意的offer薪资是哪家公司? #
76978次浏览 375人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187585次浏览 1123人参与
# AI时代,哪些岗位最容易被淘汰 #
64730次浏览 886人参与
# 如果重来一次你还会读研吗 #
230010次浏览 2011人参与
# 正在春招的你,也参与了去年秋招吗? #
364336次浏览 2642人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务