题目:
给你一个数字数组 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)的排序这样会更好,但是目前我就会选择排序和这个冒泡