文章 评论 浏览 31
//利用二分法,舍弃最小的一部分和舍弃最大的一部分,递归调用,完成输出。 // 时间复杂度 O(log2(m+n)) // js中Math.log默认是以自然数e为底数,并不是以2为底数,可能会造成误导 const num1=[1,2,5,8,9,10,11]; const num2=[3,4,9,12,19,30,31]; function findMedian(num1,num2) { let center1Index = ~~(num1.length/2); let center2Index = ~~(num2.length/2); let center1=num1[center1Index]; let center2=num2[center2Index]; center1 = num1.length%2?center1:center1/2+(center1Index>0?num1[center1Index-1]:0)/2; center2 = num2.length%2?center2:center2/2+(center2Index>0?num2[center2Index-1]:0)/2; if(center1===center2){ return center1 } if(num1.length===0){ return center2 } if(num2.length===0){ return center1 } if(num1.length===1&&num2.length===1){ return (center1+center2)/2 }else if(num1.length===1){ if(center1<num2[center2Index]){ num2.splice(center2Index-(center1>num2[center2Index-1]?2:1),0,center1) }else { num2.splice(center2Index+(center1>num2[center2Index+1]?1:0),0,center1) } return findMedian([],num2); }else if(num2.length===1){ if(center2<num1[center1Index]){ num1.splice(center1Index-(center2>num1[center1Index-1]?2:1),0,center2) }else { num1.splice(center1Index+(center2>num1[center1Index+1]?1:0),0,center2) } return findMedian(num1,[]); } let rightIsMax = center2>center1; let spliceNumber=Math.min(center1Index,center2Index,rightIsMax?-center2Index+num2.length-1:center2Index,rightIsMax?center1Index:-center1Index+num1.length-1)||1; if(rightIsMax){ num2=num2.slice(0,-spliceNumber); num1=num1.slice(spliceNumber); }else { num1=num1.slice(0,-spliceNumber); num2=num2.slice(spliceNumber); } return findMedian(num1,num2); } findMedian(num1,num2);
大佬,我想问下明明Object.prototype.toString.call()已经可以检测出来所有这些类型了(包括基本类型),为什么还要去区分基本类型然后使用typeof呢?直接都是用Object.prototype.toString.call()不就好了吗
typeof 效率更高
文章 0 评论 0
接受
第 93 题:给定两个大小为 m 和 n 的有序数组 nums1 和 nums2,请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log(m+n))。