🌈【LeetCode 1630. 等差子数组 】- JavaScript(暴力+等差子数组)

151 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第9天,点击查看活动详情


说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)

作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金

GitHub:P-J27、 CSDN:PJ想做前端攻城狮

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


【LeetCode 1630. 等差子数组 】- JavaScript(暴力+等差子数组)

题意描述

如果一个数列由至少两个元素组成,且每两个连续元素之间的差值都相同,那么这个序列就是 等差数列 。更正式地,数列 s 是等差数列,只需要满足:对于每个有效的 i , s[i+1] - s[i] == s[1] - s[0] 都成立。

例如,下面这些都是 等差数列

1, 3, 5, 7, 9
7, 7, 7, 7
3, -1, -5, -9

下面的数列 不是等差数列

1, 1, 2, 5, 7

给你一个由 n 个整数组成的数组 nums,和两个由 m 个整数组成的数组 l 和 r,后两个数组表示 m 组范围查询,其中第 i 个查询对应范围 [l[i], r[i]] 。所有数组的下标都是 从 0 开始 的。

返回 boolean 元素构成的答案列表 answer 。如果子数组 nums[l[i]], nums[l[i]+1], ... , nums[r[i]] 可以 重新排列 形成 等差数列 ,answer[i] 的值就是 true;否则answer[i] 的值就是 false 。

示例 1:

输入:nums = [4,6,5,9,3,7], l = [0,0,2], r = [2,3,5] 输出:[true,false,true] 解释: 第 0 个查询,对应子数组 [4,6,5] 。可以重新排列为等差数列 [6,5,4] 。 第 1 个查询,对应子数组 [4,6,5,9] 。无法重新排列形成等差数列。 第 2 个查询,对应子数组 [5,9,3,7] 。可以重新排列为等差数列 [3,5,7,9] 。

思路分析:

一开始看到数据范围,果断暴力了一波,你猜怎么着,还击败2/3.

暴力一波再说~

暴力不是最好的,但它是最快的。你说什么快?我写的快啊~哈哈哈哈。

这种可以暴力解而且速度还很快的题,不暴力不是对不起出题人。

var checkArithmeticSubarrays = function (nums, l, r) {
    var nlen = nums.length,
        len = l.length,
        re = [];
    for (var i = 0; i < len; i++) {
        re.push(isThat(nums.slice(l[i], r[i] + 1)))
    }
    return re;
};

function isThat(arr) {
    var _arr = px(arr),
        d = _arr[1] - _arr[0];
    for (var i = 2; i < _arr.length; i++) {
        if ((_arr[i] - _arr[i - 1]) !== d) return false;
    }
    return true;
}

function px(arr) {
    var len = arr.length;
    while (len > 0) {
        for (var i = 0; i < len - 1; i++) {
            if (arr[len - 1] < arr[i]) {
                var temp = arr[len - 1];
                arr[len - 1] = arr[i];
                arr[i] = temp;
            }
        }
        len--;
    }
    return arr;
}

等差子数组

思路:

当然啦~除了暴力,还是回归正题。~~暴力一时爽,一直暴力一直爽~~~。

一个数组是等差数组,那么它一定满足A = [a0, a0+d, a0+2*d, ... , a0+(m-1)d] 如果能知道a0与d以及m的值,那么就可以推导出整个数列。同样的,也可以检验整个数列。由题目可知,

m = r[i] - l[i] + 1
a0 = min(num[l[i]...r[i]])
am = max(num[l[i]...r[i]])
d = (am-a0)/(m-1)

这样,a0与d以及m的值都已求出来。接下来要检验数列里每一项是否仅出现过一次即可。

var checkArithmeticSubarrays = function (nums, l, r) {
    let i = 0;
    let array = [];
    while (i < l.length) {
        let start = l[i];
        let end = r[i];

        let arr = nums.slice(start, end+1);

        arr = arr.sort((a, b) => b - a);

        let grap = arr[0] - arr[1];
        let flag = true;
        for (var k = 0; k < arr.length - 1; k++) {
            if (arr[k] - arr[k + 1] != grap) {
                flag = false;
                break;
            }
        }
        array.push(flag);

        i++;
    }

    return array;
};

最后:还是暴力大法好啊~


感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。

写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