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

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

2个月前 (09-26)

力扣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. 代码简洁且无需额外质数判断,为典型数学+分治结合的优化解法。

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


原创内容 转载请注明出处

分享给朋友:

相关文章

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

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

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

【力扣2846题】图论+二进制提升:高效解决连通性问题(附C++代码)

【力扣2846题】图论+二进制提升:高效解决连通性问题(附C++代码)

一、题目解读力扣2846题要求解决一个基于图连通性的操作优化问题。给定一个无向图,包含边权重,以及一系列查询,每个查询询问两点间路径的最小操作次数。题目关键在于高效计算路径上权重分布的统计信息,并转化...

LeetCode 2523题解:寻找区间内最小间隔质数对(C++代码)

LeetCode 2523题解:寻找区间内最小间隔质数对(C++代码)

一、题目解读LeetCode 2523题要求在一个给定的整数区间 [left, right] 内,找到间隔最小的两个质数(即相邻质数的差值最小),并返回这对质数。若区间内不存在两个质数,则返回 [-1...

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

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

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

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

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

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

力扣1643题:第K小字典序路径(附C++代码与解题思路)

力扣1643题:第K小字典序路径(附C++代码与解题思路)

一、题目解读本题要求生成从原点(0, 0)到目标坐标(destination[0], destination[1])的路径中,字典序第K小的路径。路径仅由向下字符'V'(代表垂直移动)...

发表评论

访客

看不清,换一张

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