字节手撕题 小于 n 的最大整数 贪心 回溯 剪枝 全排列

devtools/2025/4/1 18:48:07/

给定一个数字字符串S和一个数组nums,数组中的元素都在0~9之间,问从数组中选择元素组成的数字,小于N的最大值是多少?
例如:S = “24378”,nums:{2,3,9},组成的最大值为23999。

👨‍🏫 参考视频

java">import java.util.Arrays;public class Main {public static void main(String[] args) {/*示例 1:A={1, 2, 9, 4},n=2533,返回 2499。示例 2:A={1, 2, 5, 4},n=2543,返回 2542。示例 3:A={1, 2, 5, 4},n=2541,返回 2525。示例 4:A={1, 2, 9, 4},n=2111,返回 1999。示例 5:A={5, 9},n=5555,返回 999。*/// 示例1int[] a1 = {1, 2, 9, 4};int n1 = 2533 ;System.out.println("示例1:" +Arrays.toString(a1)+"," + n1 + " : "+ getMaxLessNum(a1, n1) + " (应返回2499)");// 示例2int[] a2 = {1, 2, 5, 4};int n2 = 2543;System.out.println("示例2:" +Arrays.toString(a2)+"," + n2 + " : "+ getMaxLessNum(a2, n2) + " (应返回2542)");// 示例3int[] a3 = {1, 2, 5, 4};int n3 = 2541;int m = 2541;System.out.println("示例3:" +Arrays.toString(a3)+"," + n3 + " : "+ getMaxLessNum(a3, n3) + " (应返回2525)");// 示例4int[] a4 = {1, 2, 9, 4};int n4 = 2111;System.out.println("示例4:" +Arrays.toString(a4)+"," + n4 + " : "+ getMaxLessNum(a4, n4) + " (应返回1999)");// 示例5int[] a5 = {5, 9};int n5 = 5555 ;System.out.println("示例5:" +Arrays.toString(a5)+"," + n5 + " : " + getMaxLessNum(a5, n5) + " (应返回999)");int[] a6 = {5};int n6 = 2 ;System.out.println("示例6:" +Arrays.toString(a6)+"," + n6 + " : "+ getMaxLessNum(a6, n6) + " (不存在)");}static int[] nums;/*** 获取由数组nums中的元素组成的数字,且小于n的最大值*/public static String getMaxLessNum(int[] a, int b) {// 对nums数组进行排序,方便后续查找最大值nums = a;Arrays.sort(nums);int[] n = String.valueOf(b).chars().map(c -> c - '0').toArray();// 用于存储结果数字的字符串// 深度优先搜索,寻找最大值StringBuilder ans = new StringBuilder();dfs(true, ans,n, 0);return ans.length() == 0 ? "不存在" :ans.toString();}/*** 深度优先搜索,寻找最大值* @param equal:*              true 表示前面的都相等*              false 表示前面有小于 nums 的位后面都可以取最大* @param n 表示的是最大数* @param idx 表示最大数枚举到的下标*/private static boolean dfs(boolean equal, StringBuilder ans, int[] n,  int idx) {// 如果是最后一位,则需要判定是否有小于n的数if (idx == n.length - 1) {if (!equal) {// 如果前面已经有不相等的位,则直接取nums的最大值ans.append(nums[nums.length - 1]);return true;} else { // 说明前面的数位都相等,当前数位必须取一个小于 n 对应数位的值,找不到返回 false// 否则需要寻找小于n最后一位的最大值for (int i = nums.length - 1; i >= 0; i--) {if (nums[i] < n[n.length - 1]) {ans.append(nums[i]);return true;}}return false;}}// 前面有不相等的,后面都取nums的最大值即可if (!equal) {for (int i = idx; i < n.length; i++) {ans.append(nums[nums.length - 1]);}return true;}// 前面都相等,优先取和n[idx]相同的值(因为高位大才是真的大),深度优先遍历,如果后面组成的数小于n,则找到了最大的值。// 如果当前值小于n[idx],则后面都取nums的最大值即可for (int i = nums.length - 1; i >= 0; i--) {if (nums[i] == n[idx]) {ans.append(nums[i]);boolean result = dfs(true,ans, n, idx + 1);if (result) {return true;} else {ans.deleteCharAt(ans.length() - 1); // 回溯,删除最后一个字符}}if (nums[i] < n[idx]) {ans.append(nums[i]);dfs(false,ans, n, idx + 1); // 后续位都取最大值return true;}}// 神之一笔,所有都不满足,直接取减少一位// 如果前面都不满足,删除第一位即可if (idx == 0) {dfs(false,ans,  n, idx + 1);return true;}return false;}
}

