数组的交集

求数组中的相同元素,这是力扣上的一道题,很容易想到的方法就是,将数组进行排序,然后利用双指针法分别指向两个数组,在两个指针都不到达数组结尾的情况下,如果元素相同就将该元素放到临时数组中,两个指针分别向后移动,如果某个数组的元素小于另一个数组的元素,小的指针移动,继续判断两个元素大小,直到有一个指针到达数组末尾。时间复杂度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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用多种方法来获取Python数组交集。 方法一:使用列表推导式和in操作符 ```python a = [2, 3, 4, 5] b = [2, 5, 8] tmp = [val for val in a if val in b] print(tmp) # [2, 5] ``` 方法二:使用set的intersection方法 ```python a = [2, 3, 4, 5] b = [2, 5, 8] print(list(set(a).intersection(set(b)))) # [2, 5] ``` 方法三:使用集合的交集运算符& ```python a = [2, 3, 4, 5] b = [2, 5, 8] print(list(set(a) & set(b))) # [2, 5] ``` 以上是三种常见的方法获取Python数组交集。你可以根据实际情况选择其中一种方法来使用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Python 获得两个数组交集、并集、差集的方法](https://blog.csdn.net/sunny_day_day/article/details/126208046)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [两个数组交集Python解法](https://blog.csdn.net/qq_43593534/article/details/127178466)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值