当前位置:首页 > 力扣 > 力扣932题:利用分治算法和质数特性完美解决

力扣932题:利用分治算法和质数特性完美解决

16小时前

力扣932题:利用分治算法和质数特性完美解决 分治策略 递归 力扣题解 第1张

一、题目解读

力扣932题要求生成一个长度为n的,由正整数组成的数组,其中任意相邻元素的和均为质数。例如,n=5时,数组[1,4,2,3,5]满足条件,因为1+4=5、4+2=6、2+3=5、3+5=8均为质数。题目需设计高效算法,避免暴力枚举所有组合,需利用数学性质或分治策略优化。

二、解题思路

采用分治算法,结合质数的数学特性,将问题分解为奇数偶数两部分递归求解。核心思想:

1. 基础情况:当n=1时,直接返回[1]。

2. 分治递归:

○ 若n为奇数,递归生成长度为(n+1)/2的奇数部分数组,每个元素乘以2后减1;

○ 若n为偶数,递归生成长度为n/2的偶数部分数组,每个元素乘以2。

3. 合并两部分结果,保证相邻元素和为质数。

关键在于利用质数的分布规律:奇数与偶数乘积为奇数(质数候选),且通过分治减少重复计算。

三、解题步骤

1. 基础情况处理:若n=1,返回单元素数组{1}。

2. 分治递归:

○ 当n为奇数时,递归生成奇数部分beautifulArray((n+1)/2),每个元素num变为num*2-1(例如,[1,3] → [12-1,32-1] = [1,5])。

○ 当n为偶数时,递归生成偶数部分beautifulArray(n/2),每个元素num变为num*2(例如,[2,4] → [22,42] = [4,8])。

3. 合并结果:将奇数部分与偶数部分交替拼接,形成最终数组。

4. 验证质数条件:由于奇数2-1与偶数2的相邻和均为奇数(可能质数),且递归生成的子数组已满足条件,合并后自然满足题目要求。

四、代码与注释

class Solution {  
public:  
    vector<int> beautifulArray(int n) {  
        // 基础情况处理  
        if (n == 1) return {1}; // 单个元素直接返回  

        // 分治处理奇数部分和偶数部分  
        vector<int> odd = beautifulArray((n + 1) / 2);  // 递归生成奇数部分  
        vector<int> even = beautifulArray(n / 2);       // 递归生成偶数部分  

        // 合并结果:奇数部分*2-1 + 偶数部分*2  
        vector<int> res;  
        for (int num : odd) res.push_back(num * 2 - 1); // 奇数部分转换  
        for (int num : even) res.push_back(num * 2);    // 偶数部分转换  
        return res;  
    }  
};

注释说明:

● if (n == 1):基础情况避免递归溢出;

● (n + 1) / 2:当n为奇数时,确保奇数部分长度正确(例如,n=5时生成长度为3的奇数部分);

● 合并时交替添加奇偶部分元素,保证相邻元素和为奇数,利用质数多为奇数的特性。

五、总结

本文通过分治算法与质数特性,将问题分解为更易处理的奇偶子问题,递归构建Beautiful Array。核心优势在于:

1. 利用数学规律(偶数2与奇数2-1的和为奇数)确保质数条件;

2. 分治减少重复计算,时间复杂度O(nlogn),空间复杂度O(logn)(递归栈);

3. 代码简洁且无需额外质数判断,为典型数学+分治结合的优化解法。

适用于需高效生成符合特定数学规律的数组场景,适合算法竞赛与数学思维训练。


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣35:二分法在搜索插入位置中的运用

力扣35:二分法在搜索插入位置中的运用

有序数组的定位在一个严格递增的数字序列中,每个元素都有其确定的位置。当新元素试图加入时,我们需要回答两个问题:它是否已经存在?如果不存在,它应该插入在哪里?这道题要求我们在O(log n)时间内完成这...

力扣965题深度解析:单值二叉树的判断技巧

力扣965题深度解析:单值二叉树的判断技巧

重新解读题目 判断一棵二叉树是否为“单值二叉树”,即所有节点的值是否完全相同。题目看似简单,实则考验对树结构递归特性的理解。若一棵树的所有节点值相同,其必然满足:根节点与左右子树的值一致,且...

力扣面试题02.05链表相加:虚拟头节点+迭代解法的详细解析

力扣面试题02.05链表相加:虚拟头节点+迭代解法的详细解析

一、题目解读力扣面试题02.05要求将两个链表表示的整数相加,每个节点存储一位数字(逆序),结果同样以链表形式返回。例如,链表1为7→2→4,链表2为5→6→3,相加结果应为2→9→8→7。题目难点在...

力扣2588题解:利用前缀异或和与哈希表求解美丽子数组问题

力扣2588题解:利用前缀异或和与哈希表求解美丽子数组问题

一、题目解读力扣2588题要求计算给定数组中“美丽子数组”的数量。所谓“美丽子数组”,是指子数组的异或和为0。题目关键在于理解子数组异或和的性质,并通过高效算法统计符合条件的子数组数量。二、解题思路采...

洛谷P1438题解:基于线段树的等差数列

洛谷P1438题解:基于线段树的等差数列

一、题目解读洛谷P1438题要求处理数列的区间更新与单点查询操作,其中更新方式为给定区间内元素按等差数列递增。传统暴力修改会因多次区间遍历导致超时,需设计高效数据结构——线段树,结合等差数列性质实现O...

LeetCode 1031题解析:不重叠子数组最大和的解法(前缀和+动态规划)

LeetCode 1031题解析:不重叠子数组最大和的解法(前缀和+动态规划)

一、题目解读LeetCode 1031题要求在不重叠的前提下,从给定数组nums中寻找两个长度分别为firstLen和secondLen的连续子数组,使其和最大。题目强调子数组必须不重叠,即两个子数组...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。