👨‍🏫 参考博客


http://www.ppmy.cn/devtools/171298.html

相关文章

Docker镜像迁移方案

Docker镜像迁移方案 文章目录 Docker镜像迁移方案一&#xff1a;背景二&#xff1a;操作方式三&#xff1a;异常原因参考&#xff1a; 一&#xff1a;背景 比如机器上已经有先有的容器&#xff0c;但是docker pull的时候是失败的二&#xff1a;操作方式 1、停止正在运行的容器…

炫酷的HTML5粒子动画特效实现详解

炫酷的HTML5粒子动画特效实现详解 这里写目录标题 炫酷的HTML5粒子动画特效实现详解项目介绍技术栈项目架构1. HTML结构2. 样式设计 核心实现1. 粒子类设计2. 动画效果实现星空效果烟花效果雨滴效果 3. 鼠标交互 性能优化效果展示总结 项目介绍 本文将详细介绍如何使用HTML5 C…

Java高频面试之集合-18

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;HashMap 是线程安全的吗&#xff1f;多线程下会有什么问题&#xff1f; HashMap 的线程安全性分析 HashMap 不是线程安全…

gin学习

gin学习笔记&#xff0c;不仅包含了基本的增删查改外&#xff0c;还包括参数传递&#xff0c;上传下载&#xff0c;模版、session与中间件等&#xff0c;方便收藏自习可用 文章目录 获得个请求get打印字符串get请求xmlget请求跳转http方法路由可以通过Context的Param方法来获取…

第4章 IP网络扫描(网络安全评估)

你的网络有多安全&#xff1f;要回答这一问题&#xff0c;最好的方法是对其进行攻击。《网络安全评估》&#xff08;第二版&#xff09;为你提供了用于识别和评估网络安全的技巧和工具&#xff0c;通过学习本书&#xff0c;你可以掌握网络安全加固知识&#xff0c;从而避免网络…

雷军从 6 楼扔涂有防弹涂层西瓜,西瓜完好无损,这种防弹涂层是什么材质?用在车上效果怎么样?

雷军展示的“防弹涂层”是一种基于第四代高分子材料聚脲&#xff08;Polyurea&#xff09;的升级技术&#xff0c;其核心特性是通过纳米级交联结构形成弹性防护层&#xff0c;兼具柔韧性与刚性&#xff0c;能够有效吸收冲击能量并抵御尖锐物体的穿刺。以下是关于该涂层材质及在…

火爆DeepSeek 低调发布 V30324 版本模型更新,宽松的MIT开源协议发布(附模型文件)

DeepSeek-V3-0324&#xff0c;此次更新在多个方面进行了优化和提升&#xff0c;进一步巩固了DeepSeek在开源AI领域的地位&#xff0c;为开发者、研究者和普通用户提供了更强大的工具。 性能提升 推理能力增强&#xff1a;DeepSeek-V3-0324在多个基准测试上取得了显著进步&am…

【2025】基于springboot+spark的电影推荐系统(源码、万字文档、图文修改、调试答疑)

基于Spring Boot Spark的电影推荐系统项目介绍 系统功能结构图如下&#xff1a; 一、课题背景 随着电影产业的蓬勃发展&#xff0c;用户面临着海量的电影选择&#xff0c;如何从众多电影中快速找到符合自己兴趣的影片成为一个重要问题。传统的电影推荐方式往往基于人工编辑的规…