【LeetCode】2016. 増加要素間の最大差

著者: Negative Xue Mingzhu
id: fuxuemingzhu
個人ブログ: http://fuxuemingzhu.cn/
キーワード: LeetCode、LeetCode、ソリューション、明確な説明、アルゴリズム、インクリメント、差分、Python、C++


トピックのアドレス: https://leetcode-cn.com/problems/maximum-difference-between-increasing-elements/

トピックの説明

添字が0から始まる整数配列nums配列のサイズが である場合、取得できる最大の差nを計算してください。ここで、 とnums[j] - nums[i]0 <= i < j < nnums[i] < nums[j]

最大の差を返しますi要件を満たす合計がない場合にj戻ります-1

 

例 1:

入力: nums = [7, 1 , 5 ,4]
出力: 4
説明:
最大の差は、i = 1 および j = 2、nums[j] - nums[i] = 5 - 1 = 4 のときに発生します。
i = 1 および j = 0 の場合、nums[j] - nums[i] = 7 - 1 = 6 > 4 ですが、i > j は質問の要件を満たしていないため、6 は有効な答えではないことに注意してください。

例 2:

入力: nums = [9,4,3,2]
出力: -1
説明: 
i < j および nums[i] < nums[j] の 2 つの条件を同時に満たす i、j の組み合わせはありません。

例 3:

入力: nums = [ 1 ,5,2, 10 ]
出力: 9
説明:
最大の差は、i = 0 および j = 3、nums[j] - nums[i] = 10 - 1 = 9 のときに発生します。

 

ヒント:

  • n == nums.length
  • 2 <= n <= 1000
  • 1 <= nums[i] <= 109

問題解決法

方法 1: 暴力

すべてのi 、 ji 、 j を二重ループする、総当たりの方法を探すことができます。j、最大の差を見つけます。

二重ループの時間計算量はO ( N 2 ) O(N^2)です。O ( N2 )、タイトルに示されているデータ範囲は 1000、この時点での合計サイクルは1 0 6 10^61 06、力によって座屈することができます。

class Solution(object):
    def maximumDifference(self, nums):
        N = len(nums)
        res = float("-inf")
        for i in range(N):
            for j in range(i + 1, N):
                if nums[i] < nums[j]:
                    res = max(res, nums[j] - nums[i])
        return -1 if res == float("-inf") else res

方法 3: 以前の最小値を保持する

ある位置までトラバースしているときに気づきました。i の場合、その前に最小値を記録するだけで済みます。

したがって、検出された最小値を保持する変数を使用します。

時間計算量はO ( N ) O(N)O ( N )

class Solution(object):
    def maximumDifference(self, nums):
        N = len(nums)
        prevMin = nums[0]
        res = -1
        for i in range(1, N):
            if nums[i] > prevMin:
                res = max(res, nums[i] - prevMin)
            prevMin = min(prevMin, nums[i])
        return res

日にち

2022 年 2 月 26 日 - すべてがうまくいきますように

おすすめ

転載: blog.csdn.net/fuxuemingzhu/article/details/123155869