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

Leetcode——287. 寻找重复数

首先很简单的做法即用哈希表记录数字出现的次数,最后循环哈希表输出value值不为1的key值。

class Solution {
public:int findDuplicate(vector<int>& nums) {unordered_map<int, int> map;for(int x : nums){map[x]++;}for(auto& entry : map){if(entry.second != 1){return entry.first;}}return 0;}
};

接着就是考虑高效算法,这里可以将数组看作一个链表,这个思想确实很巧妙,但也很难考虑到。

当看作是一个链表时,其任务就是找链表的环了。

如果允许修改原数组,即我们可以标记负号表示已经来过。

class Solution {
public:int findDuplicate(vector<int>& nums) {int idx = 0;while(nums[idx] > 0){int old = idx;idx = nums[old];nums[old] = -nums[old];}return idx;}
};

如果不允许修改原数组,则用快慢指针找环即可。

class Solution {
public:int findDuplicate(vector<int>& nums) {int slow = 0;int fast = 0;do{slow = nums[slow];fast = nums[nums[fast]];}while(slow != fast);fast = 0;while (fast != slow) {fast = nums[fast];slow = nums[slow];}return slow;}
};

注意,双指针解法需要从同一位置出发。

当然,此题也可用二分查找求解。

由于我们要找的数范围为[1, n],所以取mid,遍历数组,如果<=mid的数字个数小于count,则说明[1, mid]范围上有数字少了,所以重复数字在[mid, n]区间。

class Solution {
public:int findDuplicate(vector<int>& nums) {int len = nums.size();int left = 0, right = len - 1;while(left < right){int mid = left + ((right - left) >> 1);int count = 0;for(int x : nums){if(x <= mid){count++;}}if(count > mid){right = mid;}else{left = mid + 1;}}return left;}
};

http://www.dtcms.com/a/301225.html

相关文章:

  • SignalR 全解析:核心原理、适用场景与 Vue + .NET Core 实战
  • 工业控制系统安全之 Modbus 协议中间人攻击(MITM)分析与防范
  • 全面理解JVM虚拟机
  • RS485转profinet网关如何让JRT激光测距传感器开启自动模式连续测量模式
  • 淘宝获取店铺订单信息操作指南
  • Python爬虫入门:从零开始抓取网页数据
  • 每日一讲——Podman
  • 分布式事务-MQ事务消息学习与落地方案
  • 前端面试专栏-前沿技术:32.AI辅助开发工具应用
  • 0-1BFS(双端队列,洛谷P4667 [BalticOI 2011] Switch the Lamp On 电路维修 (Day1)题解)
  • 用 Flask 打造宠物店线上平台:从 0 到 1 的全栈开发实践
  • 电商项目_核心业务_数据归档
  • esp32-使用虚拟机开发-部署esp32的linux的环境
  • 如何关闭浏览器的迅雷图标 - 去掉浏览器左下角的迅雷图标 - chrome - 关闭迅雷检测
  • C/C++核心知识点详解
  • 剑指offer——搜索算法:数字序列中某一位的数字
  • Python操作Excel文件完整指南
  • 深度强化学习走向多智能体:从AlphaGo到智能车队
  • AtCoder Beginner Contest 416(A~D)
  • Leetcode 3629. Minimum Jumps to Reach End via Prime Teleportation
  • 由于主库切换归档路径导致的 Oracle DG 无法同步问题的解决过程
  • Java异常处理
  • 使用Python,OpenCV计算跑图的图像彩色度
  • 移植pbrt中的并行化到ray trace in weeks中
  • JVM内存结构
  • 零基础学习性能测试第五章:JVM性能分析与调优-JVM运行时内存区域介绍
  • 企业级数据架构构建之道
  • Unity FXAA
  • SQL注入SQLi-LABS 靶场less21-25详细通关攻略
  • Ubuntu普通用户环境异常问题