leetcode 349. 两个数组的交集 两种方案,c语言实现
生活随笔
收集整理的這篇文章主要介紹了
leetcode 349. 两个数组的交集 两种方案,c语言实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
如題:
給定兩個數組,編寫一個函數來計算它們的交集。示例 1: 輸入: nums1 = [1,2,2,1], nums2 = [2,2] 輸出: [2]示例 2: 輸入: nums1 = [4,9,5], nums2 = [9,4,9,8,4] 輸出: [9,4]說明: 輸出結果中的每個元素一定是唯一的。 我們可以不考慮輸出結果的順序。屬于簡單類型,兩種方案。
方案一:是使用hash,不過c語言里面沒有內置hash結構,需要手動實現,很多c方案采用此方法,不過沒有考慮到負數問題,都是拿到數組后使用hash[nums[i]] 計算,這里nums[i]可能是負數。假設數組分別位A、B。將其中任意一個數組元素裝入hash桶中,然后比較另一個數組即可。
方案二:先將倆數組排序,排好序后去重。最后比較倆有序數組,取出相同元素即可。簡單快捷。代碼如下:
/*** Note: The returned array must be malloced, assume caller calls free().*/ //方法1:新建一個hash表,桶中元素為鏈表,正負存儲在一個節點內 //方法2:先將倆數組排序去重,然后合并到一個數組,剔除單一的數 #define MAX(a,b) ((a) > (b) ? (a):(b))//交換倆數 void swap(int *a, int *b) {if (a == b)return;*a = *a ^ *b;*b = *a ^ *b;*a = *a ^ *b;return; }//快速排序 void quickSort(int *arr, int low, int high) {int pivotKey, pivotLoc;int left = low;int right = high;if (low < high){//保存樞軸點和樞軸值pivotLoc = (low + high) / 2;pivotKey = arr[pivotLoc];while (low < high){while (low < pivotLoc && arr[low] <= pivotKey)low++;if (low < pivotLoc){swap(arr+low, arr+pivotLoc);pivotLoc = low;}while(high > pivotLoc && arr[high] >= pivotKey)high--;if (high > pivotLoc){swap(arr+high, arr+pivotLoc);pivotLoc = high; }}quickSort (arr, left, pivotLoc);quickSort (arr, pivotLoc + 1, right);}return; }//去重 void deduplicate(int *nums, int *numsSize) {int i, j, len = *numsSize;for (i = 0, j = 1; j < len; j++){if (nums[j] == nums[i])*numsSize = *numsSize - 1;else{swap(nums+i+1, nums+j);i++;} }return; }int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){int i,j,k,len, *ret;len = MAX(nums1Size, nums2Size);if (len <= 0) len = 1;ret = (int *)calloc(len, sizeof(int));*returnSize = 0;//特殊情況處理if (!nums1|| nums1Size < 0 || !nums2 || nums2Size < 0)return ret;//排序quickSort(nums1,0,nums1Size-1);quickSort(nums2,0,nums2Size-1);printf("A size:%d, B size:%d\n", nums1Size, nums2Size);//去重deduplicate(nums1, &nums1Size);deduplicate(nums2, &nums2Size);printf("A size:%d, B size:%d\n", nums1Size, nums2Size);//合并for (i = 0, j = 0, k = 0; i < nums1Size && j < nums2Size;){if (nums1[i] == nums2[j]){ret[k] = nums1[i];i++;j++;k++;}else if (nums1[i] < nums2[j])i++;elsej++;}*returnSize = k;return ret; }=============================================================================================
Linux應用程序、內核、驅動開發交流討論群(745510310),對后端、互聯網感興趣的同學可以加群討論、交流、資料查找等,前進的道路上,你不是一個人奧^_^。
總結
以上是生活随笔為你收集整理的leetcode 349. 两个数组的交集 两种方案,c语言实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 墙壁开关插座飞鸟标志是什么品牌的开关?
- 下一篇: 高中毕业生坐高铁可以买学生票吗学校没有发