著者: 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 < n
nums[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 日 - すべてがうまくいきますように