每日一题--寻找重复数

news2024/11/26 2:48:22

蝶恋花-王国维

阅尽天涯离别苦,

不道归来,零落花如许。

花底相看无一语,绿窗春与天俱莫。
待把相思灯下诉,

一缕新欢,旧恨千千缕。

最是人间留不住,朱颜辞镜花辞树。

目录

题目描述:

思路分析: 

方法及时间复杂度:

法一 排序数组(暴力解法):

法二 哈希表

法三 二分查找(经典解法)

法四 快慢指针

法五 二进制(烧脑解法)

个人总结: 


 题目描述:

 287. 寻找重复数 - 力扣(LeetCode)

思路分析: 

在一个数组中查找唯一重复的元素,可以用很多解法,立马想到的便是哈希表。将数组元素插入哈希表,然后查找哈希表,找到了就返回该数

 方法及时间复杂度:

法一 排序数组(暴力解法):

将数组进行排序,这样重复的元素一定相邻,然后遍历排序后的数组就行。代码如下:

 

int cmp(const void*a,const void*b){
    return *(int*)a-*(int*)b;
}
int findDuplicate(int* nums, int numsSize) {
    qsort(nums,numsSize,sizeof(int),cmp);
    for(int i=1;i<numsSize;++i){
        if(nums[i]==nums[i-1]){
            return nums[i];
        }
    }
    return -1;
}

时间复杂度O(nlogn) 排序的时间nlogn

空间复杂度O(1) 

法二 哈希表

利用哈希表查找哈希表中存在的元素,即数组重复的元素。可以使用c++容器的哈希集合unordered_set,这里用c语言数组模拟了一个哈希表。代码如下:

int findDuplicate(int* nums, int numsSize) {
    int hash[100001]={0};//初始化哈希表所有元素为0
    for(int i=0;i<numsSize;++i){
        if(hash[nums[i]]){//查找哈希表中是否存在该元素
            return nums[i];
        }
        hash[nums[i]]++;
    }
    return -1;    
}

时间复杂度O(n) 

空间复杂度O(n) 空间换时间了属于是

法三 二分查找(经典解法)

用此方法前先弄清楚什么是鸽巢原理。

鸽巢原理:也称为抽屉原理,是一个基本的数学原理,这个原理的经典解释是,就像将若干只鸽子放在若干个鸽巢中一样,如果鸽子的数量大于鸽巢的数量,那么至少有一个鸽巢中放了两只鸽子。

这里抽象成二分查找那个装有两只鸽子的鸽巢

 二分查找的区间很明显就是【1,n-1】,n为数组长度。查找中点mid(先猜一个鸽巢),遍历数组并记录<=mid的数,如果<=mid的数大于mid说明这个有着两只鸽子的鸽巢在左区间,反之,如果<=mid的数小于等于mid,就在右区间。直到left==right时,这个鸽巢就是有着两只鸽子的鸽巢。

代码如下:

int findDuplicate(int* nums, int numsSize) {
    int left=1,right=numsSize-1;
    while(left<right){
        int mid=(left+right)>>1;
        int cnt=0;
        for(int i=0;i<numsSize;++i){
            if(nums[i]<=mid){
                cnt++;
            }
        }
        if(cnt>mid){
            right=mid;
        }else{
            left=mid+1;
        }
    }
    return left;
}

时间复杂度O(nlogn) 二分查找时间复杂度 logn,然后每次查找都要遍历数组O(n)

空间复杂度O(1) 

法四 快慢指针

下标向值引一条边,值向下标引一条边,从0开始沿着箭头走,逐渐就会进入一个环,环的入口就是重复的元素

类似于环形链表,定义快指针fast,慢指针slow。慢指针每次走一步,快指针每次走两步,快指针会在环里追上慢指针,然后让快指针从0开始走,快慢指针同时走一步,相逢时就是环的入口,即重复元素。

代码如下:

int findDuplicate(int* nums, int numsSize) {
    int slow=0,fast=0;
    do{
        slow=nums[slow];
        fast=nums[nums[fast]];
    }while(slow!=fast);
    fast=0;
    while(slow!=fast){
        slow=nums[slow];
        fast=nums[fast];
    }
    return slow;
}

时间复杂度O(n) 

空间复杂度O(1)

法五 二进制(烧脑解法)

可以使用二进制位运算来解决此题。我们可以将数组 nums 中的每一个数字用二进制来表示,最多只需要 log(n) 位,其中 n 是数组 nums 的长度。

