【力扣刷题系列】

寻找两个有序数组的中位数

【原题】

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。

请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。

你可以假设 nums1 和 nums2 不会同时为空。

【解题思路】

从中学知识知道,如果需要求一组数字的中位数,那么先要从小到大排列这些数字。接着,如果总共有奇数个数字,那么直接取中间的,如果有偶数个数字,那么取中间与中间后面一个数字的平均数。

所以,第一步先将数组合并。合并两个数组的方式非常多,最简洁的就是三点运算符:

let result = [...nums1,...nums2]

接着,从小到大排列也很简单,原生 JS 就提供了一个排列元素的方法:

result = result.sort((a,b) => a-b)

然后,考虑问题的一个良好习惯就是考虑特殊的情况。所以,先想想有没有什么特殊的情况。比如,数组为空,或者数组只有一个元素。所以需要抽取这两种情况来处理。

if(result.length === 0) return null
if(result.length === 1) return result[0]

最后,就是将上面求中位数的思路表达出来,总数是奇数则直接取中间的,偶数则取中间与后面一位的平均数。

let target = parseInt((result.length / 2))
if(result.length % 2 !== 0){
	return result[target]
}else{
	return ((result[target] + result[target-1]) / 2)
}

【完整代码】

var findMedianSortedArrays = function(nums1, nums2) {
    let result = [...nums1,...nums2]
    result = result.sort((a,b) => a-b)
    if(result.length === 0) return null
    if(result.length === 1) return result[0]
    let target = parseInt((result.length / 2))
    if(result.length % 2 !== 0){
        return result[target]
    }else{
        return ((result[target] + result[target-1])/2)
    }
};

取字符串最长公共前缀

【原题】

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 “”。

【示例】

输入: [“flower”,“flow”,“flight”]
输出: “fl”

【解题思路】

写一个函数用于比较两个字符串的字符序列,一旦出现不同的字符,则返回字符索引。接着,逐一比较数组中的每对字符串,得到多个索引值,分别将这些索引值存起来,最后求这组值的最小值就是最长的公共前缀。

【完整代码】

var longestCommonPrefix = function(strs) {
    if(!strs.length){
        return ""
    }
    let arr = []
    for(let i=0;i<strs.length;i++){
        for(let j=i+1;j<strs.length;j++){
            arr.push(foo(strs[i],strs[j]))
        }
    }
    let index = Math.min(...arr)
    function foo(a,b){
        if(a === b){
            return a.length
        }
        let target_length = Math.max(a.length,b.length)
        for(let i=0;i<target_length;i++){
            if(a[i] !== b[i]){
                return i
            }
        }
    }
    return strs[0].slice(0,index)
};

你可能感兴趣的:(js)