【教3妹学编程-算法题】子集中元素的最大数量

瑟瑟发抖

2哥 : 3妹,今年过年收到压岁钱了没呢。
3妹:切,我都多大了啊,肯定没收了啊
2哥 : 俺也一样,不仅没收到,小侄子小外甥都得给,还倒贴好几千
3妹:哈哈哈哈,2叔叔,也给我这个小侄女点压岁钱啊
2哥 :切,没啦没啦
3妹:话说你最大是多少岁开始没人给压岁钱了啊?
2哥:emmm, 大概是16岁,上高中开始的吧
3妹:那2哥,你收到的最大红包是多少呢
2哥:5千,是我奶奶给我的。
2哥:好吧,回家不仅只有压岁钱,也要刷题啊,今天有一道“最大”的题目, 让我们先做一下吧~

吃瓜

题目:

给你一个 正整数 数组 nums 。

你需要从数组中选出一个满足下述条件的
子集

你可以将选中的元素放置在一个下标从 0 开始的数组中,并使其遵循以下模式:[x, x2, x4, …, xk/2, xk, xk/2, …, x4, x2, x](注意,k 可以是任何 非负 的 2 的幂)。例如,[2, 4, 16, 4, 2] 和 [3, 9, 3] 都符合这一模式,而 [2, 4, 8, 4, 2] 则不符合。
返回满足这些条件的子集中,元素数量的 最大值 。

示例 1:

输入:nums = [5,4,1,2,2]
输出:3
解释:选择子集 {4,2,2} ,将其放在数组 [2,4,2] 中,它遵循该模式,且 22 == 4 。因此答案是 3 。
示例 2:

输入:nums = [1,3,2,4]
输出:1
解释:选择子集 {1},将其放在数组 [1] 中,它遵循该模式。因此答案是 1 。注意我们也可以选择子集 {2} 、{4} 或 {3} ,可能存在多个子集都能得到相同的答案。

提示:

2 <= nums.length <= 10^5
1 <= nums[i] <= 10^9

思路:

思考

暴力枚举数组中的数,作为 x,然后不断看 x2,x4 ,⋯ 在数组中的个数。直到个数不足 2 个为止,退出循环。

注意模式的正中间的数字只取一个。如果最后 x 有一个,那么个数加一,否则个数减一。

注意特判 x=1的情况。

java代码:

class Solution {public int maximumLength(int[] nums) {HashMap<Long, Integer> cnt = new HashMap<>();for (int x : nums) {cnt.merge((long) x, 1, Integer::sum);}Integer c1 = cnt.remove(1L);int ans = c1 != null ? c1 - 1 | 1 : 0;for (long x : cnt.keySet()) {int res = 0;for (; cnt.getOrDefault(x, 0) > 1; x *= x) {res += 2;}ans = Math.max(ans, res + (cnt.containsKey(x) ? 1 : -1)); // 保证 res 是奇数}return ans;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/470342.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式Qt Qt 中的坐标系统

一.Qt中的坐标系统 实验1&#xff1a;窗口坐标大小 #include <QtGui/QApplication> #include <QPushButton> #include <QDebug> #include "widget.h" int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();qDebug()&…

VC++ 绘制折线学习

win32 有三个绘制折线的函数&#xff1b; Polyline&#xff0c;根据给定点数组绘制折线&#xff1b; PolylineTo&#xff0c;除了绘制也更新当前位置&#xff1b; PolyPolyline&#xff0c;绘制多条折线&#xff0c;第一个参数是点数组&#xff0c;第二个参数是一个数组、指…

[GYCTF2020]Blacklist

感觉是[强网杯 2019]随便注 的加强版&#xff0c;之前做的是最后可以通过prepare和execute实现对select的绕过&#xff0c;但是这题把这两个关键字也过滤了。 前面堆叠注入没啥问题&#xff0c;卡在了最后读取flag 查看其他师傅的wp&#xff0c;发现这个handler的可以当作丐版s…

【java苍穹外卖项目实战三】nginx反向代理和负载均衡

文章目录 1、nginx反向代理2、nginx 反向代理的好处3、nginx 反向代理的配置方式5、nginx 负载均衡的配置方式6、nginx 负载均衡策略 我们思考一个问题&#xff1a; 前端发送的请求&#xff0c;是如何请求到后端服务的&#xff1f; 前端请求地址&#xff1a;http://localhost/…

数字图像处理实验记录十(图像分割实验)

一、基础知识 1、什么是图像分割 图像分割就是指把图像分成各具特性的区域并提取出感兴趣目标的技术和过程&#xff0c;特性可以是灰度、颜色、纹理等&#xff0c;目标可以对应单个区域&#xff0c;也可以对应多个区域。 2、图像分割是怎么实现的 图像分割算法基于像素值的不连…

Days 32 ElfBoard GDT工作原理

GDT&#xff08;Gas Discharge Tubes&#xff09;&#xff0c;即陶瓷气体放电管。GDT是内部由一个或一个以上放电间隙内充有惰性气体构成的密闭器件。GDT电气性能取决于气体种类、气体压力、内部电极结构、制作工艺等因素。GDT可以承受高达数十甚至数百千 安培的浪涌电流冲击&a…

基于T1w/T2w 比值揭示髓磷脂相关变化

前言&#xff1a; 最近在阅读文献的时候发现2篇文章&#xff0c;是采用T1w/T2w 比值表征髓磷脂&#xff0c;有点感兴趣&#xff0c;因此尝试了一下文献所提出的方法。&#xff08;https://www.ncbi.nlm.nih.gov/pmc/articles/PMC9247578/ https://www.ncbi.nlm.nih.gov/pmc/ar…

批量梯度下降、随机梯度下降、小批量梯度下降

一、批量梯度下降&#xff08;Batch Gradient Descent,BGD&#xff09; 在批量梯度下降中&#xff0c;每次迭代都使用整个训练集的数据进行梯度计算和参数更新。也就是说&#xff0c;每次迭代都对所有的样本求取梯度&#xff0c;然后更新参数。由于要处理整个训练集&#xff0c…

2024年【起重机司机(限门式起重机)】考试及起重机司机(限门式起重机)模拟考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 起重机司机(限门式起重机)考试是安全生产模拟考试一点通总题库中生成的一套起重机司机(限门式起重机)模拟考试题&#xff0c;安全生产模拟考试一点通上起重机司机(限门式起重机)作业手机同步练习。2024年【起重机司机…

BigDecimal的常用API

BigDecimal用于解决浮点型运算时结果出现失真的问题。 这里0.20.1等于0.3就出现了失真 import java.math.BigDecimal; import java.math.RoundingMode;public class Test {public static void main(String[] args) {//BigDeciaml的使用&#xff1a;解决小数运算失真的问题doub…

代码随想录算法训练营29期|day50 任务以及具体任务

第九章 动态规划part07 70. 爬楼梯 &#xff08;进阶&#xff09;import java.util.Scanner; class climbStairs{public static void main(String [] args){Scanner sc new Scanner(System.in);int m, n;while (sc.hasNextInt()) {// 从键盘输入参数&#xff0c;中间用空格隔开…

sql语句学习(一)--查询

【有道云笔记】基本sql语句2—查询基础 数据库表结构 DROP TABLE IF EXISTS class; CREATE TABLE class (id int(11) NOT NULL AUTO_INCREMENT,class_num varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 班级号,class_name varchar(255) CHARACTE…