hashtable
typedef struct HashTable {
int k;
int v;
UT_hash_handle hh;
} *NodeHashTable;
#define MAX(a, b) ((a) > (b) ? (a) : (b))
static void cleanHashTable(NodeHashTable hashTable)
{
NodeHashTable __current = NULL, __tmp = NULL;
HASH_ITER(hh, hashTable, __current, __tmp) {
HASH_DEL( hashTable, __current );
free( __current );
}
}
static void addHashTable( NodeHashTable *hashTable, int key, int value ) {
NodeHashTable n = NULL;
HASH_FIND_INT(*hashTable, &key, n);
if(n == NULL) {
n = (NodeHashTable) malloc(sizeof(*n));
n->k = key;
HASH_ADD_INT(*hashTable, k, n);
}
n->v = value;
}
static NodeHashTable getNodeHashTable( NodeHashTable hashTable, int key ) {
NodeHashTable n = NULL;
HASH_FIND_INT( hashTable, &key, n );
return n;
}
static int getValueHashTable( NodeHashTable hashTable, int key ) {
NodeHashTable n = NULL;
HASH_FIND_INT( hashTable, &key, n );
return n != NULL ? n->v : INT_MIN;
}
int *intersect( int *nums1, int nums1Size, int *nums2, int nums2Size, int *returnSize ) {
int *returnArray = NULL, i = 0;
NodeHashTable ht = NULL;
*returnSize = 0;
if( nums1 == NULL || nums2 == NULL ) return NULL;
returnArray = (int *)malloc( sizeof(*returnArray) * MAX( nums1Size, nums2Size ) );
for( i = 0; i < nums1Size; ++i ) {
if( getNodeHashTable( ht, nums1[i] ) ) {
addHashTable( &ht, nums1[i], getValueHashTable( ht, nums1[i] ) + 1 );
continue;
}
addHashTable( &ht, nums1[i], 1 );
}
for( i = 0; i < nums2Size; ++i ) {
if( getValueHashTable( ht, nums2[i] ) > 0 ) {
returnArray[(*returnSize)++] = nums2[i];
addHashTable( &ht, nums2[i], getValueHashTable( ht, nums2[i] ) - 1 );
}
}
cleanHashTable( ht );
return returnArray;
}
qsort
int cmp(void *a, void *b)
{
int *pa = (int *)a;
int *pb = (int *)b;
if (*pa > *pb) {
return 1;
} else {
return 0;
}
}
int* intersect(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){
if (nums1Size == 0 || nums2Size == 0) {
*returnSize = 0;
return NULL;
}
qsort(nums1, nums1Size, sizeof(int), cmp);
qsort(nums2, nums2Size, sizeof(int), cmp);
int left = 0;
int right = 0;
int *res;
int num = 0;
res = malloc(fmax(nums1Size, nums2Size) * sizeof(int));
while (left < nums1Size && right < nums2Size) {
if (nums1[left] == nums2[right]) {
res[num++] = nums1[left];
left++;
right++;
} else {
if (nums1[left] > nums2[right]) {
right++;
} else {
left++;
}
}
}
*returnSize = num;
return res;
}
C++
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
sort(nums1.begin(), nums1.end());
sort(nums2.begin(), nums2.end());
vector<int> ans;
int n = nums1.size();
int m = nums2.size();
int i = 0;
int j = 0;
while (i < n && j < m) {
if (nums1[i] == nums2[j]) {
ans.push_back(nums1[i]);
i++;
j++;
} else if (nums1[i] < nums2[j]) {
i++;
} else {
j++;
}
}
return ans;
}
};