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:
1, 3, 5, 7, 9 7, 7, 7, 7 3, -1, -5, -9
The following sequence is not arithmetic:
1, 1, 2, 5, 7
You are given an array of n
integers, nums
, and two arrays of m
integers each, l
and r
, representing the m
range queries, where the ith
query is the range [l[i], r[i]]
. All the arrays are 0-indexed.
Return a list of boolean
elements answer
, where answer[i]
is true
if the subarray nums[l[i]], nums[l[i]+1], ... , nums[r[i]]
can be rearranged to form an arithmetic sequence, and false
otherwise.
Example 1:
Input: nums =[4,6,5,9,3,7]
, l =[0,0,2]
, r =[2,3,5]
Output:[true,false,true]
Explanation: In the 0th query, the subarray is [4,6,5]. This can be rearranged as [6,5,4], which is an arithmetic sequence. In the 1st query, the subarray is [4,6,5,9]. This cannot be rearranged as an arithmetic sequence. In the 2nd query, the subarray is[5,9,3,7]. This
can be rearranged as[3,5,7,9]
, which is an arithmetic sequence.
Example 2:
Input: nums = [-12,-9,-3,-12,-6,15,20,-25,-20,-15,-10], l = [0,1,6,4,8,7], r = [4,4,9,7,9,10] Output: [false,true,false,false,true,true]
Constraints:
n == nums.length
m == l.length
m == r.length
2 <= n <= 500
1 <= m <= 500
0 <= l[i] < r[i] < n
-105 <= nums[i] <= 105
The problem asks to determine if subarrays within a given array nums
can be rearranged to form an arithmetic sequence. An arithmetic sequence is defined as a sequence with at least two elements where the difference between consecutive elements is constant.
The solution employs a function check
(or a similar function depending on the programming language) to efficiently verify if a subarray satisfies this condition. This function is called repeatedly for each query range specified by l
and r
.
Algorithm:
check
Function:
l
and r
from nums
.Set
(or equivalent data structure in other languages) to store the unique elements of the subarray, efficiently allowing checking for presence of elements later.a1
) and maximum (an
) values in the subarray.d
(if it exists) as (an - a1) / (n - 1)
, where n
is the subarray length. If the division results in a remainder, it means a constant difference doesn't exist, and the function returns false
.a1 + d
) up to the largest element (an
), checking if each element a1 + (i - 1) * d
is present in the set. If any element is missing, it's not an arithmetic sequence, and false
is returned.true
.Main Loop:
l
and r
(using zip
in Python).check
function to determine if the corresponding subarray can be rearranged into an arithmetic sequence.ans
list.ans
list.Time Complexity:
check
function iterates through the subarray once to find the min/max and build the set, which takes O(n) time where n
is the length of the subarray. The check for consecutive elements also takes O(n). Thus, the total time complexity of check
is O(n).m
queries, and for each query, the check
function is called. Therefore, the overall time complexity is O(m * n), where m
is the number of queries and n
is the maximum length of any subarray.Space Complexity:
check
function uses a set to store subarray elements, taking O(n) space.ans
list has a size equal to the number of queries m
, requiring O(m) space.Example Code (Python):
class Solution:
def checkArithmeticSubarrays(self, nums: List[int], l: List[int], r: List[int]) -> List[bool]:
def check(nums, l, r):
n = r - l + 1
s = set(nums[l:l+n])
a1, an = min(nums[l:l+n]), max(nums[l:l+n])
d, mod = divmod(an - a1, n - 1)
return mod == 0 and all((a1 + (i - 1) * d) in s for i in range(1, n))
return [check(nums, left, right) for left, right in zip(l, r)]
The code in other languages follows a similar structure, with minor syntactic variations to accommodate language-specific features. The core algorithm remains consistent.