Giả sử chúng ta có một danh sách các số được gọi là nums, chúng ta phải tìm độ dài của danh sách dài nhất trong đó 2 * tối thiểu của danh sách con> tối đa của danh sách con.
Vì vậy, nếu đầu vào giống như nums =[10, 2, 6, 6, 4, 4], thì đầu ra sẽ là 4, vì danh sách con [6, 6, 4,4] là danh sách con dài nhất chứa các tiêu chí dưới dạng 2 * 4> 6.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau−
-
ret:=0
-
xác định hai hàng đợi kết thúc kép minq và maxq
-
l:=0, r:=0
-
while r
-
n:=nums [r]
-
trong khi minq và n
-
xóa phần tử cuối cùng khỏi minq
-
-
chèn r vào cuối minq
-
trong khi maxq và n> nums [phần tử cuối cùng của maxq], thực hiện
-
xóa phần tử cuối cùng khỏi maxq
-
-
chèn r vào cuối maxq
-
r:=r + 1
-
trong khi l
-
nếu minq [0] giống với l, thì
-
xóa phần tử đầu tiên của minq
-
-
nếu maxq [0] giống với l thì
-
xóa phần tử đầu tiên của maxq
-
-
l:=l + 1
-
-
ret:=tối đa ret và (r - l)
-
-
trả lại ret
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
Ví dụ
class Solution: def solve(self, nums): from collections import deque ret = 0 minq, maxq = deque(), deque() l, r = 0, 0 while r < len(nums): n = nums[r] while minq and n < nums[minq[-1]]: minq.pop() minq.append(r) while maxq and n > nums[maxq[-1]]: maxq.pop() maxq.append(r) r += 1 while l < r and nums[minq[0]] * 2 <= nums[maxq[0]]: if minq[0] == l: minq.popleft() if maxq[0] == l: maxq.popleft() l += 1 ret = max(ret, r - l) return ret ob = Solution() nums = [10, 2, 6, 6, 4, 4] print(ob.solve(nums))
Đầu vào
[10, 2, 6, 6, 4, 4]
Đầu ra
4