题解 | #车站建造问题#

车站建造问题

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)$

全部评论

相关推荐

零零幺零零幺:至少再做一个项目,然后猛投小厂,不然有点难
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 长得好看会提高面试通过率吗? #
4018次浏览 46人参与
# 离家近房租贵VS离家远但房租低,怎么选 #
16907次浏览 137人参与
# MiniMax求职进展汇总 #
25165次浏览 322人参与
# 春招至今,你的战绩如何? #
15816次浏览 145人参与
# 你的实习产出是真实的还是包装的? #
3098次浏览 53人参与
# 沪漂/北漂你觉得哪个更苦? #
1553次浏览 41人参与
# 巨人网络春招 #
11527次浏览 224人参与
# HR最不可信的一句话是__ #
1091次浏览 32人参与
# AI面会问哪些问题? #
946次浏览 23人参与
# 你做过最难的笔试是哪家公司 #
1247次浏览 22人参与
# AI时代,哪个岗位还有“活路” #
2853次浏览 51人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152905次浏览 889人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
8021次浏览 43人参与
# XX请雇我工作 #
51155次浏览 171人参与
# 简历第一个项目做什么 #
32148次浏览 361人参与
# 简历中的项目经历要怎么写? #
311051次浏览 4265人参与
# 投格力的你,拿到offer了吗? #
178339次浏览 891人参与
# 你最满意的offer薪资是哪家公司? #
76981次浏览 375人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187605次浏览 1123人参与
# AI时代,哪些岗位最容易被淘汰 #
64760次浏览 890人参与
# 如果重来一次你还会读研吗 #
230018次浏览 2011人参与
# 正在春招的你,也参与了去年秋招吗? #
364353次浏览 2642人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务