求数组中的相同元素,这是力扣上的一道题,很容易想到的方法就是,将数组进行排序,然后利用双指针法分别指向两个数组,在两个指针都不到达数组结尾的情况下,如果元素相同就将该元素放到临时数组中,两个指针分别向后移动,如果某个数组的元素小于另一个数组的元素,小的指针移动,继续判断两个元素大小,直到有一个指针到达数组末尾。时间复杂度O(nlogn)
main函数下的代码
#include<stdio.h>
#include<malloc.h>
#include<math.h>
int* intersect(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize);
void quickSort(int* nums,int begin,int end);
int main(){
int nums1[4] = {1,2,2,1};
int nums2[2] = {2,2};
int a = 0;
// 初始化指针,用来存储相同数组中存放元素的个数
int* returnSize = &a;
int* temp = intersect(nums1,4,nums2,2,returnSize);
for(int i=0;i<*returnSize;i++){
printf("%d ",*(temp+i));
}
return 0;
}
查找交集的代码
int* intersect(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){
// 快速排序进行数组排序
quickSort(nums1,0,nums1Size-1);
quickSort(nums2,0,nums2Size-1);
int i = 0;
int j = 0;
// 指针指向元素的值为0
*returnSize = 0;
// 申请一个空间,用两个数组较小的
int* intersection = (int*)malloc(sizeof(int) * fmin(nums1Size, nums2Size));
// 双指针分别指向两个数组
while(i<nums1Size&&j<nums2Size){
// 如果两个元素相同,加入临时数组,指针往后走
if(nums1[i]==nums2[j]){
intersection[(*returnSize)++] = nums1[i];
i++;
j++;
// 数组小于另一个数组的值,较小的数组指针往后走
}else if(nums1[i]<nums2[j])
{
i++;
}else{
j++;
}
}
return intersection;
}
快速排序代码
void quickSort(int* nums,int begin,int end){
if(begin>=end){
return;
}
// 首先选择基准位置
int low = begin;
// 将该元素保存起来,备用,否则会被覆盖
int temp = nums[low];
// 指向数组最后一个位置
int high = end;
// 当low==high 表示基准位置找到了,第一次快排已经完成了。
while(low<high){
// 此时说明a[high]>temp,然后向前走,继续找。
while(low<high&&nums[high]>temp){
high--;
}
// 跳出上边的循环后,表示遇到了比基准元素小的元素,将a[low] = a[high]
if(low<high){
nums[low++] = nums[high];
}
// 然后从左边开始继续寻找,temp>a[low],然后往后走,继续找
while(low<high&&nums[low]<temp){
low++;
}
// 跳出上边的循环后说明 a[high]<a[low],将a[high] = a[low]
if(low<high){
nums[high--] = nums[low];
}
}
// 整个循环完成后,表示low==high了,这个位置就是一开始选择的基准元素的位置
nums[low] = temp;
// 基准元素一分为二,左边的都是比它小的,右边的都是比它大的,递归急继续解决
// 解决左部分
quickSort(nums,begin,low-1);
// 解决右部分
quickSort(nums,low+1,end);
}