給定一些 ​points​ 和一個 ​origin​,從 ​points​ 中找到 ​k​ 個離 ​origin​ 最近的點。按照距離由小到大返回。如果兩個點有相同距離,則按照x值來排序;若x值也相同,就再按照y值排序。

線上評測地址:LintCode 領釦

例1:

輸入: points = [[4,6],[4,7],[4,4],[2,5],[1,1]], origin = [0, 0], k = 3

輸出: [[1,1],[2,5],[4,4]]

例2:

輸入: points = [[0,0],[0,9]], origin = [3, 1], k = 1

輸出: [[0,0]]

題解

使用 Heapify 的方法

heapify 時間複雜度 O(n) 然後 pop k 個點出來,時間複雜度 klogn 總共的時間複雜度 O(n+klogn)

如果 n >> k 的話,這種方法的時間複雜度是很優秀的。

public

class

Solution

{

private

Point

origin

private

int

size

/**

* @param points a list of points

* @param origin a point

* @param k an integer

* @return the k closest points

*/

public

Point

[]

kClosest

Point

[]

points

Point

origin

int

k

{

if

points

==

null

||

points

length

==

0

{

return

points

}

this

origin

=

origin

heapify

points

);

// O(n)

Point

[]

results

=

new

Point

k

];

// O(klogn)

for

int

i

=

0

i

<

k

i

++)

{

results

i

=

pop

points

);

}

return

results

}

private

void

heapify

Point

[]

points

{

size

=

points

length

for

int

i

=

size

/

2

i

>=

0

i

——)

{

siftDown

points

i

);

}

}

private

void

siftDown

Point

[]

points

int

index

{

while

index

<

size

{

int

left

=

index

*

2

+

1

int

right

=

index

*

2

+

2

int

min

=

index

if

left

<

size

&&

compare

points

min

],

points

left

])

>

0

{

min

=

left

}

if

right

<

size

&&

compare

points

min

],

points

right

])

>

0

{

min

=

right

}

if

index

!=

min

{

Point

temp

=

points

index

];

points

index

=

points

min

];

points

min

=

temp

index

=

min

}

else

{

break

}

}

}

private

Point

pop

Point

[]

points

{

Point

top

=

points

0

];

points

0

=

points

size

-

1

];

this

size

——;

siftDown

points

0

);

return

top

}

private

int

compare

Point

a

Point

b

{

int

square

=

distanceSquare

a

origin

-

distanceSquare

b

origin

);

if

square

!=

0

{

return

square

}

if

a

x

!=

b

x

{

return

a

x

-

b

x

}

return

a

y

-

b

y

}

private

int

distanceSquare

Point

a

Point

b

{

return

a

x

-

b

x

*

a

x

-

b

x

+

a

y

-

b

y

*

a

y

-

b

y

);

}

}

更多題解參考:九章演算法