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

【leetcode】寻找重复数

题目链接:寻找重复数icon-default.png?t=N176https://leetcode.cn/problems/find-the-duplicate-number/

方法一:快慢指针

因为只有一个数字是重复的,且一个数字正好对应一个唯一的下标,所以可以将数组抽象为一个链表,假定数组为{1,2,3,4,5,6,3} --> {1,2,3,4,5,6},{3,4,5,6},{3,4,5,6}...

 

slow一次走一步,fast一次走两步,那么当slow与fast相遇的时候,必定是在环内的某一个位置,假设slow走了n步,fast就走了2n步。假设数组首部到环入口的距离为m,那么slow在环内走了n-m的长度, fast走了2n-m个长度,

则有 2n-m = k(n-m) (k != 0)

不妨设 n - m = c 则可知 n%c == 0

现在slow走了n-m步,让slow再走m步就会到达环的入口(n%c == 0),而m正是起点到环入口的距离。

代码

class Solution {
public:int findDuplicate(vector<int>& nums) {//快慢指针//当出现相同的数字时,会形成类似于链表中的环。int fast = 0,slow = 0;while(true){fast = nums[nums[fast]];//fast一次走两步slow = nums[slow];//slow一次走一步if(fast == slow)//两个节点下相遇,必定是在环内部。break;}//当finder == slow时就是环的入口//为什么finder和slow相遇的时候,就是入口?/*假定slow 和 fast 相遇时,fast走了2n步,slow走了n步 环长度为c 起点至环入口就是m则有n%c == 0  n - m 为slow走的距离,当slow再走一个m时,就到环的入口,而m正是起点到环入口的距离*/int finder = 0;while(true){finder = nums[finder];slow = nums[slow];if(slow == finder) break;}return slow;}
};

方法二:二分查找

假定数组q[] = {1,2,3,4,4} q.size() = 5  区间[1,4]

小于等于 1 的数字个数为 1 (1)
小于等于 2 的数字个数为 2 (1、2)
小于等于 3 的数字个数为 4 (1、2 、3)
小于等于 4 的数字个数为 4 (1、2、3、4、4)

可以看到左边的数集合严格小于自身,右边的数集合严格大于自身。当集合中的个数cnt > 指定的数字时,就会出现重复数字。

二分的思想时,当出现一个条件可以使得左半边的数字严格与右半边的数字出现分割就行。

class Solution {
public:int findDuplicate(vector<int>& nums) {int l = 0,r = nums.size()-1;while(l < r){int mid = l + r >> 1;int cnt = 0;for(int i = 0;i < nums.size();i++){if(nums[i] <= mid){cnt++;}}//当出现从cnt > mid 就说明mid的左半部分出现了重复的数字,使得计数大于mid//重复的数字在[l,mid]if(cnt > mid) r = mid;else l = mid + 1;}return l;}
};

http://www.lryc.cn/news/24538.html

相关文章:

  • LeetCode 1247. Minimum Swaps to Make Strings Equal【数学,贪心,字符串】
  • pid控制加热算法,附代码仓库
  • 一文看懂预训练和自训练模型
  • (五十四)大白话索引的页存储物理结构,是如何用B+树来实现的?.md
  • 前端Vue代码风格指南
  • 「TCG 规范解读」基础设施架构和协议 (2)
  • NodeJs 中的 HTML 模板
  • 3.ffmpeg命令行环境搭建、ffmpeg命令行初步了解
  • Kubernetes初始化容器
  • leetcode: Swapping Nodes in a Linked List
  • Nydus 在约苗平台的容器镜像加速实践
  • 企业对不同形态CRM系统价格需求不同
  • 「JVM 高效并发」线程安全
  • 微信扫码登录
  • Unity协程的简单应用
  • LeetCode 1250. Check If It Is a Good Array【数论】
  • ETHDenver 2023
  • React架构演变
  • 安全认证--JWT介绍及使用
  • 【计算机组成原理】计算机硬件的基础组成、认识各个硬件部件
  • 使用ChIPSeeker进行ChIP-seq, ATAC-seq,cuttag等富集峰的基因组注释
  • 第九届蓝桥杯省赛——7缩位求和
  • 【c++】STL常用容器5—list容器
  • 【牛客刷题专栏】0x0D:JZ5 替换空格(C语言编程题)
  • 聚观早报 | 苹果2024年放弃高通;腾讯回应进军类 ChatGPT
  • Elasticsearch:如何正确处理 Elasticsearch 摄取管道故障
  • 指标体系—北极星指标体系
  • 【操作系统】内存管理
  • 家庭消耗品跟踪管理软件HomeLists
  • django模型简要(1)