- 博客主页:誓则盟约
- 系列专栏:IT竞赛 专栏
- 关注博主,后期持续更新系列文章
- 如果有错误感谢请大家批评指出,及时修改
- 感谢大家点赞👍收藏⭐评论✍
3115.质数的最大距离【中等】
题目:
给你一个整数数组 nums
。
返回两个(不一定不同的)质数在 nums
中 下标 的 最大距离。
示例 1:
输入: nums = [4,2,9,5,3]
输出: 3
解释: nums[1]
、nums[3]
和 nums[4]
是质数。因此答案是 |4 - 1| = 3
。
示例 2:
输入: nums = [4,8,2,8]
输出: 0
解释: nums[2]
是质数。因为只有一个质数,所以答案是 |2 - 2| = 0
。
提示:
1 <= nums.length <= 3 * 10**5
1 <= nums[i] <= 100
- 输入保证
nums
中至少有一个质数。
分析问题:
思路一:
题目难度适中,主要思路是利用双指针,头指针从下标0开始往后遍历,尾指针从下标n-1开始往前遍历,先走头指针,碰到质数时指针停下;尾指针开始运动,碰到质数时结束。
不知道要循环多少次所以用while循环来写,但是在写循环之前要先写判断是否是质数的函数pan。但是需要注意的是 1 不是质数。
- 如果头指针和尾指针重合,则说明只有一个质数。返回0即可。
- 如果头指针和尾指针不重合,则直接返回 ed-st 即可。
思路二:
因为这道题的数据量只有1-100这个区间,所以我们可以直接写出来100以内的所有质数,这样可以直接取,大大减小复杂度,具体思路如下:
首先定义了一个包含一些质数的集合prime
。然后获取输入列表nums
的长度n
,并初始化两个指针i
和j
,分别指向列表的开头和结尾。
接下来,通过一个循环从列表开头开始,找到第一个在prime
集合中的数,找到后停止循环,此时i
指向该数。然后通过另一个循环从列表结尾开始,找到第一个在prime
集合中的数,找到后停止循环,此时j
指向该数。
最后,计算j
和i
的差值并返回,这个差值就是列表中两个质数的索引距离。
代码实现:
思路一代码实现:
class Solution:
def maximumPrimeDifference(self, nums: List[int]) -> int:
n=len(nums)
def pan(n:int):
if n==1: return False
if n in [2,3]: return True
for i in range(2,int(n**0.5)+2):
if n%i==0: return False
return True
st,ed=0,n-1
while st<=ed:
while not pan(nums[st]) and st<=ed:
st+=1
while not pan(nums[ed]) and st<=ed:
ed-=1
if st==ed : return 0
return ed-st
思路二代码实现:
class Solution:
def maximumPrimeDifference(self, nums: List[int]) -> int:
prime = set([2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97])
n = len(nums)
i, j = 0, n - 1
while i < n:
if nums[i] in prime: break
i += 1
while j >= 0:
if nums[j] in prime: break
j -= 1
return j - i
总结:
代码详解:
- 首先获取列表的长度
n
。 - 定义了一个函数
pan
,用于判断一个数是否为质数。如果数为1
,则返回False
;如果数为2
或3
,则返回True
;对于其他数,从2
到该数的平方根加1
进行遍历,如果能被整除,则返回False
,否则返回True
。 - 然后通过两个指针
st
和ed
分别从列表的两端向中间遍历。在遍历过程中,跳过不是质数的数,直到找到两个都是质数的数。 - 如果
st
和ed
相等,说明没有找到两个不同的质数,返回0
。 - 否则,返回
ed - st
。
考点:
- 质数的判断方法。
- 双指针遍历列表的技巧。
收获:
- 加深了对质数判断的理解和实现。
- 掌握了通过双指针遍历列表来解决问题的方法。
- 提高了对问题的分析和解决能力,学会如何根据题目要求设计合适的算法。