題目:在陣列中,數字減去它右邊的數字得到乙個數對之差。求所有數對之差的最大值。例如在陣列中,數對之差的最大值是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 的和最小。先看第一道題目 如果從頭遍歷...