1. 問題描述:
如果乙個數列由至少兩個元素組成,且每兩個連續元素之間的差值都相同,那麼這個序列就是等差數列 。更正式地,數列 s 是等差數列,只需要滿足:對於每個有效的 i , s[i+1] - s[i] == s[1] - s[0] 都成立。
例如,下面這些都是 等差數列 :
1, 3, 5, 7, 9
7, 7, 7, 7
3, -1, -5, -9
下面的數列不是等差數列:
1, 1, 2, 5, 7
給你乙個由 n 個整數組成的陣列 nums,和兩個由 m 個整數組成的陣列 l 和 r,後兩個陣列表示 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
1 <= m <= 500
0 <= l[i] < r[i] < n
-105 <= nums[i] <= 105
2. 思路分析:
一開始比較容易想到的是暴力破解的思路,依次檢查nums陣列中 [l[i], r[i]]範圍的數字排序之後是否可以構成等差序列,因為使用的是python語言所以我們可以在遍歷的時候可以使用切片操作獲取陣列中的 [l[i], r[i]]範圍的數字,然後使用sorted函式對其排序,檢查相鄰兩個元素的差是否是相等的即可,沒有想到後面竟然通過了,可能還會有其他更加優化的方法吧
3. **如下:
from typing import list
class solution:
def check(self, nums: list[int]):
diff = nums[1] - nums[0]
for i in range(2, len(nums)):
if nums[i] - nums[i - 1] != diff: return false
return true
def checkarithmeticsubarrays(self, nums: list[int], l: list[int], r: list[int]) -> list[bool]:
# 一開始的時候想到暴力破解
res = list()
for i in range(len(l)):
start, end = l[i], r[i]
# 切片操作
t = sorted(nums[start: end + 1])
return res
LeetCode 1630 等差子陣列
如果乙個數列由至少兩個元素組成,且每兩個連續元素之間的差值都相同,那麼這個序列就是 等差數列 更正式地,數列 s 是等差數列,只需要滿足 對於每個有效的 i s i 1 s i s 1 s 0 都成立。例如,下面這些都是 等差數列 1,3 5,7 97,7,7,73,1,5 9下面的數列 不是等差數...
bzoj2124 等差子串行 暴力
題意自己看 正解是hash 樹狀陣列 但我太蒟蒻了 不會寫 只好寫暴力了 維護乙個0,1字串 0表示這個字元在左邊 1表示不再左邊 列舉兩邊是否有 0,1 對稱分布 雖然複雜度超了 但的確能過 資料水 include include include using namespace std int n...
最長回文子串(暴力破解)
給定乙個字串s,找到s中最長的回文子串。此解題方法為暴力破解,通過找到乙個字元,然後分別向兩邊擴充套件,直到找到最長的回文子串。char longestpalindrome char s if right left 1 len 長度為偶數時 for int i 0 ii if right left ...