JS算法练习-Day09-判断能否形成等差数列

35 阅读2分钟

题目:

给你一个数字数组 arr 。
如果一个数列中,任意相邻两项的差总等于同一个常数,那么这个数列就称为 等差数列 。
如果可以重新排列数组形成等差数列,请返回 true ;否则,返回 false 。

示例 1:

输入: arr = [3,5,1]
输出: true
解释: 对数组重新排序得到 [1,3,5] 或者 [5,3,1] ,任意相邻两项的差分别为 2 或 -2 ,可以形成等差数列。

示例 2:

输入: arr = [1,2,4]
输出: false

实现:

/**
 * 判断数组是否能重新排列形成等差数列
 * @param {number[]} arr 输入的数字数组
 * @return {boolean} 是否可以构成等差数列
 */
var canMakeArithmeticProgression = function(arr) {
    // 边界情况:如果数组长度等于2,任意两个数都能构成等差数列
    if(arr.length === 2) return true;
    
    // 使用冒泡排序对数组进行升序排序
    // 外层循环控制排序轮次
    for(let i = 0; i < arr.length; i++) {
        // 内层循环控制每轮比较次数
        // 已经排序好的元素不需要再比较(arr.length - i - 1)
        for(let j = 0; j < arr.length - i - 1; j++) {
            // 如果前一个元素比后一个大,则交换它们的位置
            if(arr[j] > arr[j + 1]) {
                // 使用解构赋值交换元素
                [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
            }
        }
    }
    
    // 检查排序后的数组是否为等差数列
    // 从第二个元素开始,检查相邻元素的差是否一致
    for(let i = 1; i < arr.length - 1; i++) {
        // 如果发现任意两个相邻元素的差不等于前两个元素的差
        if(arr[i] - arr[i - 1] !== arr[i + 1] - arr[i]) {
            // 直接返回,不再继续检查
            return false;
        }
    }
    // 如果循环结束,意味着任意两个相邻元素的差都等于前两个元素的差,那满足等差数列定义
    return true;
};
  • 我看很多大家都是直接使用的快速排序,直接使用数组的sort方法,但是我觉得算法练习还是要少用内置方法的好,所以我自己手写了一个冒泡排序但是冒泡排序的时间复杂度是O(n²),可以找个O(n)的排序这样会更好,但是目前我就会选择排序和这个冒泡