Computer >> Computer tutorials >  >> Programming >> Python

Program to find length of longest sublist with value range condition in Python


Suppose we have a list of numbers called nums, we have to find the length of the longest sublist where 2 * (minimum of sublist) > (maximum of sublist).

So, if the input is like nums = [10, 2, 6, 6, 4, 4], then the output will be 4, because the sublist [6, 6, 4, 4] is the longest sublist that meet the given criteria (2*4) > 6.

To solve this, we will follow these steps −

  • ret := 0
  • minq := an empty double ended queue
  • maxq := an empty double ended queue
  • l := 0
  • r := 0
  • while r < size of nums, do
    • n := nums[r]
    • while minq is not empty and n < nums[last element of minq], do
      • delete last element from minq
    • insert r at the end of minq
    • while maxq is not empty and n > nums[last element of maxq], do
      • delete last element from maxq
    • insert r at the end of maxq
    • r := r + 1
    • while l < r and nums[minq[0]] * 2 <= nums[maxq[0]], do
      • if minq[0] is same as l, then
        • left left item from minq
      • if maxq[0] is same as l, then
        • delete last item of maxq
      • l := l + 1
    • ret := maximum of ret and (r - l)
  • return ret

Example

Let us see the following implementation to get better understanding −

from collections import deque
def solve(nums):
   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

nums = [10, 2, 6, 6, 4, 4]
print(solve(nums))

Input

[10, 2, 6, 6, 4, 4]

Output

4