存在重复
给定一个整数数组,判断是否存在重复元素。
如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。
示例 1:
输入: [1,2,3,1] 输出: true
示例 2:
输入: [1,2,3,4] 输出: false
示例 3:
输入: [1,1,1,3,3,4,3,2,4,2] 输出: true
法1:朴素解法1个1个比较
时间复杂度o(n2):n*(n-1)/2
//法1:直接比较,时间复杂度n*(n-1)/2 o(n2)
for(int i=0; i<numsSize;i++)
for(int j=i;j<numsSize;j++)
if(nums[i]==nums[j])
return true;
return false;
法2:先排序,后比较
时间复杂度o(n*log(n)):快速排序算法n*log(n)
1.自己实现快速排序算法
/*自己实现快速排序算法*/
/*法2:先排序,再比较,时间复杂度n*log(n) o(nlog(n))
快速排序算法: o(nlog(n))
*/
int Partition(int *nums,int low, int high){//一份为二,前半部分小于pivotkey,后半部分大于pivotkey
int temp, pivotkey;
pivotkey = nums[low];
temp = pivotkey;
while(low < high){
while(low < high && nums[high] >= pivotkey){
high--;
}
nums[low] = nums[high];
while(low < high && nums[low] <= pivotkey){
low++;
}
nums[high] = nums[low];
}
nums[low] = temp;
return low;
}
void QSort1(int *nums,int low, int high){//快速排序算法,耗时在O(nlogn),还是很严重,还怠于优化
int pivot;
while(low < high){
pivot = Partition(nums,low,high);
QSort1(nums,low,pivot-1);
low = pivot+1;
}
}
bool containsDuplicate(int* nums, int numsSize) {
QSort1(nums,0,numsSize-1);
for(int i=0; i<numsSize-1;i++)
if(nums[i]==nums[i+1])
return true;
return false;
}
2.调用c库函数的qsort算法(起始位置,长度,类型,升降序方法函数)
#include<stdlib.h>
//调用c库的qsort算法
#include<stdlib.h>
/*
int compare(const void * a, const void * b)
{
int *pa = (int*) a;
int *pb = (int*) b;
return (*pa ) > (*pb); //从小到大排序
//return (*pb ) < (*pa); //从大到小排序
}
*/
int compare(const void * a, const void * b)
{
return *(int*)a > *(int*)b; //从小到大排序 正序
//return *(int*)a < *(int*)b; //从大到小排序 逆序
}
bool containsDuplicate(int* nums, int numsSize) {
if(numsSize == 0|| numsSize==1)
return false;
qsort(nums,numsSize,sizeof(int),compare);
for(int i=1; i<numsSize;i++)
if(nums[i]==nums[i-1])
return true;
return false;
}
3.c++实现:调用c++库sort函数(起始位置,起始位置+长度,升降序方法函数)
库:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
using namespace std;
#include<vector> //vector
#include<iostream> //sout sin
#include<algorithm> //sort排序算法
//c++标准库实现
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
//长度:nums.size()
//排序算法:sort(起始地址,终止地址+1,升降序函数) 默认升序
//
if(nums.size()==0||nums.size()==1)
return false;
sort(nums.begin(),nums.end()); //缺省第3个参数 默认升序
//printf("%d\n",nums.size());
for(int i=1; i<nums.size();i++)
{
//printf("%d\n",nums[i]);
if(nums[i]==nums[i-1]) //注意不要超出范围
return true;
}
return false;
}
};
法3:哈希算法(待学习......)
待续...............................................