对于每一位 i,我们可以计算在此位上所有数字出现的次数之和。如果某一位上的出现次数之和大于 2,说明出现了重复的数字。

具体做法如下:

  1. 对于二进制的第 i 位,计算所有数字的二进制表示中第 i 位上出现 1 的次数之和(可以使用位运算和移位操作进行统计)。
  2. 如果第 i 位上出现 1 的次数之和大于 2,说明重复数字在此位上的值为 1,否则为 0。
  3. 将所有位上确定的二进制位还原成对应的十进制数字,即为重复的数字。

代码如下:

int findDuplicate(int* nums, int n) {
        int  ans = 0;
        // 确定二进制下最高位是多少
        int bit_max = 31;
        while (!((n - 1) >> bit_max)) {
            bit_max -= 1;
        }
        for (int bit = 0; bit <= bit_max; ++bit) {
            int x = 0, y = 0;
            for (int i = 0; i < n; ++i) {
                if (nums[i] & (1 << bit)) {
                    x += 1;
                }
                if (i >= 1 && (i & (1 << bit))) {
                    y += 1;
                }
            }
            if (x > y) {
                ans |= 1 << bit;
            }
        }
        return ans;
}

时间复杂度O(nlogn)  枚举二进制数的位数个数O(logn)

空间复杂度O(1)

个人总结: 

二分查找的算法其实还可以优化。 有位大师曾经说过,完成比完美更重要。

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

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

相关文章

SpringCloud-高级篇(五)

一&#xff1a;分布式事务理论基础 原子性&#xff08;Atomicity&#xff09; 原子性是指事务是一个不可分割的工作单位&#xff0c;事务中的操作要么都发生&#xff0c;要么都不发生。 一致性&#xff08;Consistency&#xff09; 事务前后数据的完整性必须保持一致。 隔离性&…

生物神经系统的基本原理 神经元Neuron

生物神经系统的基本原理涉及一系列复杂的生物学和生理学机制&#xff0c;主要可以分为以下几个方面&#xff1a; 神经元与突触&#xff1a;神经系统的基本单位是神经元&#xff0c;它们通过突触连接彼此。神经元接收并处理来自身体其他部分或环境的信息&#xff0c;然后通过电信…

起猛了!自动驾驶可以聊天了

公众号&#xff1a;算法一只狗 一直以来&#xff0c;深度学习模型对于研究者来说是一种“黑盒”模型&#xff0c;我们一般很难分析模型的到底学习到了什么东西&#xff0c;只知道它能够应用于特定的领域。 对比于自动驾驶领域来看&#xff0c;一个黑盒状态的模型&#xff0c;是…

ES 8.x开始(docker-compose安装、kibana使用、java操作)

学习文档地址 一、Docker安装 这里使用docker-compose来安装&#xff0c;方便后续迁移&#xff0c;Elasticserach和kibina一起安装。 1、创建安装目录 configdataplugins 2、配置文件 配置文件有两个&#xff0c;一个是ES的配置文件&#xff0c;一个docker-compose的配置文件 …

Java自定义一个线程池

线程池图解 线程池与主线程之间通过一个阻塞队列来平衡任务分配&#xff0c;阻塞队列中既可以满足线程等待&#xff0c;又要接收主线程的任务。 线程池实现 使用一个双向链表实现任务队列 创建任务队列 //阻塞队列 public class BlockingQueue<T> {//双线链表private …

【一周AI简讯】OpenAI奥特曼王者归来,马斯克AI模型Grok下周开放测试,ChatGPT语音对话功能向所有用户免费开放

OpenAI奥特曼王者归来&#xff0c;董事会改组 终于&#xff0c;经历大约5天的极限拉扯&#xff0c;年底AI界吃瓜大戏落下帷幕&#xff0c;奥特曼确认回归。 ChatGPT语音对话功能向所有用户免费开放 ChatGPT 语音输入最初于 9 月份推出&#xff0c;标题是“ChatGPT 现在可以看…

[Spring ~必知必会] Bean 基础常识汇总

文章目录 Bean 相关到底什么是beanFactorybeanFactory能干啥ApplicationContext是什么ApplicationContext的功能比 BeanFactory多了什么 容器的实现BeanFactory的实现ApplicationContext的实现xml 配置配置类配置 Bean 的生命周期3.1 Bean 的常见的后处理器测试代码总结 3.2 工…

【中间件】配置中心中间件intro

中间件middleware 内容管理 why use 配置中心配置中心feature配置中心develop主流配置中心Apollo浅谈 本文从理论上介绍一下服务化中服务治理系统中的配置中心的理论并浅析Apllo 配置在生产中是很关键的一个部分&#xff0c;cfeng在work中遇到几次配置问题引发的问题&#xff0…

