给一组序列,求其中相邻两个元素之间的最大公约数且替换掉其他一个。一直不停求下去直到所有元素被替换为1. 求需要最少替换多少次能完成?
如果实在不能全部替换,则返回-1。输入的第一行为元素个数 n ,第二行为序列arr。 输出为替换元素的次数
Example1
Input:
4 4 1 3 5
Output
3
解释:4和1的最大公约数是1,4替换成1 -> [1 1 3 5], 以此类推替换掉3和5,总共3次。
Example2:
Input:
5 10 20 30 40 50
Output:
-1
上面的题目是今天模拟考的一道算法题,限时半小时。
思路:
很明显如果序列里出现1,这个序列就一定能全部转为1,因为1和任何数的公约数都为1。
-
那么最先设立的一个初始筛选条件就是检测输入序列里是否有1,如果有就设一个变量
num
记录序列里面1的个数,返回n-num
就是答案。 -
如果初始序列里没有1,那么我们就需要求相邻数的公约数,一旦成功把其中一个元素替换为1,把这之前的替换步骤数(
count
)记录下来,我们就能够成功利用刚刚所说的就能立即出答案来计算出最终答案。也即是n-count+1
. (1 是1的个数&