当前位置: 首页 > news >正文

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值(中等)

      • 题目描述
      • 解题思路
      • Java代码

题目描述

题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等)
给你一个长度为 3 的整数数组 nums。

现以某种顺序 连接 数组 nums 中所有元素的 二进制表示 ,请你返回可以由这种方法形成的 最大数值。

注意 任何数字的二进制表示不含前导零。

示例 1:

输入: nums = [1,2,3]
输出: 30
解释:
按照顺序 [3, 1, 2] 连接数字的二进制表示,得到结果 “11110”,这是 30 的二进制表示。

示例 2:

输入: nums = [2,8,16]
输出: 1296
解释:
按照顺序 [2, 8, 16] 连接数字的二进制表述,得到结果 “10100010000”,这是 1296 的二进制表示。

提示:

nums.length == 3
1 <= nums[i] <= 127

解题思路

1.整体思路:使用递归回溯的方式尝试构造所有的拼接方案(构造全排列),取拼接方案中数值最大的即可。递归回溯法的关键在于:每次尝试之后,进行递归回退时要撤销尝试,将状态恢复成尝试之前的状态。

2.实现细节:开一个数组 v i s vis vis 来记录元素是否被选取过, v i s [ i ] vis[i] vis[i] 表示第 i i i 个数是否被选取过( 0 0 0 没选过, 1 1 1 选过)。每次尝试从 n u m s nums nums 数组中选取一个没被选过的数 n u m s [ i ] nums[i] nums[i] 拼接得到 c a n c a t cancat cancat ,将 v i s [ i ] vis[i] vis[i] 置为 1 1 1,表示该数已被选取过。当 n u m s nums nums 中的数都被选过时得到一种拼接方式,直接返回 c a n c a t cancat cancat 。每次回退时取消当前尝试,将 v i s [ i ] vis[i] vis[i] 恢复为 0 0 0,将 c a n c a t cancat cancat 恢复成之前的取值。在尝试的过程中更新拼接方案的最大取值。

3.如何实现二进制数的拼接:当前要拼接的数 n u m s [ i ] nums[i] nums[i] 二进制有几位,就把 c o n c a t concat concat 左移几位,然后将当前的数 n u m s [ i ] nums[i] nums[i] 加到 c o n c a t concat concat 上就实现了拼接。

Java代码

public class Solution {public int maxGoodNumber(int[] nums) {int vis[] = new int[nums.length];return dfs(0, 0, nums, vis);}/*** count:   已经选取的数的个数* concat:  拼接得到的数* nums:    可选数的数组* vis[i]:  第i个数是否被选取过*/int dfs(int count, int concat, int nums[], int vis[]) {if (count == nums.length) {// 所有的数的被选过,得到最终拼接的数return concat;}int res = Integer.MIN_VALUE;for (int i = 0; i < nums.length; i++) {// 判断当前数是否拼接过if (vis[i] == 0) {int x = nums[i], temp = concat;while (x > 0) {x = x >> 1;concat = concat << 1;}// 尝试拼接concat += nums[i];vis[i] = 1;// 可行拼接中取最大值res = Math.max(res, dfs(count + 1, concat, nums, vis));// 尝试完之后复原到拼接前的数concat = temp;vis[i] = 0;}}return res;}
}
http://www.lqws.cn/news/187993.html

相关文章:

  • (nice!!!)(LeetCode每日一题)2434. 使用机器人打印字典序最小的字符串(贪心+栈)
  • 如何防止误删除rm (万恶之源)
  • 第二十九章 读写内部FLASH
  • 国产PC系统
  • S5P6818_驱动篇(24)UART驱动
  • 通过中脑刺激相关神经回路的纤维微解剖建立连接性
  • JavaSec-SPEL - 表达式注入
  • 山东大学《数据可视化》期末复习宝典
  • 怎么让大语言模型(LLMs)自动生成和优化提示词:APE
  • 在Markdown中使用MathType插入公式
  • next,react封装axios,http请求
  • Webhook 配置备忘
  • 浏览器工作原理06 [#]渲染流程(下):HTML、CSS和JavaScript是如何变成页面的
  • 基于Selenium+Python的web自动化测试框架
  • C++.OpenGL (3/64)着色器(Shader)深入
  • ceph 脚本,用于计算 rbd 文件存放 OSD 方法
  • 在UI界面内修改了对象名,在#include “ui_mainwindow.h“没更新
  • MySQL 索引优化(Explain执行计划) 详细讲解
  • 阿里140 补环境日志
  • JS-- for...in和for...of
  • IDEA 中 Undo Commit,Revert Commit,Drop Commit区别
  • 从微积分到集合论(1630-1910)(历史简介)——第4章——现代积分理论的起源(Thomas Hawkins)
  • Python | Windows11通过离线方式安装pyserial
  • idea中 maven 本地仓库有jar包,但还是找不到,解决打包失败和无法引用的问题———————————————— 版权声明:本文为博
  • 艾体宝案例丨Transavia如何借助LambdaTest测试平台高效起飞?
  • 基于深度强化学习的Scrapy-Redis分布式爬虫动态调度策略研究
  • maven微服务${revision}依赖打包无法识别
  • Xsens-AAA工作室品质,为动画师准备
  • 深入浅出多路归并:原理、实现与实战案例解析
  • Blaster - Multiplayer P145-P152: 多种武器