leetcode 447. Number of Boomerangs
Given n points in the plane that are all pairwise distinct, a "boomerang" is a tuple of points (i, j, k)
such that the distance between i
and j
equals the distance between i
and k
(the order of the tuple matters).
Find the number of boomerangs. You may assume that n will be at most 500 and coordinates of points are all in the range [-10000, 10000] (inclusive).
Example:
Input: [[0,0],[1,0],[2,0]] Output: 2 Explanation: The two boomerangs are [[1,0],[0,0],[2,0]] and [[1,0],[2,0],[0,0]]
TLE:
double func(int** datas,int n,int x,int y)
{
double sum=0;
for(int i=0;i<n;i++)
{
sum+=(datas[x][i]-datas[y][i])*(datas[x][i]-datas[y][i]);
}
return sqrt(sum);
}
int numberOfBoomerangs(int** points, int pointsRowSize, int pointsColSize) {
int result=0;
for(int i=0;i<pointsRowSize;i++)
{
for(int j=0;j<pointsRowSize;j++)
{
if(i==j)
{
continue;
}
for(int k=0;k<pointsRowSize;k++)
{
if(k==j||k==i)
{
continue;
}
if(func(points,pointsColSize,i,j)==func(points,pointsColSize,i,k))
{
result+=1;
}
}
}
}
return result;
}
tips:方法是对的,但是超时,时间复杂度太高,距离重复计算需要优化。大部分解决方法都是使用C++,JAVA里的容器,使得时间复杂度降到O(n^2)
TLE:
{
double sum=0;
{
sum+=(x[i]-y[i])*(x[i]-y[i]);
}
return sum;
}
int numberOfBoomerangs(int** points, int pointsRowSize, int pointsColSize) {
int result=0;
double dis[500][500];
for(int i=0;i<pointsRowSize;i++)
{
dis[i][i]=0;
for(int j=i+1;j<pointsRowSize;j++)
{
dis[i][j]=func(points[i],points[j],pointsColSize);
dis[j][i]=dis[i][j];
}
}
for(int i=0;i<pointsRowSize;i++)
{
for(int j=0;j<pointsRowSize;j++)
{
if(i==j)
{
continue;
}
for(int k=0;k<pointsRowSize;k++)
{
if(k==i||k==j)
{
continue;
}
if(dis[i][j]==dis[i][k])
{
result++;
}
}
}
}
return result;
}
tips:减少算距离次数后,依然超时。
AC:
double func(int* x,int* y)
{
double sum=(x[0]-y[0])*(x[0]-y[0])+(x[1]-y[1])*(x[1]-y[1]);
return sqrt(sum);
}
int numberOfBoomerangs(int** points, int pointsRowSize, int pointsColSize) {
int result=0;
double dis[500][500];
for(int i=0;i<pointsRowSize;i++)
{
dis[i][i]=0;
for(int j=i+1;j<pointsRowSize;j++)
{
dis[i][j]=func(points[i],points[j]);
dis[j][i]=dis[i][j];
}
}
for(int i=0;i<pointsRowSize;i++)
{
for(int j=0;j<pointsRowSize;j++)
{
if(i==j)
{
continue;
}
for(int k=j+1;k<pointsRowSize;k++)
{
if(k==i)
{
continue;
}
if(dis[i][j]==dis[i][k])
{
result+=2;
}
}
}
}
return result;
}
tips: 第三重循环k的起始应该从j+1开始。