LeetCode-cn 探索 初级算法
题目描述:
给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2]
示例 2:
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出: [4,9]
说明:
- 输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
- 我们可以不考虑输出结果的顺序。
进阶:
- 如果给定的数组已经排好序呢?你将如何优化你的算法?
- 如果 nums1 的大小比 nums2 小很多,哪种方法更优?
- 如果 nums2 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?
代码:
c语言:
2019.3.7
/**
* Return an array of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
int* intersect(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) {
if(nums1Size == 0 || nums2Size == 0){
return NULL;
}
int temp = 0;
for(int i = 0;i < nums1Size - 1;i++){
for(int j = i+1;j < nums1Size;j++){
if(nums1[i] > nums1[j]){
temp = nums1[i];
nums1[i] = nums1[j];
nums1[j] = temp;
}
}
}
for(int i = 0;i < nums2Size - 1;i++){
for(int j = i + 1;j < nums2Size;j++){
if(nums2[i] > nums2[j]){
temp = nums2[i];
nums2[i] = nums2[j];
nums2[j] = temp;
}
}
}
*returnSize = 0;
int i =0,j = 0;
int *new_num = (int *)malloc(sizeof(int)*nums2Size);
while(i < nums1Size && j < nums2Size){
if(nums1[i] < nums2[j]){
i++;
}
else if(nums1[i] == nums2[j]){
new_num[(*returnSize)++] = nums1[i];
i++;
j++;
}
else{
j++;
}
}
return new_num;
}