题目:
给你一个整数数组 nums
。如果任一值在数组中出现 至少两次 ,返回 true
;如果数组中每个元素互不相同,返回 false
。
示例 1:
输入:nums = [1,2,3,1] 输出:true
示例 2:
输入:nums = [1,2,3,4] 输出:false
这道题的思路就是先将这个数组里的数进行排序,然后再遍历。
如果直接遍历肯定会超时。
通过代码:
int cmp(const void *a,const void *b){
return *(int *)a-*(int *)b;
}
bool containsDuplicate(int* nums, int numsSize){
qsort(nums,numsSize,sizeof(nums[0]),cmp);
for(int i=0;i<numsSize-1;i++){
if(nums[i]==nums[i+1]){
return true;
}
}
return false;
}
这道题有两种解法:①直接利用快排库函数 ②自己写一个快排算法(不过会超时)。
关于法①:qsort(nums,numsSize,sizeof(nums[0]),cmp);
nums :数组名
numsSize :数组大小,即参与排序的元素个数
sizeof(nums[0]) :单个元素的大小
cmp :函数名,是为指导qsort如何排序专门写的函数,cmp可以自己随便取,cmp这个函数在调用时不需要传递实参,直接调用即可。
这个函数典型定义是:
int cmp(const void *a,const void *b)
return *(int *)a-*(int *)b;//取值的意思
笔记参考(6条消息) 快排函数qsort调用的使用细则_gdliweibing的博客-CSDN博客
关于法②:自己写快排
#include<stdio.h>
void quicksort(int nums[],int L,int R);
int main(){
int nums[]={1,2,3,1};
int numsSize=4;
quicksort(nums,0,numsSize-1);
int i=0;
for(i=0;i<4;i++){
printf("%d ",nums[i]);
}
for(i=0;i<numsSize-1;i++){
if(nums[i]==nums[i+1]){
printf("true");
return 0;
}
}
printf("false");
return 0;
}
void quicksort(int nums[],int L,int R){
//将要进行的排序的数组和这个数组的头和尾传给这个函数
if(L>=R){
return ;
}
int left=L;
int right=R;
//这两步是要让L和R两个变量不变
int pivot=nums[left];
//pivot是我们要拿去比较的数,一般我们会拿最左边的数开始比较,
//依次和left,right所指的数比较
//如果right所指的数比pivot小,那么就将这个right的数,移到left的位置,此事right所指的位置就空了
//如果right所指的数比pivot大或等于,那么就不必移动该数,而right继续向左移
//如果left所指的数比pivot大, 那么就将这个left的数,移到right的位置,此事left所指的位置就空了
// 如果left所指的数比pivot小或等于,那么就不必移动该数,而left继续向右移
//直到left与right相碰,我们就将这个pivot数赋值在这个相遇的地方
//然后再对pivot前面的一堆数和后面的一堆数再进行快排,直到这一堆数只有一个为止
while(left<right){
while(left<right&&nums[right]>=pivot){
right--;
}
nums[left]=nums[right];
while(left<right&&nums[left]<=pivot){
left++;
}
nums[right]=nums[left];
}
nums[left]=pivot;
quicksort(nums,L,right-1);
quicksort(nums,right+1,R);
}