给定数组,求满足区间内任意元素的gcd=1的最长连续子区间长度。c++求解
时间: 2024-10-14 22:09:02 浏览: 108
给定一个整数数组,你需要找到其中最长的连续子数组,其内的任意两个元素的最大公约数 (Greatest Common Divisor, GCD) 为1。这个问题可以通过动态规划和数学技巧来解决。这里是一个简单的C++算法:
1. 首先,创建一个函数 `__gcd` 来计算两个数的最大公约数,可以使用辗转相除法(欧几里得算法)。
```cpp
int gcd(int a, int b) {
if (b == 0)
return a;
return gcd(b, a % b);
}
```
2. 然后,定义一个二维数组 `dp`,其中 dp[i] 表示以索引 i 结束的子数组中所有元素的最大公约数。初始化 dp[0] = 1,因为单独一个元素的 GCD 一定是 1。
3. 接下来,遍历数组从第二个元素开始,对于每个元素 `nums[j]`,检查它的 GCD 是否与前一个元素 `nums[j - 1]` 相同。如果不同,则更新 `dp[j] = j - i + 1`,表示之前的子数组长度加上当前元素的新起点;如果相同,说明可以继续这个子序列,所以 `dp[j] = dp[j - 1]`。
4. 最后,遍历整个 dp 数组,记录下最大值作为结果。
```cpp
int longestSubarray(vector<int>& nums) {
vector<int> dp(nums.size(), 1); // 初始化为单元素子区间的GCD为1
int maxLen = 1; // 存储最长子数组长度
for (int i = 1; i < nums.size(); ++i) {
dp[i] = __gcd(dp[i - 1], nums[i]);
if (dp[i] == 1) {
maxLen = max(maxLen, i + 1); // 如果遇到GCD为1的子数组,更新maxLen
}
}
return maxLen;
}
```
阅读全文