题目:原题链接(困难)
标签:贪心算法、几何、数学
解法 | 时间复杂度 | 空间复杂度 | 执行用时 |
Ans 1 (Python) | O ( N 2 ) | O ( N ) | 1996ms (13.33%) |
Ans 2 (Python) | |||
Ans 3 (Python) |
解法一:
def sub(a, b):
"""求点a到点b的向量"""
return [b[0] - a[0], b[1] - a[1]]
def cross(a, b):
"""求向量a到向量b的向量叉积"""
return a[0] * b[1] - a[1] * b[0]
class Solution:
def visitOrder(self, points: List[List[int]], direction: str) -> List[int]:
size = len(points)
visited = [False] * size
ans = []
# 将最左侧的点作为出发点
start = 0
for i in range(size):
if points[i][0] < points[start][0]:
start = i
ans.append(start)
visited[start] = True
for direct in direction:
next = -1
# 下一个转向方向为L,则当前这一步选择最右侧的点
if direct == "L":
for j in range(size):
if not visited[j]:
if next == -1 or cross(sub(points[start], points[j]), sub(points[start], points[next])) > 0:
next = j
# 下一个转向方向为R,则当前这一步选择最左侧的点
if direct == "R":
for j in range(size):
if not visited[j]:
if next == -1 or cross(sub(points[start], points[j]), sub(points[start], points[next])) < 0:
next = j
ans.append(next)
visited[next] = True
start = next
# 将最后一个点添加到结果中
for i in range(size):
if not visited[i]:
ans.append(i)
return ans