leetcode 记录

leetcode 350 给定两个数组,计算交集

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;        
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值