首页 > 其他分享 >Leetcode LCP 14. 切分数组

Leetcode LCP 14. 切分数组

时间:2023-12-26 10:14:57浏览次数:31  
标签:14 LCP nums int 最大公约数 数组 质因数 Leetcode dp

https://leetcode.cn/problems/qie-fen-shu-zu/description/

给定一个整数数组 nums ,小李想将 nums
切割成若干个非空子数组,使得每个子数组最左边的数和最右边的数的最大公约数大于 1 。
为了减少他的工作量,请求出最少可以切成多少个子数组。

示例 1:

输入:nums = [2,3,3,2,3,3]

输出:2

解释:最优切割为 [2,3,3,2] 和 [3,3] 。第一个子数组头尾数字的最大公约数为 2
,第二个子数组头尾数字的最大公约数为 3 。

示例 2:

输入:nums = [2,3,5,7]

输出:4

解释:只有一种可行的切割:[2], [3], [5], [7]

限制:

1 <= nums.length <= 10^5
2 <= nums[i] <= 10^6

解答
1 首先想到动态规划转移方程
dp[x]为索引x 可以分成的最小组数
dp[i] = dp[j-1]+1; == 如果nums[i] nums[j]最大公约数不为1(用其他质因数) 那么nums[i] nums[j]划分为一组。

2 但是上面的时间复杂度是O(n^2)
优化为 判断dp[i]的时候 记录前边和他有相同质因数的nums[j]最小分成组数
dp[i] = min(PrimesMinLen[primesV]+1);
分解质因数为sqrt(x);
时间复杂度为O(n *sqrt(x))

class Solution {
public:
    int dp[100010];
    unordered_map<int ,int> PrimesMinLen;

    int splitArray(vector<int>& nums) {
        memset(dp, 0x3f, sizeof dp);
        //拆入一个质数 不可能和其他数 分组。  后面索引从1开始计算 避免一些边界问题
        nums.insert(nums.begin(), 100019);
        dp[0] = 0;
        for (int i = 1; i < nums.size(); i++) {
            dp[i] = dp[i - 1] + 1;  //另开一个数组
            //分解质因数
            int splitP[20]; memset(splitP, 0, sizeof splitP);
            int splitCnt = 0;
            for (int j = 2; j <= nums[i] / j; j++) {
                while (nums[i] % j == 0) {
                    nums[i] /= j;
                    splitP[splitCnt] = j;
                }
                if (splitP[splitCnt] != 0) {
                    int primesV = splitP[splitCnt]; splitCnt++;
                    if (PrimesMinLen.count(primesV) != 0)
                        dp[i] = min(dp[i], PrimesMinLen[primesV]+1);
                }
            }

            if (nums[i] != 1) {   
                splitP[splitCnt] = nums[i]; splitCnt++;
                int primesV = nums[i];
                if(PrimesMinLen.count(primesV) !=0)
                    dp[i] = min(dp[i], PrimesMinLen[primesV]+1);
            }
           
            //更新 该元素左端的元素 质数对应的最短分组
            for (int j = 0; j < splitCnt; j++) {
                int primesV = splitP[j];
                if (PrimesMinLen.count(primesV) == 0) PrimesMinLen[primesV] = dp[i-1];
                else PrimesMinLen[primesV] = min(PrimesMinLen[primesV], dp[i-1]);
            }
        }

        return dp[nums.size() - 1];
    }
};

我的视频题解空间

标签:14,LCP,nums,int,最大公约数,数组,质因数,Leetcode,dp
From: https://www.cnblogs.com/itdef/p/17927487.html

相关文章

  • 『LeetCode』9. 回文数 Palindrome Number
    题目描述给你一个整数x,如果x是一个回文整数,返回true;否则,返回false。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121是回文,而123不是。示例1:输入:x=121输出:true示例2:输入:x=-121输出:false解释:从左向右读,为-121。从右向左读,为121-。因此......
  • 前员工窃华为芯片机密,14人被捕 ,小米被卷入其中 | 百能云芯
    一起窃取芯片机密的案件引起了科技产业的广泛关注。据上海市公安局经济犯罪侦查总队通报,上海警方成功侦破了一起侵犯芯片技术商业秘密案,抓获了14名犯罪嫌疑人。在这宗案件中,华为的前员工离职后创立了一家名为“尊湃通讯”的公司,通过引诱多名原华为研发人员获取技术消息,将其应用于尊......
  • LeetCode-17 电话号码的字母组合
    LeetCode-17电话号码的字母组合给定一个仅包含数字2-9的字符串,返回所有它能表示的字母组合。答案可以按任意顺序返回。给出数字到字母的映射如下(与电话按键相同)。注意1不对应任何字母。示例1:输入:digits="23"输出:["ad","ae","af","bd","be","bf","cd","ce&qu......
  • LeetCode-15 三数之和
    LeetCode-15三数之和给你一个整数数组nums,判断是否存在三元组[nums[i],nums[j],nums[k]]满足i!=j、i!=k且j!=k,同时还满足nums[i]+nums[j]+nums[k]==0。请你返回所有和为0且不重复的三元组。**注意:**答案中不可以包含重复的三元组。示例1:输入:nums=[-1......
  • 软件设计14
    [实验任务一]:婚介所婚介所其实就是找对象的一个代理,请仿照我们的课堂例子“论坛权限控制代理”完成这个实际问题,其中如果年纪小于18周岁,婚介所会提示“对不起,不能早恋!”,并终止业务。实验要求:1. 提交类图;  2. 提交源代码;publicabstractclassCenter{    protec......
  • 12.14
    实验8Flink初级编程实践 1.实验目的(1)通过实验掌握基本的Flink编程方法。(2)掌握用IntelliJIDEA工具编写Flink程序的方法。2.实验平台(1)Ubuntu18.04(或Ubuntu16.04)。(2)IntelliJIDEA。(3)Flink1.9.1。3.实验步骤(1)使用IntelliJIDEA工具开发WordCount程序在Linux系统中安装In......
  • 『LeetCode』8. 字符串转换整数 (atoi) String to Integer (atoi)
    题目描述请你来实现一个myAtoi(strings)函数,使其能将字符串转换成一个32位有符号整数(类似C/C++中的atoi函数)。函数myAtoi(strings)的算法如下:读入字符串并丢弃无用的前导空格检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。确定最终结果是负数还是正......
  • 2023-2024-1 20231413 《计算机基础与程序设计》第十三周学习总结
    2023-2024-120231413《计算机基础与程序设计》第十三周学习总结1.作业信息班级:2023-2024-1-计算机基础与程序设计作业要求:2023-2024-1《计算机基础与程序设计》教学进程目标:自学教材:《C语言程序设计》第13章并完成云班课测试作业正文:https://www.cnblogs.com/Kaifazheju......
  • 2023-2024-1 20231415 《计算机基础与程序设计》第十三周学习总结
    这个作业属于哪个班级https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP/这二个左右要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK13作业目标《C语言程序设计》第12章并完成云班课测试作业正文https://i.cnblogs.com/posts/edit教材内......
  • 2023-2024-1 20231412 《计算机基础与程序设计》第13周学习总结
    2023-2024-120231412《计算机基础与程序设计》第13周学习总结作业信息这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2022-2023-1-CFAP这个作业要求在哪里https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP/homework/13010这个作业的目标《C......