數對之差的最大值 演算法

2021-08-26 22:14:37 字數 1333 閱讀 3324

題目:在陣列中,數字減去它右邊的數字得到乙個數對之差。求所有數對之差的最大值。例如在陣列中,數對之差的最大值是11,是16減去5的結果。

分析:看到這個題目,很多人的第一反應是找到這個陣列的最大值和最小值,然後覺得最大值減去最小值就是最終的結果。這種思路忽略了題目中很重要的一點:數對之差是乙個數字減去它右邊的數字。由於我們無法保證最大值一定位於陣列的左邊,因此這個思路不管用。

於是我們接下來可以想到讓每乙個數字逐個減去它右邊的所有數字,並通過比較得到數對之差的最大值。由於每個數字需要和它後面的o(n)個數字作減法,因此總的時間複雜度是o(n2)。

解法一:轉化成求解子陣列的最大和問題

接下來再介紹一種比較巧妙的解法。如果輸入乙個長度為

n的陣列

numbers

,我們先構建乙個長度為

n-1的輔助陣列

diff

,並且diff[i]

等於numbers[i]-numbers[i+1]

(0<=i)。如果我們從陣列

diff

中的第i

個數字一直累加到第

j個數字(

j > i

),也就是

diff[i] + diff[i+1] + … + diff[j] = (numbers[i]-numbers[i+1]) + (numbers[i + 1]-numbers[i+2]) + ... +(numbers[j] – numbers[j+ 1]) = numbers[i] – numbers[j + 1]。

分析到這裡,我們發現原始陣列中最大的數對之差(即numbers[i] – numbers[j + 1])其實是輔助陣列diff中最大的連續子陣列之和。

**如下:

// maxdiff.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

#include using namespace std;

int maxdiff_solution2(int numbers, unsigned length)

delete diff;

return greatestsum;

} int maxdiff_solution1(int numbers, unsigned length)

if (currentsum<0)

}delete diff;

return greatestsum;

} int _tmain(int argc, _tchar* argv)

; int len =sizeof(a)/sizeof(int);

cout<

數對之差的最大值

題目 在陣列中,數字減去它右邊的數字得到乙個數對之差。求所有數對之差的最大值。例如在陣列中,數對之差的最大值是11,是16減去5的結果。static int maxdiff int arr if arr.length 2 arr null return 0 int max arr 0 intmaxd...

數對之差的最大值

題目 在陣列中,數字減去它右邊的數字得到乙個數對之差。求所有數對之差的最大值。例如在陣列中,數對之差的最大值是11,是16減去5的結果。分析 看到這個題目,很多人的第一反應是找到這個陣列的最大值和最小值,然後覺得最大值減去最小值就是最終的結果。這種思路忽略了題目中很重要的一點 數對之差是乙個數字減去...

數對之差的最大值 子陣列的最大和

問題1 在陣列中,數字減去他的右邊的數字得到乙個數對之差,求所有數對之差的最大值。例如陣列中,數對之差的最大值是11,是16減去5的結果。問題2 給定乙個含有n 個元素的數列,元素有正有負,找出和最小的一組相鄰的書,既給定a n 是的a i a i 1 a j 的和最小。先看第一道題目 如果從頭遍歷...