国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

LeetCode題解:Arithmetic Slices

2019-11-14 10:12:05
字體:
供稿:網(wǎng)友

A sequence of number is called arithmetic if it consists of at least three elements and if the difference between any two consecutive elements is the same.

For example, these are arithmetic sequence:

1, 3, 5, 7, 97, 7, 7, 73, -1, -5, -9

The following sequence is not arithmetic.

1, 1, 2, 5, 7

A zero-indexed array A consisting of N numbers is given. A slice of that array is any pair of integers (P, Q) such that 0 <= P < Q < N.

A slice (P, Q) of array A is called arithmetic if the sequence:A[P], A[p + 1], ..., A[Q - 1], A[Q] is arithmetic. In particular, this means that P + 1 < Q.

The function should return the number of arithmetic slices in the array A.

Example:

A = [1, 2, 3, 4]return: 3, for 3 arithmetic slices in A: [1, 2, 3], [2, 3, 4] and [1, 2, 3, 4] itself.

思路:

依次取差,用來尋找差值的位置。對每組等差數(shù)列,計算子數(shù)列個數(shù)。

題解:

int numberOfArithmeticSlices(const std::vector<int>& A) {    int lastDelta = std::numeric_limits<int>::max();    int currentLongestSliceLength(2);    int totalSlices(0);    auto numSubSlices = [](int sliceLength) {        // For a slice, e.g. 1, 2, 3, 4, 5, the possible sub slices rae        //        //  1, 2, 3; 2, 3, 4; 3, 4, 5       -- (n - 3 + 1) slices        //  1, 2, 3, 4; 2, 3, 4, 5          -- (n - 4 + 1) slices        //  1, 2, 3, 4, 5                   -- (n - n + 1) slices        //        // So the number of subslices are sum(n - 3 + 1, ... n - n + 1) total        // n - 2 items, that is,        //  sum(n + 1, n + 1, ...) - sum(3, ... n),        // or        //  (n + 1) * (n - 2) - (n + 3) * (n - 2) / 2        //        // NOTE: extract (n - 2) out is unwise        if (sliceLength <= 2) {            return 0;        }        return (sliceLength + 1) * (sliceLength - 2) - (sliceLength + 3) * (sliceLength - 2) / 2;    };    for(size_t i = 1; i < A.size(); ++i) {        int delta = A[i] - A[i - 1];        if (delta == lastDelta) {            currentLongestSliceLength++;        } else {            totalSlices += numSubSlices(currentLongestSliceLength);            currentLongestSliceLength = 2;  // two elements at first        }        lastDelta = delta;    }    if (currentLongestSliceLength > 2) {        totalSlices += numSubSlices(currentLongestSliceLength);    }    return totalSlices;}


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 宁城县| 深水埗区| 新郑市| 阿图什市| 同江市| 宁河县| 根河市| 六盘水市| 莱西市| 桃园县| 高阳县| 密山市| 金坛市| 新河县| 金塔县| 孝感市| 桃源县| 龙井市| 砀山县| 海兴县| 麦盖提县| 凌源市| 江油市| 枣强县| 香港 | 阜宁县| 霍山县| 通化县| 邵武市| 花垣县| 扎囊县| 莱西市| 凌海市| 菏泽市| 古蔺县| 阳高县| 东安县| 平昌县| 深水埗区| 太原市| 疏附县|