【6.4】位运算-判断是否存在重复元素

一、题目

        给定一个整数数组,判断 是否存在重复元素 。如果存在一值在数组中 出现至少两次 ,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。

示例 1:
输入: [ 1 , 2 , 3 , 1 ]
输出: true

示例 2:
输入: [ 1 , 2 , 3 , 4 ]
输出: false

示例 3:
输入: [ 1 , 1 , 1 , 3 , 3 , 4 , 3 , 2 , 4 , 2 ]
输出: true

二、解题思路

        这道题可以采用暴力求解的方法,即使用两个 for 循环进行每两两比较,不过这种方式的复杂度较高,这里就不给出具体代码了。除了暴力求解之外,其实还有一种方式,估计大家都能想到,那就是先对数组进行排序。排序之后,如果存在相同的元素,它们肯定是相邻的,然后我们再对排序后的数组进行前后两两比较即可。

        我们也可以使用 set 集合来解决这个问题。因为 set 集合中不能包含重复元素,如果有重复元素就会将其替换掉。我们把数组中的元素全部添加到集合 set 中,如果 set 的 size 与数组的长度不相等,那就说明存在重复的元素。

        我们主要探讨用位运算来解决此问题。这里要判断数组中是否有重复的数字,而判断是否有重复数字,最容易想到的一种解决方式就是使用位运算。c++中,long 类型在64位系统中占 64 位,每一位可以表示一个数字,所以一个 long 类型可以用来表示 64 个数字。但是要想在32位系统做到代码通用,可以使用64位整数类型表示 64 个数字。

        实现方式比较简单,我们遍历数组中的所有元素,查看对应的位置是否为 1,如果是 1,说明存在重复的元素,我们直接返回 true。否则,把数组中元素对应的位置变为 1。比如数组中有个元素是 3,我们就把上面第 3 个位置变为 1。

        原理比较简单,但数组中元素的值不可能都小于 64,所以我们需要分组。根据数组的范围每 64 分为一组。因为数组中还可能有负数存在,所以我们第一步先找出数组中的最大值和最小值。每个元素的位置需要减去最小值来确定。举个例子,比如数组元素为 [3,-10,65,30],最小值是 -10,那么每个元素的位置就是 [13,0,75,40]。我们可以看到 0、13、40 都是小于 64 的,所以它们在第一组里面,而 75 在第二组里面。我们可以申请一个 uint64_t 类型的数组 bitmap,其中 bitmap [0] 相当于第一组,bitmap [1] 相当于第二组……

三、代码实现

#include <iostream>
#include <vector>
#include <cstdint> // 包含uint64_t类型bool containsDuplicate(const std::vector<int>& nums) {// 找出数组中的最大值和最小值int min = nums[0];int max = min;for (int num : nums) {if (num < min) min = num;if (num > max) max = num;}// 计算数组中最大值和最小值的差值,目的是要确定位图的长度int distant = max - min + 1;int bitmapSize = (distant - 1) / 64 + 1;std::vector<uint64_t> bitmap(bitmapSize, 0);for (int num : nums) {// 根据当前数字到最小数字的长度,定位到当前数字在位图中的位置int tmp = num - min;if ((bitmap[tmp / 64] & (1ULL << (tmp % 64))) != 0)return true;// 如果不存在重复的数字,就把当前这个位置变为1bitmap[tmp / 64] |= 1ULL << (tmp % 64);}return false;
}int main() {std::vector<int> nums = {1, 2, 3, 4, 5, 6, 7, 8, 9, 1};std::cout << "Contains duplicate: " << (containsDuplicate(nums) ? "true" : "false") << std::endl;return 0;
}

        这里需要注意,在进行 1ULL << (tmp % 64)) 运算时,1 后面一定要加上大写的 ULL,表示这是64位的无符号长长整数类型,ULL后缀确保了常量的位宽为64位,不管在多少位系统下。如果不加的话,1 就会被视为 int 类型。当数字比较大的时候,结果就会出现错误。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

PCB打样下单流程

PCB打样下单流程 一、PCB打样在线下单流程1&#xff0e;平台登录2&#xff0e;PCB打样领券3&#xff0e;进入下单系统4&#xff0e;上传PCB文件5&#xff0e;PCB订单界面 PCB&#xff08;印刷电路板&#xff09;打样是验证设计、优化性能和推进项目进度的关键环节。随着互联网的…

Python爬虫知识体系-----正则表达式-----持续更新

数据科学、数据分析、人工智能必备知识汇总-----Python爬虫-----持续更新&#xff1a;https://blog.csdn.net/grd_java/article/details/140574349 文章目录 一、正则基础1. 为什么使用正则2. 正则与re模块简介 二、正则表达式1. 匹配单个字符与数字2. 限定符3. 定位符4. 选择匹…

yolo标签自动标注(使用python和yolo方法)

yolo代码自动标注 1.引言1.初阶“自动标注”&#xff0c;给每个图像都生成一个固定的标注文件&#xff0c;进而在labglimg中对矩形框进行微调&#xff0c;减少标注的工作量2.高阶自动标注&#xff0c;利用我们训练好的&#xff08;但是没有特别精准的&#xff09;yolo文件先对每…

在 WPF 中,如何使用命令来替代事件处理?

在 WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;命令是一种非常强大的替代传统事件处理的方法&#xff0c;特别适用于 MVVM&#xff08;Model-View-ViewModel&#xff09;架构。命令可以实现界面&#xff08;View&#xff09;和逻辑&#xff08;…

语音 AI 革命:未来,消费者更可能倾向于与 AI 沟通,而非人工客服

