413. Arithmetic Slices

来源:互联网 发布:淘宝网易云音乐会员1元 编辑:程序博客网 时间:2024/06/06 03:53

 起初发现这道题很像子串问题,我们只需要求出每个连续的Slices的长度,然后计算每个连续Slices的子串个数即可。假设某个连续的串长度为N,那么它所包含的子串个数为

(N-1)*(N-2)/2,很简单的数学问题

class Solution {public:int numberOfArithmeticSlices(vector<int>& A) {if (A.size() < 3)return 0;else{int j = 0;int num[100] = {};int dif = A[1] - A[0];int l = 2;for (int i = 2; i < A.size(); ++i){if ((A[i] - A[i - 1]) == dif)l++;else{if (l>2)num[j++] = l;dif = A[i] - A[i - 1];l = 2;}}if (l>2)num[j++] = l;if (j == 0)return 0;else{int sum = 0;for (int i = 0; i < j; ++i)sum += (num[i] - 1)*(num[i] - 2) / 2;return sum;}}}};


    后来发现只击败了8%的人,觉得会有更好的方法,看了一下发现了下面这种动态规划,思想是连续的串每增加一个数字,那么子串个数就会加1,然后直接加到结果里面,其实和我上面的思路差不多,只不过我是把子串长度存在数组里面,最后再计算,这样的优点是知道有多少个连续子串,并且每个子串的长度都知道。然而这道题不需要,不过重新交了一下发现时间还是没变,可能是测试案例太小了吧。

class Solution {public:int numberOfArithmeticSlices(vector<int>& A) {if (A.size() < 3)return 0;else{int sum = 0;vector<int>dp(A.size(), 0);int dif = A[1] - A[0];for (int i = 2; i < A.size();++i)if (A[i] - A[i - 1] == dif){dp[i] = dp[i - 1] + 1;sum += dp[i];}elsedif = A[i] - A[i - 1];return sum;}}};



0 0