首页 > 其他分享 >335-分割数组使乘积互质

335-分割数组使乘积互质

时间:2023-03-05 17:36:28浏览次数:51  
标签:分割 下标 乘积 nums 335 int 互质

分割数组使乘积互质

给你一个长度为 n 的整数数组 nums ,下标从 0 开始。

如果在下标 i 处 分割 数组,其中 0 <= i <= n - 2 ,使前 i + 1 个元素的乘积和剩余元素的乘积互质,则认为该分割 有效 。

例如,如果 nums = [2, 3, 3] ,那么在下标 i = 0 处的分割有效,因为 2 和 9 互质,而在下标 i = 1 处的分割无效,因为 6 和 3 不互质。在下标 i = 2 处的分割也无效,因为 i == n - 1 。
返回可以有效分割数组的最小下标 i ,如果不存在有效分割,则返回 -1 。

当且仅当 gcd(val1, val2) == 1 成立时,val1 和 val2 这两个值才是互质的,其中 gcd(val1, val2) 表示 val1 和 val2 的最大公约数。

示例 1:

输入:nums = [4,7,8,15,3,5]
输出:2
解释:上表展示了每个下标 i 处的前 i + 1 个元素的乘积、剩余元素的乘积和它们的最大公约数的值。
唯一一个有效分割位于下标 2 。
示例 2:

输入:nums = [4,7,15,8,3,5]
输出:-1
解释:上表展示了每个下标 i 处的前 i + 1 个元素的乘积、剩余元素的乘积和它们的最大公约数的值。
不存在有效分割。

提示:

n == nums.length
1 <= n <= 104
1 <= nums[i] <= 106

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/split-the-array-to-make-coprime-products
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路1 朴素解法

求分割部分的乘积并计算gcd判断是否互质。写的时候就发现不可能将乘积存下来,只是想写下来再慢慢优化。到最后也没有搞定。

code

class Solution {
public:
    //时间复杂度O(n)可以接受
    //就是乘积太大,表示不了    
    int findValidSplit(vector<int>& nums) {
        
        int n = nums.size();
        int before = 1,after = 1;
        
        before *= nums[0];        
        for(int i = 1;i < n;i ++) after *= nums[i];
        
        if(gcd(before,after) == 1) return 0;
        
        for(int i = 1;i <= n-2;i ++)
        {
            before *= nums[i];
            after /= nums[i];
            if(gcd(before,after) == 1) return i;
        }
        
        return -1;
    }
};

解题思路2

如果两个数互质,那么两个数的质因数分解都不会包含公共的质因数。那么题目的问题就转换为:找到最小的分割点,使得左边所有数的质因数分解和右边所有数的质因数分解并不包含公共质因数。考虑一个质数p,分割点左侧要么不包含p,要么包含所有的p。也就是枚举分割点并判断每一个质数是否都符合以上条件。时间复杂度为\(O(loglogA + n \frac{\sqrt{A}}{logA})\),A是nums中的最大数。code以后补上先好好补一下数论的知识。

code

标签:分割,下标,乘积,nums,335,int,互质
From: https://www.cnblogs.com/huangxk23/p/17180974.html

相关文章

  • 335-获得分数的方法数
    获得分数的方法数考试中有n种类型的题目。给你一个整数target和一个下标从0开始的二维整数数组types,其中types[i]=[counti,marksi]表示第i种类型的题目有......
  • [第335场周赛]质因数分解,多重背包
    喜提AK以及最佳排名:6307. 递枕头提示简单3相关企业​​n​​ 个人站成一排,按从 ​​1​​ 到 ​​n​​ 编号。最初,排在队首的第一个人拿着一个枕头。每秒钟,拿着枕头......
  • 力扣第335场周赛补题题解
    目录1.递枕头2.二叉树中的第K大层和3.分割数组使乘积互质4.获得分数的方法数1.递枕头classSolution{public:intpassThePillow(intn,inttime){......
  • lg7335 [JRKSJ R1] 异或 题解
    本题的标签中含有trie,但是这道题可以不用trie做。考虑列出本题的dp方程:设\(f_{k,i}\)表示前\(i\)个数选了\(k\)段的答案,\(s_i\)为数组的前缀异或和当不选择第\(i\)位,使用......
  • BZOJ #3353. [IOI2009] Archery
    这是一篇大概和题解不一样的做法。首先一个平凡的转化是将我们要操作的这个数看作\(0\),大于这个数的看作\(1\),小于的看作\(-1\),则原来的\(2n\)个数转化成对\(3\)......
  • 2335.装满杯子需要的最短总时长 (Easy)
    问题描述2335.装满杯子需要的最短总时长(Easy)现有一台饮水机,可以制备冷水、温水和热水。每秒钟,可以装满2杯不同类型的水或者1杯任意类型的水。给你一个下标从......
  • C语言填空:判断几位数 及乘积
    /*程序功能:输入一个不大于4位正整数,判断它是几位数,然后输出各位之积。*/#include<stdio.h>main(){inta,【1】,【2】,b;scanf("%d",&a);【3】=a;......
  • C语言:几位数 乘积
    /*输入一个不大于4位正整数,判断它是几位数,然后输出各位之积。*/#include<stdio.h>main(){inta,cj=1,wei=0,b;scanf("%d",&a);b=a;if(a<=9999......
  • HDOJ2006求奇数的乘积
    求奇数的乘积TimeLimit:2000/1000MS(Java/Others)    MemoryLimit:65536/32768K(Java/Others)TotalSubmission(s):103371    AcceptedSubmission(s):......
  • LeetCode HOT 100:乘积最大子数组(动态规划)
    题目:152.乘积最大子数组题目描述:给你一个整数数组,在该数组的所有子数组中,找到一个子数组中所有元素相乘积最大,返回这个最大的积。子数组就是一个数组中,由一个或几个下标......