一、判断回旋镖 解题思路:
首先需要理解回旋镖的定义:就是要三点不在一条直线上,并且这三个点互不相同。 三点不在一条直线上可以用set,map,tuple这三个实现,共线可以通过计算任意两点的斜率判断。
下面给出代码: ``
def solution(points: list) -> bool:
# write code here
res=set(map(tuple,points))
if len(res)!=3:
return False
x1,y1=points[0]
x2,y2=points[1]
x3,y3=points[2]
if (y2-y1)*(x3-x2)==(y3-y2)*(x2-x1):
return False
return True
if __name__ == '__main__':
print(solution(points=[[1, 1], [2, 3], [3, 2]]) == True)
print(solution(points=[[1, 1], [2, 2], [3, 3]]) == False)
print(solution(points=[[0, 0], [1, 1], [1, 0]]) == True)
算法步骤
-
检查点是否相同:
- 首先需要确保三个点互不相同。可以通过将点转换为元组并使用集合(
set
)来去重,然后检查集合的长度是否为3。
- 首先需要确保三个点互不相同。可以通过将点转换为元组并使用集合(
-
检查三点是否共线:
- 如果三点共线,则它们不能构成回旋镖。可以通过计算斜率来判断三点是否共线。为了避免除零错误,通过交叉相乘来比较斜率。
难点:
关于set(map(tuple, points)):
set(map(tuple, points))
是一个Python表达式,用于将列表中的点转换为元组,并使用集合(set
)来去重。
-
map(tuple, points)
:points
是一个包含多个点的列表,每个点是一个包含两个元素的列表(例如[x, y]
)。map(tuple, points)
将points
中的每个点转换为元组。例如,[[1, 1], [2, 3], [3, 2]]
会被转换为[(1, 1), (2, 3), (3, 2)]
。
-
set(...)
:set
是一个集合数据结构,它自动去除重复元素。- 将
map(tuple, points)
的结果传递给set
,会生成一个包含唯一元组的集合。例如,[(1, 1), (2, 3), (3, 2)]
会被转换为{(1, 1), (2, 3), (3, 2)}
。
关于计算斜率: 为了避免除零错误,可以通过交叉相乘来判断斜率是否相同 自此,完结撒花!
二、判断数组是否单调 解题思路: 首先要知道什么是单调数组? 单调数组有两种情况:
- 单调递增:数组中的每个元素都大于或等于前一个元素。
- 单调递减:数组中的每个元素都小于或等于前一个元素。 由于只需要遍历数组并比较相邻元素,因此不需要额外的数据结构。
算法步骤:
-
初始化标志变量:使用两个布尔变量
is_up
和is_down
,分别表示数组是否单调递增和单调递减。初始时,假设数组是单调的,因此将这两个变量都设为True
。 -
遍历数组:从第二个元素开始,遍历数组中的每个元素,并与前一个元素进行比较:
- 如果当前元素小于前一个元素,则数组不是单调递增的,将
is_up
设为False
。 - 如果当前元素大于前一个元素,则数组不是单调递减的,将
is_down
设为False
。
- 如果当前元素小于前一个元素,则数组不是单调递增的,将
-
返回结果:遍历结束后,只要
is_increasing
或is_decreasing
中有一个为True
,就说明数组是单调的,返回True
;否则返回False
。 下面给出代码实现: ``
def solution(nums: list) -> bool:
# write code here
is_up,is_down=True,True
for i in range(1,len(nums)):
if nums[i]<nums[i-1]:
is_up=False
if nums[i]>nums[i-1]:
is_down=False
return is_up or is_down
return False
if __name__ == '__main__':
print(solution(nums=[1, 2, 2, 3]) == True)
print(solution(nums=[6, 5, 4, 4]) == True)
print(solution(nums=[1, 3, 2, 4, 5]) == False)