給定二維平面上的n點(diǎn),找出是否有這樣一條與y軸平行的線使所有點(diǎn)對(duì)稱。
題目在此,被提點(diǎn)的一題,因?yàn)橐槐檫^(guò)就沒(méi)考慮太多,發(fā)現(xiàn)自己的時(shí)長(zhǎng)比較久。
const isReflected = function (points) {
// Write your code here
if(points.length==0){
return true;
}
points.sort((a,b)=>a[0]-b[0]);
var mid = points.length % 2 === 0?(points[points.length/2][0]+points[(points.length/2)-1][0]):points[(points.length-1)/2][0]*2;
for(var i = 0;i<points.length-i-1;i++){
if(points[i][0]+points[points.length-i-1][0]!==mid||points[i][1]!==points[points.length-i-1][1])
return false;
}
return true;
}
解題很方便,和Y軸平行的對(duì)稱線說(shuō)明對(duì)稱的兩點(diǎn)y值相等,x值相加為平行線與x軸交點(diǎn)的截距*2。
理所應(yīng)當(dāng)?shù)木妥隽伺判?,然而沒(méi)必要做排序,這也是我時(shí)間長(zhǎng)的原因所在。
看了一下筆記,發(fā)現(xiàn)可以用Map來(lái)取代排序,在JS里可以合理的利用object的性質(zhì)來(lái)做(類似于Map):
const isReflected = function (points) {
// Write your code here
if(points.length==0){
return true;
}
var obj = {};
var max = Number.MIN_SAFE_INTEGER;
var min = Number.MAX_SAFE_INTEGER;
points.forEach(p=>{
obj[p[0]] = p[1];
if(max<p[0]){
max = p[0];
}
if(min>p[0]){
min = p[0];
}
})
var mid = max+min;
for(var i = 0;i<points.length;i++){
if(!(Number(obj[mid-points[i][0]])===obj[mid-points[i][0]])||obj[points[i][0]]!==obj[mid-points[i][0]]){
return false;
}
}
return true;
}
時(shí)間從排序的1041ms直接到了201ms,理論上O(n)到O(n*logn),不應(yīng)該有這么大的差距。
我覺(jué)得是sort中的compare函數(shù)執(zhí)行需要時(shí)間,這個(gè)時(shí)間遠(yuǎn)超于排序算法本身需要的時(shí)間了。