存在重复
给定一个整数数组,判断是否存在重复元素。
如果任何值在数组中出现至少两次,函数返回 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:哈希算法(待学习......)
待续...............................................