日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

leetcode 349. 两个数组的交集 两种方案,c语言实现

發布時間:2025/4/5 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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语言实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。