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

力扣【二分查找】:287. 寻找重复数

  1. 题目描述:

给定一个包含 n + 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。

假设 nums 只有 一个重复的整数 ,返回 这个重复的数 。

你设计的解决方案必须 不修改 数组 nums 且只用常量级 O(1) 的额外空间。

  1. 算法思路:

证明一定存在重复元素:

令集合A = {1,2,3,4,...,n}, B = {bi| 1 <= i <= n + 1},有|A| = n,|B| = n + 1,

将n个数字放入到n + 1个成员的数组可以形式化为函数,f: B -> A,即f(bi) ∈ A,

首先假设映射f是单射,即∀bi, bj∈B, bi ≠ bj ⟹ f(bi) ≠ f(bj),

即f将B的n + 1个元素映射到A的n + 1个不同的元素上,即f(B) ⊆ A,|f(B)| <= |A|,

又因为|f(B)| = n + 1,|A| = n,有n + 1 <= n矛盾,所以映射f不是单射而是多射,

即一定存在重复元素。

首先思考在不使用常量级额外空间的情况下如何做,显然能想到的第一种方式就是设定一个长度为n的数组cnt,用下标对应1 ~ n的数字,

遍历数组nums,如果nums[i] == j其中i是遍历的下标,j是nums的元素值并且是辅助数组的对应下标 + 1,这样只需要遍历nums一次,记录每个元素的出现次数然后找出大于1的即可,

但题目要求常量空间复杂度,又因为重复数x一定有1 <= x <= n具有有序性,所以可以考虑用二分查找解决问题,难点在于二分逻辑,

假设重复数x,数组中的数要么大于x,要么小于等于x,这里统计小于等于x的元素个数用辅助数组cnt记录,

由于题目规定只有一个重复数,假设重复数x只有两个,另一个占据第n + 1个位置,

那么此时nums中小于等于x的元素个数应该等于x + 1,那么对于之后所有大于x的元素,假设是y而言,小于等于它们的元素个数也就应该是y + 1即cnt[y] > y,

而对于小于x的元素,假设是z,则cnt[z] <= z,

所以对一个数x,如果x > cnt[x],则x可能是重复数,如果x <= cnt[x],则x一定不是重复数,这样就得到了二分的逻辑,

如果重复数x的个数超过2,则必然有至少一个数被x替代,假设这个数i < x,对于[i, x - 1]的cnt都减1,依然满足cnt[z] <= z,

如果这个数i > x,对[x + 1, i]的cnt都加1,依然满足cnt[y] > y,

为满足限制额外空间为常量级,可以每次循环记录小于等于数值的元素的个数,这样相当于在二分查找中加入了一次O(n)的遍历,

时间复杂度变为O(n log(n))

  1. 代码:

时间复杂度:O(n log(n))

int findDuplicate(vector<int>& nums) {int lower_bound = 1, upper_bound = nums.size() - 1;while (lower_bound < upper_bound) {int mid = lower_bound + (upper_bound - lower_bound) / 2;int lower_equal_count = 0;for (const int &n : nums) {if (n <= mid) {++lower_equal_count;}}if (lower_equal_count > mid) {upper_bound = mid;} else {lower_bound = mid + 1;}}return lower_bound;}
http://www.jsqmd.com/news/1385663/

相关文章:

  • 突破性Jupyter扩展Mito:从Excel到Python的无缝转换革命
  • 2026无刷电机定制开发公司实地走访实录,消费电子配套选型参考 - 可特新
  • 把喜欢的角色请进桌面:DyberPet 桌宠框架上手与模组开发指南
  • 2026 年昆明文旅门店 AI 大模型平台收录品牌形象搭建方案 - 中国华商产业观察网
  • 如何在Zotero中一键发现和安装最佳插件:终极插件市场指南
  • Flux1-dev FP8版本怎么用?低显存跑AI绘画的7步实战攻略
  • 厦门GEO代运营哪家好?2026年厦门GEO服务商实测对比与选型参考 - 轻松带微笑
  • 2026 广西公园游船销售共享扫码代步车选购答疑 - LYL仔仔
  • 2026上海老年公寓综合实力测评:5家**机构全维度对比,适配不同养老需求 - 互联网科技品牌测评
  • ComfyUI与OpenClaw集成:7大核心难题与自动化工作流实战
  • podcast-maker部署指南:如何在服务器端运行自动化视频生成任务
  • Design Token 落地:先统一语义,再谈 Figma to Code
  • Python自动化控制ITECH电源:SCPI指令与硬件测试实践
  • S32K144 UART通信实战:从硬件配置到应用层协议设计
  • 如何用WVP-GB28181-Pro免费搭建国标视频监控平台:3个常见难题与完整实战指南
  • 2026年8月马鞍山漏水维修攻略!梅雨季残留潮湿和汛期多雨,房屋修缮解决沉降发霉渗水难题 - 聪居到家
  • OpCore-Simplify 快速上手:30 分钟自动生成黑苹果 OpenCore EFI 的完整指南
  • 2026年沈阳房屋安全鉴定行业梳理 三昌建设辽宁分公司等合规机构盘点 - 小范同学a
  • 达梦数据库从零安装指南:Linux环境部署与国产化替代实践
  • AWS IAM权限提升漏洞深度解析与防御实战指南
  • 医院处方NAATI翻译认证要怎么做?一文讲清涉外办理要点! - 指上通
  • 智能体运行时核心机制:循环、路由与上下文的设计与实践
  • 3 分钟上手 Win11Debloat:这款 Windows 系统优化工具,把预装应用和广告一次清干净
  • 2026 年青岛液化气、植物油配送常见问题,商户一站式解答 - LYL仔仔
  • 2026年苏州离婚律师推荐动态 季泽玉律师代理典型案例引关注 - 互联网科技品牌测评
  • 免费开源的 Win11Debloat 终极指南:一次清除 140+ 预装应用、禁用追踪与广告,3 步完成系统瘦身
  • 立体仓库厂家推荐:华工赛百,一站式智能立体仓库解决方案服务商
  • 2026 大庆企业并购、破产清算非诉法律服务,靠谱律所选购指南 - 滚动商讯
  • 如何用Sunshine打造个人游戏串流服务器:3步实现全平台畅玩
  • 南昌髌骨骨折术后疼痛法律代理律所:髌骨术后痛代理索赔全攻略 - 律师律所推荐