「未来&#xff0c;消费者更可能倾向于与 AI 沟通&#xff0c;而非人工客服&#xff0c;因为这将成为解决问题的最高效途径。」 这篇来自 Bessemer Venture Partners 的报告&#xff0c;是目前为止对语音 AI 在企业应用上最完整清晰的一次梳理。 核心要点&#xff1a; 尽管市…

过去几年电子学习的趋势

近年来&#xff0c;在技术和不断变化的学习者期望的推动下&#xff0c;电子学习已经发展成为一种适应性强、沉浸式和社会化的教育形式。个性化已成为最具影响力的趋势之一&#xff0c;Coursera和LinkedIn Learning等平台为个人量身定制内容。这些平台使用人工智能来建议课程、跟…

Java基础-Java多线程机制

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 一、引言 二、多线程的基本概念 1. 线程与进程 2. 多线程与并发 3. 多线程的优势 三、Java多线程的实…

springboot 之 整合springdoc2.6 (swagger 3)

版本 springboot 3.3.5 jdk 17 springdoc 2.6.0 依赖pom <dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.6.0</version> </dependency>注解对比…

Zabbix部署

1.集群规划 进程虚拟机节点1虚拟机节点2虚拟机节点3zabbix-agent√√√zabbix-server√PostgreSQL√zabbix-web√ 2.准备工作 默认在虚拟机节点2安装kafka、在虚拟机节点3安装redis 2.1关闭3台节点防火墙 sudo systemctl stop firewalld.service sudo systemctl disable fi…

如何优化锚文本来提升关键词排名?

锚文本在SEO中是个小细节&#xff0c;但作用可不小。它不仅能影响外链的质量&#xff0c;还直接影响你的目标关键词排名。你要知道&#xff0c;锚文本并不是随便加上就行&#xff0c;它得讲究技巧和策略。 锚文本的关键词选择一定要精准&#xff0c;且与页面内容高度相关。比如…

java项目-jenkins任务的创建和执行

参考内容: jenkins的安装部署以及全局配置 1.编译任务的general 2.源码管理 3.构建里编译打包然后copy复制jar包到运行服务器的路径 4.部署任务&#xff0c;执行部署脚本

怎么能够制作活码的二维码?在线生成活码的简单技巧

活码是现在很常用的一种二维码类型&#xff0c;可以用来展示日常生活中的视频、音频、图片、文件等多种类型的内容&#xff0c;有效提高内容分享的效率&#xff0c;可以让更多人同时扫码获取内容。使用二维码来展示内容&#xff0c;用户也不需要下载或者保存内容&#xff0c;扫…

谷歌SEO为什么是一场持久战?

很多人在刚开始做SEO时&#xff0c;都会满怀期待&#xff0c;希望能在短时间内看到显著的效果。但很快&#xff0c;他们就会发现&#xff0c;这是一场需要耐心的持久战。谷歌的算法非常复杂&#xff0c;每天都在调整优化&#xff0c;你今天做的改动&#xff0c;可能要几个月后才…

6TS Series TVS 的 解析

6TS Series 600W Transient Voltage Suppresso指的是一系列高性能的瞬态电压抑制二极管&#xff08;Transient Voltage Suppressor&#xff0c;TVS&#xff09;&#xff0c;这些二极管由时源芯微科技&#xff08;TimeSource&#xff09;设计用于保护敏感的电子设备免受雷击、电…

AI绘图最强软件stable diffusion,一文带你迅速了解!

有需要stable diffusion整合包可以扫描下方&#xff0c;免费获取 01 — 什么是 SD ​ Stable Difusion(简称 SD) 其三种概念。 1.用来指代稳定扩散(Stable Diffusion) 技术,如 Midjourney是基于Stable Difusion技术实现的就是指它运用了 Stable Diffusion 的技术原理。 …

Leecode热题100-35.搜索插入位置

给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2示例 2: 输入:…

解决Ultralytics的自定义YOLO模型单GPU可以训练多GPU训练却报错subprocess.CalledProcessError的问题

解决步骤 一、报错详情二、解决思路1. 创建.sh运行文件2. YOLO训练脚本文件3. 终端命令4. 成功运行 一、报错详情 subprocess.CalledProcessError: Command [/home/xxx/anaconda3/envs/openmmlab/bin/python, -m, torch.distributed.run, --nproc_per_node, 3, --master_port,…

Linux探秘坊-------1.系统核心的低语:基础指令的奥秘解析(1)

1.Linux的背景介绍 Linux 操作系统的发展历程充满了激情与创新喵&#xff5e;&#x1f380; 萌芽期 (1983 - 1991)&#xff1a;Linux 的历史可追溯到 1983 年&#xff0c;理查德斯托曼 (Richard Stallman) 发起 GNU 计划&#xff0c;目标是创建一个自由软件操作系统。1987 年发…

三款良心实用的桌面待办提醒软件 让工作效率Up提升!

互联网科技的迅速发展&#xff0c;让大家的工作方式也发生了巨大的变化&#xff0c;过去传统的办公方式已然不能适应当下节奏快速发展的时代。在如今工作快节奏的催促下&#xff0c;我们如何才能从琐碎、复杂的工作任务重&#xff0c;找到一条清晰的工作节奏成为效率工作up提升…

热点更新场景,OceanBase如何实现性能优化

案例背景 这个案例来自一个保险行业的客户&#xff1a;他们的核心系统底层采用了OceanBase数据库作为存储解决方案&#xff0c;然而&#xff0c;在系统上线运行后&#xff0c;出现了一个异常情况&#xff0c;执行简单的主键更新语句时SQL执行时间出现了显著的波动。为了迅速定…