力扣每日一题 7/2 数学、数论、数组/双指针

  • 博客主页:誓则盟约
  • 系列专栏: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,并初始化两个指针ij,分别指向列表的开头和结尾。

        接下来,通过一个循环从列表开头开始,找到第一个在prime集合中的数,找到后停止循环,此时i指向该数。然后通过另一个循环从列表结尾开始,找到第一个在prime集合中的数,找到后停止循环,此时j指向该数。

        最后,计算ji的差值并返回,这个差值就是列表中两个质数的索引距离。

代码实现:

思路一代码实现: 
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;如果数为23,则返回True;对于其他数,从2到该数的平方根加1进行遍历,如果能被整除,则返回False,否则返回True
  • 然后通过两个指针sted分别从列表的两端向中间遍历。在遍历过程中,跳过不是质数的数,直到找到两个都是质数的数。
  • 如果sted相等,说明没有找到两个不同的质数,返回0
  • 否则,返回ed - st

考点

  • 质数的判断方法。
  • 双指针遍历列表的技巧。

收获

  • 加深了对质数判断的理解和实现。
  • 掌握了通过双指针遍历列表来解决问题的方法。
  • 提高了对问题的分析和解决能力,学会如何根据题目要求设计合适的算法

“既然我无法停留,那么就飞到我再也不能飞的那一天吧。”——《シ舀シ舀》 

  • 84
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 33
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 33
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值