博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数组中重复的数字
阅读量:5308 次
发布时间:2019-06-14

本文共 2418 字,大约阅读时间需要 8 分钟。

题目描述

在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。

第一次刷牛客,发现这个评测系统如果if后面不跟else就会编译错误error: control may reach end of non-void function [-Werror,-Wreturn-type],挺奇葩的。。

这题的数据出的太简单了,建个1000的哈希表就过了,时间复杂度O(n),空间复杂度O(n),那如果数据很大呢?超过了栈空间又会怎么办?

最后看了《剑指offer》的解法时间复杂度O(n),空间复杂度O(1)才恍然大悟。

我AC的代码:

class Solution {public:    // Parameters:    //        numbers:     an array of integers    //        length:      the length of array numbers    //        duplication: (Output) the duplicated number in the array number    // Return value:       true if the input is valid, and there are some duplications in the array number    //                     otherwise false    bool duplicate(int numbers[], int length, int* duplication) {        if(numbers == nullptr || length <= 0) return false;        for(int i = 0;i < length; i++){            if(numbers[i] < 0 || numbers[i] > length - 1)                return false;        }        int hashtable[1000]={0}, i;        for(i=0;i
1) { *duplication = i; return true; } } return false; }};

剑指offer官方解法:

思路:从头到尾依次扫描这个数组中的每个数字,当扫描到下标为i的数字时,首先比较这个数字(用m表示)是否等于i,如果是,则接着扫描下一个数字;如果不是,则再拿它和第m个数字进行比较。如果它和第m个数字相等说明它就是第一个重复的数字,如果不相等则把第i个数字和第m个数字交换,把m放回原来的位置。

class Solution {public:    // Parameters:    //        numbers:     an array of integers    //        length:      the length of array numbers    //        duplication: (Output) the duplicated number in the array number    // Return value:       true if the input is valid, and there are some duplications in the array number    //                     otherwise false    bool duplicate(int numbers[], int length, int* duplication) {        if(numbers == nullptr || length <= 0) return false;        for(int i = 0;i < length; i++){            if(numbers[i] < 0 || numbers[i] > length - 1)                return false;        }        for(int i = 0;i < length; i++){            while(numbers[i] != i){                if(numbers[i] == numbers[numbers[i]]){                    *duplication = numbers[i];                    return true;                }                int temp = numbers[i];                numbers[i] = numbers[temp];                numbers[temp] = temp;            }        }        return false;    }};

转载于:https://www.cnblogs.com/Mered1th/p/10705035.html

你可能感兴趣的文章
【题解】 bzoj1597: [Usaco2008 Mar]土地购买 (动态规划+斜率优化)
查看>>
css文本溢出显示省略号
查看>>
SQL_Server_2008完全学习之第十章触发器
查看>>
git安装和简单配置
查看>>
django 实现websocket
查看>>
C# FTP远程服务器返回错误:(550) 文件不可用(例如,未找到文件,无法访问文件)...
查看>>
面向对象:反射,双下方法
查看>>
利用matplotlib绘画出二特征的散点图
查看>>
RabiitMq
查看>>
WebForm 发送邮箱
查看>>
鼠标悬停提示文本消息最简单的做法
查看>>
# C++中对PI的引用
查看>>
C# Optimization
查看>>
让你的linux操作系统更加安全【转】
查看>>
Java面向对象重要关键字
查看>>
PIL写入字体出现“ImportError: The _imagingft C module is not installed”的解决方法
查看>>
算出两个文件的相对路径
查看>>
lazyload
查看>>
微信小程序音频背景播放
查看>>
PHP 运算符
查看>>