Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで値の範囲の条件を持つ最長のサブリストの長さを見つけるプログラム


numsと呼ばれる数値のリストがあるとすると、最長のサブリストの長さを見つける必要があります。ここで、2 *(サブリストの最小値)>(サブリストの最大値)。

したがって、入力がnums =[10、2、6、6、4、4]のような場合、サブリスト[6、6、4、4]は指定されたものを満たす最長のサブリストであるため、出力は4になります。基準(2 * 4)> 6.

これを解決するには、次の手順に従います-

  • ret:=0
  • minq:=空の両端キュー
  • maxq:=空の両端キュー
  • l:=0
  • r:=0
  • r
  • n:=nums [r]
  • minqが空ではなく、n
  • minqから最後の要素を削除する
  • minqの最後にrを挿入
  • maxqが空ではなく、n> nums [maxqの最後の要素]の場合、do
    • maxqから最後の要素を削除する
  • maxqの最後にrを挿入
  • r:=r + 1
  • l
  • minq [0]がlと同じ場合、
    • minqの左のアイテム
  • maxq [0]がlと同じ場合、
    • maxqの最後のアイテムを削除する
  • l:=l + 1
  • ret:=retの最大値と(r --l)
  • return ret
  • 理解を深めるために、次の実装を見てみましょう-

    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))

    入力

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

    出力

    4

    1. Pythonで最長の個別のサブリストの長さを見つけるプログラム

      numsという番号のリストがあり、そのすべての要素が一意である最も長い連続したサブリストの長さを見つける必要があるとします。 したがって、入力がnums =[6、2、4、6、3、4、5、2]のような場合、一意の要素の最長リストは[6、3、4、5]であるため、出力は5になります。 、2]。 これを解決するには、次の手順に従います- head:=0、dct:=新しいマップ max_dist:=0 各インデックスiとnumsの要素numについて、実行します =headの場合、 ヘッド:=dct [num] + 1 dct [num]:=i ma

    2. Pythonで最長の連続シーケンスの長さを見つけるプログラム

      並べ替えられていない数値の配列があるとすると、連続する要素の最長シーケンスの長さを見つける必要があります。 したがって、入力がnums =[70、7、50、4、6、5]の場合、連続する要素の最長シーケンスは[4、5、6、7]であるため、出力は4になります。したがって、その長さを返します:4。 これを解決するには、次の手順に従います- nums:=numsのすべての一意の要素 max_cnt:=0 numsのnumごとに、実行します num-1がnumsにない場合、 cnt:=0 numがnumsに存在する間、実行します num:=num + 1