LeetCode Intersection of Two Arrays(Set去重)

传送门:

https://leetcode.com/problems/intersection-of-two-arrays/

题目大意:

求两个数组的交集。

解题思路:

我现在已经堕落到刷LeetCode了。
有两种解法:用Set和不用Set。

用Set

用Set的解法代码写起来很简单,用Set将两个数组分别去重得到st1和st2,对st1中的每个元素都判断一下是否在st2中存在。

不用Set

对其中一个数组排序,通过二分查找判断某一个元素是否在这个数组中存在。其实最后我还是用了Set对结果集进行一个去重,但是这个已经无关紧要了。

总结:

之前我很纠结JavaScript中的Set是用哈希实现的还是用红黑树实现的。
通过上述两种方法的提交,60组测试数据的情况下运行时间几乎相同。所以我猜测JavaScript中的Set是用红黑树实现的。
哈希实现的Set每次查找的最坏时间复杂度应该是O(1),用红黑树实现的Set每次查找的最坏时间复杂度是O(log(n)),二分查找的最坏时间复杂度也是O(log(n))。所以,如果说是用哈希实现的Set应该会比二分查找来得快吧,但是事实证明并没有。
这只是我的猜测,因为有可能是测试数据的原因或其它原因导致运行时间大致相同。纯属好奇,纯属无聊。

Show me the code:

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
var intersection = function(nums1, nums2) {
    var st1 = new Set(nums1);
    var st2 = new Set(nums2);
    var res = [];
    for (var number of st1) {
        if (st2.has(number)) res.push(number);
    }
    return res;
};
/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */

var binarySearch = function(arr, val) {
    var l = 0, r = arr.length;
    while (l < r) {
        var mid = l + parseInt((r - l) / 2);
        if (arr[mid] >= val) r = mid;
        else l = mid + 1;
    }
    return arr[l] == val;
}

var intersection = function(nums1, nums2) {
    nums1.sort(function(x, y) {
        return x > y ? 1 : (x == y ? 0 : -1);
    });
    var st = new Set();
    for (var a = 0; a < nums2.length; ++a) {
        if (binarySearch(nums1, nums2[a])) st.add(nums2[a]);
    }
    var res = [];
    for (var number of st) {
        res.push(number);
    }
    return res;
};

你可能感兴趣的:(LeetCode Intersection of Two Arrays(Set去重))