题目
标题和出处
标题:判断能否形成等差数列
难度
2 级
题目描述
要求
如果一个数列中,任意相邻两项的差都相等,那么这个数列就称为等差数列。
给定数字数组 arr \texttt{arr} arr,如果可以重新排列数组形成等差数列,返回 true \texttt{true} true,否则返回 false \texttt{false} false。
示例
示例 1:
输入:
arr
=
[3,5,1]
\texttt{arr = [3,5,1]}
arr = [3,5,1]
输出:
true
\texttt{true}
true
解释:对数组重新排序得到
[1,3,5]
\texttt{[1,3,5]}
[1,3,5] 或者
[5,3,1]
\texttt{[5,3,1]}
[5,3,1],任意相邻两项的差分别为
2
\texttt{2}
2 或
-2
\texttt{-2}
-2,可以形成等差数列。
示例 2:
输入:
arr
=
[1,2,4]
\texttt{arr = [1,2,4]}
arr = [1,2,4]
输出:
false
\texttt{false}
false
解释:无法通过重新排序得到等差数列。
数据范围
- 2 ≤ arr.length ≤ 1000 \texttt{2} \le \texttt{arr.length} \le \texttt{1000} 2≤arr.length≤1000
- -10 6 ≤ arr[i] ≤ 10 6 \texttt{-10}^\texttt{6} \le \texttt{arr[i]} \le \texttt{10}^\texttt{6} -106≤arr[i]≤106
解法
思路和算法
等差数列的公差可能是 0 0 0、正数或负数。当公差是 0 0 0 时,数列中的所有元素相等;当公差是正数或负数时,数列分别递增和递减。因此只有当数组有序时,才可能形成等差数列。
由于将递减数列反转即可得到递增序列,因此只需要考虑公差非负的情况,即数列中的所有元素相等或数列递增。
首先将数组升序排序,然后遍历排序后的数组,计算每一对相邻元素之差,判断是否形成等差数列:
-
如果相邻元素之差都相等,则排序后的数组形成等差数列,即可以重新排列数组形成等差数列;
-
如果相邻元素之差存在不相等,则排序后的数组不形成等差数列,即不可以重新排列数组形成等差数列。
代码
class Solution {
public boolean canMakeArithmeticProgression(int[] arr) {
Arrays.sort(arr);
int diff = arr[1] - arr[0];
int length = arr.length;
for (int i = 2; i < length; i++) {
if (arr[i] - arr[i - 1] != diff) {
return false;
}
}
return true;
}
}
复杂度分析
-
时间复杂度: O ( n log n ) O(n \log n) O(nlogn),其中 n n n 是数组 arr \textit{arr} arr 的长度。排序需要 O ( n log n ) O(n \log n) O(nlogn) 的时间,遍历数组需要 O ( n ) O(n) O(n) 的时间,总时间复杂度是 O ( n log n ) O(n \log n) O(nlogn)。
-
空间复杂度: O ( log n ) O(\log n) O(logn),其中 n n n 是数组 arr \textit{arr} arr 的长度。排序需要 O ( log n ) O(\log n) O(logn) 的递归调用栈空间。