刷题笔记
1630. Arithmetic Subarrays
题目
A sequence of numbers is called arithmetic if it consists of at least two elements, and the difference between every two consecutive elements is the same. More formally, a sequence s is arithmetic if and only if s[i+1] - s[i] == s[1] - s[0] for all valid i.
For example, these are arithmetic sequences:
思路
- 首先是对题意的理解,这道题有点绕,是要从后面两个数组中通过一组对应下标的数取出第一个数组中的一段数据,然后判断这段数据排序后是否可以形成等差数列。
- 那么理清题意之后就可以拆分为简单的几步:首先是要在最外层循环中取出后两个数组中的下标信息,那么可以确定最外层循环的循环次数为l或者r的数组长度。
- 然后创建一个子数组,循环取出第一个数组中的数放入子数组中。
- 对子数组进行排序。
- 判断排序后的子数组是否是等差数列。
- 判断等差数列的方法我在这里抽象出一个静态方法isArithmetic()。
代码实现
class Solution {
public List<Boolean> checkArithmeticSubarrays(int[] nums, int[] l, int[] r) {
List<Boolean> ans = new ArrayList<>();
int n = l.length;
for (int i = 0; i < n; i++) {
int left = l[i];
int right = r[i];
int[] subArray = new int[right - left + 1];
for (int j = left, k = 0; j <= right; j++, k++) {
subArray[k] = nums[j];
}
Arrays.sort(subArray);
ans.add(isArithmetic(subArray));
}
return ans;
}
public static boolean isArithmetic (int[] subArray) {
int n = subArray.length;
boolean flag = true;
for (int i = 1; i < n; i++) {
if (subArray[i] - subArray[i - 1] != subArray[1] - subArray[0])
flag = false;
}
return flag;
}
}
最后运行结果差强人意。再来看看most vote的解法。
额,好吧,most vote的解法跟我几乎一样,只有一个地方有点小差别:
在isArithmetic方法中,做一点小改动,可以有一些小的提升:
public static boolean ifArithmetic (int[] subArray) {
int n = subArray.length;
boolean flag = true;
int delta = subArray[1] - subArray[0];
for (int i = 1; i < n; i++) {
if (subArray[i] - subArray[i - 1] != delta)
flag = false;
}
return flag;
}
就是把差值提前计算出来,然后就不用每一次循环都计算一遍delta了。
占用空间提升了7%。