等差数列的判定

该C++代码输入一个整数数组,检查从第3个元素开始,每个元素与前两个元素的差是否相等,如果不等则输出No并返回0,否则输出ArithmeticSequence。

这题就是求相减得差是否相等,不一样输出No并return 0,最后输出Arithmetic Sequence就可以了。

注意!!!:每一个数都得大于等于3!!!

上代码:

#include <bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    int a[n+5];
    for(int i=1;i<=n;i++){
        cin>>a[i];
        if (i>=3&&a[i]-a[i-1]!=a[i-1]-a[i-2]){
            cout<<"No";
            return 0;
        }
    }
    cout<<"Arithmetic Sequence";
    return 0;
}

### C++ 不用排序解决等差数列 要在不使用排序的情况下判断一组数字是否构成等差数列,我们可以利用数学性质和哈希表来优化算法。 #### 等差数列的定义 等差数列是指相邻两项之间的差值相等的一系列数字。例如 `[1, 3, 5]` 就是一个公差为 `2` 的等差数列。 #### 解决方案步骤 假设我们有一个数组 `nums`: 1. **计算最大值和最小值**: - 遍历整个数组找到其中的最大元素 (`max_num`) 和最小元素 (`min_num`)。 2. **检查边界条件**: - 如果所有元素都相同,则它们构成了一个公差为0的等差数列; - 若 `(max_num - min_num) % (n-1)` 结果不是整除的情况直接返回 `false` (这里 n 表示输入序列长度),因为这表示无法形成等差间隔; 3. **构造理想集合并验证成员存在性** - 使用公式:`expected_element = min_num + i * common_difference` 其中 `common_difference=(max-1)` - 检查每个预期项是否存在原列表里,并保证无重复出现(可通过set/setbit位图等方式) 4. **结果判定**: - 成功匹配全部理论数值则确认其为有效等差排列。 下面是具体的代码实现: ```cpp #include <unordered_set> using namespace std; bool isArithmeticSequence(vector<int>& nums){ if(nums.size() <= 1) return true; int maxNum = INT_MIN; // 最大值初始化 int minNum = INT_MAX; // 最小值初始化 for(auto num : nums){ maxNum = max(maxNum,num); minNum = min(minNum,num); } unordered_set<int> elements(begin(nums), end(nums)); if(elements.size()!=nums.size())//有重复说明不可能成为合法AP(除非全同),提前结束 return false; double d=double((maxNum-minNum))/(nums.size()-1); //特判d为非整形情况以及空集、单点集等情况 if(d!=floor(d)||elements.empty()) return false; for(int i=0;i<nums.size();++i){ if(!elements.count(static_cast<int>(round(i*d+minNum)))) return false; } return true; } ``` 这个解决方案的时间复杂度接近 O(n),比基于排序的方法更高效,尤其是在处理大数据量的时候。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值