zoukankan      html  css  js  c++  java
  • 413 等差数列划分

     

    dp[i] 表示以位置 i 为结尾的等差子数组个数   

    所以对于位置i+1处,其dp[i+1]与dp[i]的关系为dp[i]+1; 为什么要加1呢,比如dp[i]={(1,2,3,4),(2,3,4)}均为以4结尾的,然后现在i+1位置值为5,那么dp[i+1]可以为{(1,2,3,4,5),(2,3,4,5),(3,4,5)},可以发现本来对于dp[i]的(3,4)不构成等差数列,但现在加了5就新加了一个。对于每个i都是如此。都会基于上一个的长度为2的新构成一个新的等差数列。所以会加1

    然后遍历dp数组,求和结果就是所有的子数组数目

    class Solution {
    public:
        int numberOfArithmeticSlices(vector<int>& nums) {
            int n = nums.size();
            if (n < 3) return 0;//小于3不构成等差数列直接返回0
            vector<int> dp(n, 0);
            for (int i = 2; i < n; ++i) {
                if (nums[i] - nums[i-1] == nums[i-1] - nums[i-2]) {
                    dp[i] = dp[i-1] + 1;
                }
            }
            return accumulate(dp.begin(), dp.end(), 0);//求和
            }
    };
    每天进步一点点~
  • 相关阅读:
    换零钞
    空心菱形
    生成回文数
    机器人数目
    胡同门牌号
    七星填数
    阶乘位数
    打印数字
    平方末尾
    数位和
  • 原文地址:https://www.cnblogs.com/libin123/p/14721558.html
Copyright © 2011-2022 走看看