为何要隐藏IP地址?网络上哪些行为需要隐藏IP和更换IP?

网络已经成为现代人生活的重要组成部分&#xff0c;人们在网络上交流、学习、娱乐、购物等。但是&#xff0c;在享受网络带来的便利时&#xff0c;我们也需要时刻保护自己的隐私和安全。其中&#xff0c;IP地址作为网络通信中的重要标识&#xff0c;如何隐藏以及在哪些情况下需…

电商数据采集中如何采集1688平台商品详情SKU数据

一、背景介绍 1688.com是阿里旗下国内最大的B2B批发采购平台&#xff0c;1688分销客是依托此平台的官方营销平台&#xff0c;通过此平台API接口的接入推广平台商家的商品&#xff0c;按照商品成交金额的一定比例获得佣金。可以调用1688平台上的商品详情&#xff0c;SKU数据&…

西南科技大学电路分析基础实验A1(一阶电路的设计)

目录 一、实验目的 二、实验设备 三、预习内容(如:基本原理、电路图、计算值等) 四、实验数据及结果分析(预习写必要实验步骤和表格) 1. 观测一阶电

万字解析设计模式之观察者模式、中介者模式、访问者模式

一、观察者模式 1.1概述 观察者模式是一种行为型设计模式&#xff0c;它允许一个对象&#xff08;称为主题或可观察者&#xff09;在其状态发生改变时&#xff0c;通知它的所有依赖对象&#xff08;称为观察者&#xff09;并自动更新它们。这种模式提供了一种松耦合的方式&…

什么是高性能计算岗位

最近有小伙伴咨询什么是高性能计算岗位。 1、什么是高性能计算 高性能计算&#xff0c;在很多招聘信息中也会被标注为 HPC&#xff0c;是 High Performance Computing 的缩写。 目前很多 AI 公司或者从事 AI 的部门招聘都有这个岗位需求&#xff0c;我从某聘上截取了几个有代…

VBA高级应用30例:Ribbon(功能区)的介绍

《VBA高级应用30例》&#xff08;版权10178985&#xff09;&#xff0c;是我推出的第十套教程&#xff0c;教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开&#xff0c;这套教程案例与理论结合&#xff0c;紧贴“实战”&#xff0c;并做“战术总结”&#xff0c;以…

【Proteus仿真】【STM32单片机】感应水龙头设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器&#xff0c;使用LCD1602液晶模块、HCSR04超声波等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示超声波模块检测的距离&#xff0c;若检测距离小…

二十九、微服务案例完善(数据聚合、自动补全、数据同步)

目录 一、定义 二、分类 1、桶(Bucket)聚合: 2、度量(Metric&#xff09;聚合: 3、管道聚合&#xff08;Pipeline Aggregation&#xff09;&#xff1a; 4、注意&#xff1a; 参与聚合的字段类型必须是: 三、使用DSL实现聚合 聚合所必须的三要素&#xff1a; 聚合可配…

数字系列——数字经济

数字经济是全球经济未来发展方向&#xff0c;正在成为重组全球要素资源、重塑全球经济结构、改变全球竞争格局的关键力量。都知道数字经确实很重要&#xff0c;但有些人还傻傻搞不懂数字经济到底是什么&#xff1f;小编今天就给大家捋一捋。 什么是数字经济&#xff1f; 数字经…

tabs切换,组件库framework7

IOS和安卓兼容的背景下&#xff0c; 可以使用&#xff1a;framework7.io文档 效果展示&#xff1a; 代码&#xff1a; <!-- Top Tabs --> <div class"tabs tabs-top"><div class"tab tab1 active">...</div><div class"…

高级/进阶”算法和数据结构书籍推荐

“高级/进阶”算法和数据结构书籍推荐《高级算法和数据结构》 高级算法和数据结构 为什么要选择本书 谈及为什么需要花时间学算法&#xff0c;我至少可以列举出三个很好的理由。 (1)性能&#xff1a;选择正确的算法可以显著提升应用程序的速度。仅就搜索来说&#xff0c;用二…

jQuery_07 函数的使用

在jQuery中&#xff0c;如何使用函数呢&#xff1f; 1.基本函数 函数(常用的) 其实有很多函数&#xff0c;但是我们只需要掌握常用的函数即可 1.val 操作dom对象的value val() 没有参数 获取dom数组中第一个dom对象的value值 val(value) 有参数 设置dom数组中所有dom对象的…