在一个长度为n的数组里的所有数字都在0到n-1的范围内。
数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。
例如,如果输入长度为7的数组[2,3,1,0,2,5,3],那么对应的输出是2或者3。存在不合法的输入的话输出-1
数据范围:0<=n<=10000 进阶:时间复杂度O(n),空间复杂度O(n)
示例:
输入:[2,3,1,0,2,5,3]
返回值:2
说明:2或3都是对的
题解一:
复杂度分析:
时间复杂度:O(n^2),两层循环
空间复杂度:O(1)
代码如下:
class Solution {
public:
int duplicate(vector& numbers) {
// write code here
for(int i=0;i
运行超时
题解二:排序+遍历(条件:允许修改原数组)
解题思路:
1、对数组进行排序(系统函数:sort()),此步骤时间复杂度O(nlog(n));
(手写堆排序:这个之后学)
2、遍历数组,查看相邻元素是否有相等的,有直接返回结果,此步骤时间复杂度O(n);
复杂度分析:
时间复杂度:O(nlog(n)),上面已经分析出时间复杂度
空间复杂度:O(1)
class Solution {
public:
int duplicate(vector& numbers) {
// write code here
sort(numbers.begin(),numbers.end());
for(int i=0;i
Sort语法
Sort(start,end,cmp)
(1)start表示要排序数组的起始地址;
(2)end表示数组结束地址的下一位;
(3)cmp用于规定排序的方法,可不填,默认升序。
sort函数没有第三个参数,实现的是从小到大(升序)排列
如何实现从大到小的排序?
这就如前文所说需要在sort()函数里的第三个参数了,告诉程序要从大到小排序。
需要加入一个比较函数compare(),此函数的实现过程如下:
bool compare(int a,int b)
{
return a>b;
}
这就是告诉程序要实现从大到小的排序的方法
#include
#include
using namespace std;
bool compare(int a,int b)
{
return a>b;
}
int main()
{
int a[10]={9,6,3,8,5,2,7,4,1,0};
for(int i=0;i<10;i++)
cout<
假设自己定义了一个结构体node
struct node
{
int a;
int b;
double c;
}
有一个node类型的数组node arr[100],想对它进行排序:先按a值升序排列,如果a值相同,再按b值降序排列,如果b还相同,就按c降序排列。就可以写一个比较函数:
以下是代码片段:
bool cmp(node x,node y)
{
if(x.a!=y.a) return x.ay.b;
return x.c>y.c;
}
内容参考链接



