Leetcode.1630 等差子数组

题目链接

Leetcode.1630 等差子数组 Rating : 1422

题目描述

如果一个数列由至少两个元素组成,且每两个连续元素之间的差值都相同,那么这个序列就是 等差数列 。更正式地,数列 s 是等差数列,只需要满足:对于每个有效的 i , s[i+1] - s[i] == s[1] - s[0]都成立。

给你一个由 n个整数组成的数组 nums,和两个由 m个整数组成的数组 lr,后两个数组表示 m组范围查询,其中第 i个查询对应范围 [l[i], r[i]]。所有数组的下标都是 从 0 开始 的。

返回 boolean元素构成的答案列表 answer。如果子数组 nums[l[i]], nums[l[i]+1], ... , nums[r[i]]可以 重新排列 形成 等差数列answer[i]的值就是 true;否则answer[i]的值就是 false

示例 1:

输入:nums = [4,6,5,9,3,7], l = [0,0,2], r = [2,3,5]
输出:[true,false,true]
解释:
第 0 个查询,对应子数组 [4,6,5] 。可以重新排列为等差数列 [6,5,4] 。
第 1 个查询,对应子数组 [4,6,5,9] 。无法重新排列形成等差数列。
第 2 个查询,对应子数组 [5,9,3,7] 。可以重新排列为等差数列 [3,5,7,9] 。

示例 2:

输入: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]
输出:[false,true,false,false,true,true]

提示:
  • n == nums.length
  • m == l.length
  • m == r.length
  • 2 < = n < = 500 2 <= n <= 500 2<=n<=500
  • 1 < = m < = 500 1 <= m <= 500 1<=m<=500
  • 0 <= l[i] < r[i] < n
  • − 1 0 5 < = n u m s [ i ] < = 1 0 5 -10^5 <= nums[i] <= 10^5 105<=nums[i]<=105

解法:排序+模拟

我们对于每一个查询区间 [ l[i] , r[i] ]都截取出来,形参一个新的列表 a,对 a进行排序。

判断 a中的相邻元素的差值 d是否都是相等的。如果 d都是相等的,那么这一段就是等差数列;反之则不是。

时间复杂度: O ( m ∗ n l o g n ) O(m * nlogn) O(mnlogn)

C++代码:

class Solution {
public:
    vector<bool> checkArithmeticSubarrays(vector<int>& nums, vector<int>& l, vector<int>& r) {
        int n = l.size();
        vector<bool> ans(n);

        for(int i = 0;i < n;i++){
            int left = l[i] , right = r[i];

            vector<int> a(nums.begin()+left,nums.begin() + right + 1);

            sort(a.begin(),a.end());

            bool ok = true;
            int d = a[1] - a[0];
            for(int j = 1;j < a.size() - 1;j++){
                if(a[j+1] - a[j] != d){
                    ok = false;
                    break;
                }
            }
            ans[i] = ok;
        }

        return ans;
    }
};

Python代码:

class Solution:
    def checkArithmeticSubarrays(self, nums: List[int], l: List[int], r: List[int]) -> List[bool]:
        n = len(l)
        ans = n * [False]
        for i in range(0,n):
            left , right = l[i] , r[i]
            a = nums[left:right+1]
            a.sort()

            ok = True
            d = a[1] - a[0]
            for j in range(1,len(a) - 1):
                if a[j + 1] - a[j] != d:
                    ok = False
                    break
            ans[i] = ok

        return ans            
            

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值