给你一个数字数组 arr 。
如果一个数列中,任意相邻两项的差总等于同一个常数,那么这个数列就称为 等差数列 。
如果可以重新排列数组形成等差数列,请返回 true ;否则,返回 false 。
示例 1:
输入:arr = [3,5,1] 输出:true 解释:对数组重新排序得到 [1,3,5] 或者 [5,3,1] ,任意相邻两项的差分别为 2 或 -2 ,可以形成等差数列。
示例 2:
输入:arr = [1,2,4] 输出:false 解释:无法通过重新排序得到等差数列。
提示:
2 <= arr.length <= 1000-10^6 <= arr[i] <= 10^6
class Solution:
def canMakeArithmeticProgression(self, arr: List[int]) -> bool:
arr.sort()
for i in range(1, len(arr) - 1):
if (arr[i] << 1) != arr[i - 1] + arr[i + 1]:
return False
return Trueclass Solution {
public boolean canMakeArithmeticProgression(int[] arr) {
Arrays.sort(arr);
for (int i = 1; i < arr.length - 1; ++i) {
if ((arr[i] << 1) != arr[i - 1] + arr[i + 1]) {
return false;
}
}
return true;
}
}/**
* @param {number[]} arr
* @return {boolean}
*/
var canMakeArithmeticProgression = function (arr) {
arr.sort((a, b) => a - b);
for (let i = 1; i < arr.length - 1; i++) {
if (arr[i] << 1 != arr[i - 1] + arr[i + 1]) return false;
}
return true;
};function canMakeArithmeticProgression(arr: number[]): boolean {
arr.sort((a, b) => a - b);
const n = arr.length;
for (let i = 2; i < n; i++) {
if (arr[i - 2] - arr[i - 1] !== arr[i - 1] - arr[i]) {
return false;
}
}
return true;
}function canMakeArithmeticProgression(arr: number[]): boolean {
const n = arr.length;
const map = new Map<number, number>();
let min = Infinity;
let max = -Infinity;
for (const num of arr) {
map.set(num, (map.get(num) ?? 0) + 1);
min = Math.min(min, num);
max = Math.max(max, num);
}
if (max === min) {
return true;
}
if ((max - min) % (arr.length - 1)) {
return false;
}
const diff = (max - min) / (arr.length - 1);
for (let i = min; i <= max; i += diff) {
if (map.get(i) !== 1) {
return false;
}
}
return true;
}impl Solution {
pub fn can_make_arithmetic_progression(mut arr: Vec<i32>) -> bool {
arr.sort();
let n = arr.len();
for i in 2..n {
if arr[i - 2] - arr[i - 1] != arr[i - 1] - arr[i] {
return false;
}
}
true
}
}use std::collections::HashMap;
impl Solution {
pub fn can_make_arithmetic_progression(arr: Vec<i32>) -> bool {
let n = arr.len() as i32;
let mut min = i32::MAX;
let mut max = i32::MIN;
let mut map = HashMap::new();
for &num in arr.iter() {
*map.entry(num).or_insert(0) += 1;
min = min.min(num);
max = max.max(num);
}
if min == max {
return true;
}
if (max - min) % (n - 1) != 0 {
return false;
}
let diff = (max - min) / (n - 1);
let mut k = min;
while k <= max {
if *map.get(&k).unwrap_or(&0) != 1 {
return false;
}
k += diff;
}
true
}
}int cmp(const void *a, const void *b) {
return *(int *) a - *(int *) b;
}
bool canMakeArithmeticProgression(int *arr, int arrSize) {
qsort(arr, arrSize, sizeof(int), cmp);
for (int i = 2; i < arrSize; i++) {
if (arr[i - 2] - arr[i - 1] != arr[i - 1] - arr[i]) {
return 0;
}
}
return 1;
}