题解 | #车站建造问题#

车站建造问题

http://www.nowcoder.com/practice/9fededa1b63a41798e5d43344d7bf216

车站建造问题

描述
X轴上10^8个点,从左到右依次编号为0~10^8-1,相邻点距离为1,其中有n个点有特殊意义,从小到大依次为a0~an-1,其中保证a0=0.
现在需要建设收集站,有两个要求必须被满足:
1、每个有意义的点必须修建收集站。
2、相邻收集站的距离必须为1或为某个质数。
现给出n和a数组,求需要建设收集站的最小数量。
示例
输入:3,[0,7,11]
返回值:4
说明:在0,7,8,11处建造收集站,差值分别为7,1,3,符合要求


方法一

思路分析

  本题需要用到数学的办法,相邻收集站的距离必须为1或者某个质数,因此循环遍历数组,如果数组相邻位置的距离不为质数,那么在这两个位置之间修建收集站,修建收集站的数量与两个位置的距离有关,设置这个距离为distance,那么分为以下两种情况:
如果distance为偶数,根据哥德巴赫猜想,大于2的偶数可以分为两个质数的和
如果distance为奇数,任何大于5的奇数都是三个质数的和
因此有以下步骤:
  • 首先设置修建收集站的个数count=n
  • 循环遍历数组,如果相邻位置的距离distance为质数不进行操作;
  • 如果distance不为质数,那么分为两种情况:
  • 如果distance为偶数,那么需要插入两个收集站,因此count+2
  • 如果distance为奇数,可将其拆分为:(distance-2)+2的形式,又可分为两种情况:
           1.(distance-2)如果为质数,则拆解为两个质数,因此count+2;
           2.(distance-2)如果不为质数,那么 将其拆分为(distance-1)+1,(distance-1)为偶数,偶数可分为两个质数的和,因此这种情况下需要修建三个收集站,即count+3
上面由于初始化设置count=n,因此在实际操作中插入两个收集站只需要加1,插入三个收集站只需要加2即可

图解



核心代码

class Solution {
public:
    /**
     * 
     * @param n int整型 
     * @param a int整型一维数组 
     * @param aLen int a数组长度
     * @return int整型
     */
    int work(int n, int* a, int aLen) {
        // write code here
        int count=n;
        for(int i=0;i<n-1;i++)
        {
            int distance=a[i+1]-a[i];
            if(distance!=1&&prime(distance)==0)//distance不为质数,那么分为两种情况
            {
                if(distance%2==0||prime(distance-2)==1)//distance为偶数或者distance-2为质数,那么需要插入两个收集站,因此count+2
                    count++;
                else count=count+2;
            }
        }
        return count;
    }
    int prime(int n)//判断是否为素数
    {
      if (n == 1) 
      {
        return 0;
      }
    for(int i = 2; i*i <= n; i++)//只需要判断到平方根n即可
    {
        if (n % i == 0) 
        {
            return 0;
        }
    }
    return 1;
    }

};

复杂度分析

  • 时间复杂度:该方法的时间在于判断相邻位置的距离是否为质数,判断一个质数的时间复杂度为,需要遍历数组,因此总的时间复杂度为
  • 空间复杂度:空间复杂度为$O(1)$

全部评论

相关推荐

12-27 22:35
门头沟学院 Java
点赞 评论 收藏
分享
11-07 03:09
深圳大学 C++
实习秋招做的很差,也想总结一下自己的大学生涯吧。不算太摆,但是很迷。0.大学前高考发挥超常,才来到深大计软。大学前暑期基本上都是玩游戏了。接触了python(李笑来)但是没接触到online&nbsp;judge,也没去多了解编程生态、计算机行业。背了背单词,但是没去规划指标如六级,没制定计划不了了之。1.大一军训时去了校ACM培训,当时dev编译器都不会下载。军训期间积极看B站大学c语言课程。力扣,牛客都是知道的,但是没有成为很好的跳板。第二次培训,看不懂cpp的&nbsp;cin&amp;gt;&amp;gt;,网上搜了也没搞懂,再加上周末跟训得三个多小时,感觉跟不上放弃了。自费报了蓝桥杯,混了省二跟着一些机构课程学习,走的cpp路线。暑假在linux上熟悉vim操作。2.大二朝花夕拾,又去参加ACM训练,跟了一年,寒假都在码&nbsp;带懒标记的线段树。codeforce和力扣赛都在打打(竞赛还是有趣的)。集训队入队周赛打四场,校赛拿金,面试时表现差,说自己想就业,遂挂。当时四月多,2024华为软件精英挑战赛也在打,拿了80名(前64才有三等奖)。蓝桥杯国二。很多晚上跑步来消磨时间。3.大三上修了深大最强的计算机图形学,408找实习,投简历了说自己只有周末有空,遂没在找。也没看牛客真实行情。寒假随便做了个日志器,属于混过去了。当时接到字节的面试(人生处女面),前一天觉都睡不好,很紧张,手撕做的不好,话都说不利索了。面评脏。大三下找实习,cpp选手,没有很好经历、项目,运气好去了学校附近中厂实习。4.大四现在,貌似对开发不上心?没有好的offer(甚至hot100不会做)其实同届好多同学都拿的不错。还有保研C9的。嗯,考研吧。————对自己行为的分析:a.应试教育+应试家庭教育,我的个性是固执、遵规守矩的。b.还有莫名的孤独,明明有很多朋友,但还是没有很好的内驱力,没有坚定的理想。c.自己没有很好的调研、探索和规划能力。大家也可以锐评一下😊
_Matrice_:差不多的性格,不然不会本科时硬杠cpp(那个时候还没有大模型,啃完一整本primer和习题,还是做不出来什么东西),还找不到方向,相比之下学习一些应用层的同学已经能够参考别人的方法做出实用的应用了。学东西,找实习,感觉更多地是出于和别人比较,而不是自我内驱。不过...正如deft所说,人生不需要他人的建议,所以也没有标准化的路径,在能够自食其力的背景下慢慢找到自己的生活方式吧...。另外面试很多时候看运气、眼缘
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务