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

Pythonで隣接するすべての要素間の絶対差が最大でkである最長のサブシーケンスを見つけるプログラム。


数値のリストと別の値kが与えられたとします。今回のタスクは、隣接するすべての要素間の絶対差が最大でkである最長のサブシーケンスの長さを見つけることです。

したがって、入力がnums =[5、6、2、1、-6、0、-1、k =4のような場合、出力は6になります。

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

  • 関数update()を定義します。これにはi、xが必要です

  • i:=i + n

  • iがゼロ以外の場合、実行

    • segtree [i]:=segtree [i]の最大値、x

    • i:=i / 2

  • 関数query()を定義します。これにはi、jが必要です

  • ans:=−infinity

  • i:=i + n

  • j:=j + n + 1

  • i

    • i mod 2が1と同じ場合、

      • ans:=ansの最大値、segtree [i]

      • i:=i + 1

    • j mod 2が1と同じ場合、

      • j:=j − 1

      • ans:=ansの最大値、segtree [j]

    • i:=i / 2

    • j:=j / 2

  • ansを返す

  • ここで、main関数で、次のようにします-

  • nums =[5、6、2、1、-6、0、-1]

  • k =4

  • n =2の2乗((長さ(nums)+ 1)+ 1)の2を底とする対数

  • segtree:=[0] * 100000

  • snums:=リスト番号を並べ替える

  • index:=(snums)の各インデックスiと要素xのx:iであるコレクションを作成します

  • ans:=0

  • numsのxごとに、実行します

    • lo:=snumsから左端の位置を返します。ここで、(x − k)は、ソートされた順序を維持しながら挿入できます

    • hi:=(snumsの左端の位置。ここで、(x + k)は、ソートされた順序を維持しながら挿入できます)− 1

    • count:=query(lo、hi)

    • update(index [x]、count + 1)

    • ans:=ansの最大値、カウント+ 1

  • ansを返す

理解を深めるために、次の実装を見てみましょう-

import math, bisect
class Solution:
   def solve(self, nums, k):
      n = 2 ** int(math.log2(len(nums) + 1) + 1)
      segtree = [0] * 100000
      def update(i, x):
         i += n
         while i:
            segtree[i] = max(segtree[i], x)
            i //= 2
         def query(i, j):
            ans = −float("inf")
            i += n
            j += n + 1
            while i < j:
               if i % 2 == 1:
                  ans = max(ans, segtree[i])
                  i += 1
               if j % 2 == 1:
                  j −= 1
                  ans = max(ans, segtree[j])
               i //= 2
               j //= 2
            return ans
         snums = sorted(nums)
         index = {x: i for i, x in enumerate(snums)}
         ans = 0
         for x in nums:
            lo = bisect.bisect_left(snums, x − k)
            hi = bisect.bisect_right(snums, x + k) − 1
            count = query(lo, hi)
            update(index[x], count + 1)
            ans = max(ans, count + 1)
      return ans
ob = Solution()
print(ob.solve([5, 6, 2, 1, −6, 0, −1], 4))

入力

[5, 6, 2, 1, −6, 0, −1], 4

出力

6

  1. 配列内の最大の要素を見つけるPythonプログラム

    この記事では、以下に示す問題ステートメントの解決策について学習します。 問題の説明 −配列が与えられたので、配列の最大要素を計算する必要があります。 ここでは、ループ全体をトラバースして最大の要素を計算し、要素を取得するブルートフォースアプローチを使用します。 以下の実装を観察できます。 例 # largest function def largest(arr,n):    #maximum element    max = arr[0]    # traverse the whole loop    for

  2. リスト内のすべてのペア間の絶対差の合計を見つけるPythonプログラム

    この記事では、特定の問題ステートメントを解決するための解決策とアプローチについて学習します。 問題の説明 リスト入力が与えられた場合、リスト内のすべてのペア間の絶対差の合計を見つける必要があります。 列挙() メソッドは、反復可能オブジェクトにカウンターを追加し、それを列挙オブジェクトタイプの形式で返します。 この方法では、絶対差を含むリスト「diffs」があります。 2つの変数が初期化された2つのループを使用します。 1つはカウンターを反復処理し、もう1つはリスト要素を反復処理します。すべての反復で、要素が類似しているかどうかを確認します。 そうでない場合は、絶対差を見つけて、それ