LintCode直线对称
2018-12-31 本文已影响5人
Sczlog
给定二维平面上的n点,找出是否有这样一条与y轴平行的线使所有点对称。
题目在此,被提点的一题,因为一遍过就没考虑太多,发现自己的时长比较久。
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轴平行的对称线说明对称的两点y值相等,x值相加为平行线与x轴交点的截距*2。
理所应当的就做了排序,然而没必要做排序,这也是我时间长的原因所在。
看了一下笔记,发现可以用Map来取代排序,在JS里可以合理的利用object的性质来做(类似于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;
}
时间从排序的1041ms直接到了201ms,理论上O(n)到O(n*logn),不应该有这么大的差距。
我觉得是sort中的compare函数执行需要时间,这个时间远超于排序算法本身需要的时间了。