陣列中元素差的最大值

2022-02-26 10:12:48 字數 3007 閱讀 7525

這道題是2016美團面試題:

1.給定乙個陣列arr,陣列長度為len,求滿足 0 <= a <= b < len的 arr[b] - arr[a]最大值。

你的想法:讓每乙個數字減去它右邊的數字,並通過比較得到數對的最大值,時間複雜度(o^2),這應該是面試官不想要的。

解法一:分治法(遞迴實現)

假設把陣列分成兩個子陣列,用左陣列最大的減去右陣列最小的,最大值有三種情況:

(1)被減數和減數都在第乙個子陣列中,即第乙個子陣列中的數對之差的最大值;

(2)被減數和減數都在第二個子陣列中,即第二個子陣列中數對之差的最大值;

(3)被減數在第乙個子陣列中,是第乙個子陣列的最大值;減數在第二個子陣列中,是第二個子陣列的最小值。

(1)、(2)、(3)中,這三個差值的最大者就是整個陣列中數對之差的最大值。

1 #include 2 #include 

3 #include 4

//解法1: 分治法(遞迴實現)

5int max_find(int *s,int *e,int *max,int *min)612

int *mid = s+(e-s)/2;13

14int

maxleft,minleft;

15int left = max_find(s,mid,&maxleft,&minleft);

1617

intmaxright,minright;

18int right = max_find(mid+1,e,&maxright,&minright);

1920

int sum = maxleft -minright;

2122 *max = (maxleft > maxright) ?maxleft:maxright;

23 *min = (minleft < minright) ?minleft:minright;

2425

int m = (left > right) ?left:right;

2627 m = (m > sum)?m:sum;

2829

return

m;30}31

int maxdiff(int array, unsigned int

len)

3236

intmax, min;

37int maxdiff_num = max_find(array, array+len-1, &max, &min);

38 printf("

maxdiff_num: %d\n\n

", maxdiff_num);39}

4041

intmain()42;

44 maxdiff(a,2

);45 }

view code

解法二:轉化為求數字陣列最大和問題。

參考:這裡

使用乙個輔助陣列arr2,則arr2[i] = arr[i] - arr[i+1]

即:arr2中從i加到j,arr2[i] + arr2[i+1]+.....+arr2[j]

則:(arr[i]-arr[i+1])+(arr[i+1]-arr[i+2])+....(arr[j]-arr[j+1])

轉化為arr[i]-arr[j+1]

1 #include 2 #include 3 #include 4 #include 5 #include 

6 #include 7

using

namespace

std;

8int max_find(int arr,int

len)914

int *arr2 = new

int[len - 1

];15

int i = 0;16

for(i = 0;i < len-1;++i)

1720

int curs = 0;21

int max = -1;22

for(i = 0;i < len-1;++i)

23else

2831

if(curs >max)

3235}36

if(arr2)

3741 printf("%d"

,max);42}

43int

main()44;

46 max_find(a,2

);47 }

view code

解法三:動態規劃法

依次遍歷陣列用arr[i-1]之前的最大 值減去右邊的元素

1 #include 2 #include 3 #include 4 #include 5 #include 

6 #include 7

using

namespace

std;

8int max_find(int arr,int

len)914

int max = arr[0

];15

int sum = max - arr[1];//

初始化數對差

16int i = 0;17

for(i = 2;i < len;++i)

1823

int cur = max - arr[i];//

用最大的值減右側的最小值

24if(cur > sum) //

判斷是否是最大數對之差

2528

}29 printf("%d"

,sum);30}

31int

main()32;

34 max_find(a,2

);35 }

view code

以上三種都是o(n),那麼:

第一種:遞迴,有遞迴棧

第二種:要n-1輔助陣列

第三種:推薦

shell 找出陣列元素中的最大值

shell 如何比較出陣列中所有元素中的最大值?如 array 111 222 333 444 555 999 888 777 666 怎麼找出最大的那個元素999呢?思路 先設定乙個值max 即陣列的第乙個元素,再使用for迴圈,拿第乙個元素與第二個.比較,當有乙個元素比如3號元素比array 0...

陣列不相鄰元素之和的最大值

今天下午面試老虎 被問到這題,當時腦子有點蒙,沒寫出來。這題的意思就是給你乙個陣列,讓你計算元素的和,但是這些元素都不能相鄰,求最大的和。其實這題很常見,在leetcode上面也有,但是原題是這樣的 假設你是乙個專業的竊賊,準備沿著一條街打劫房屋。每個房子都存放著特定金額的錢。你面臨的唯一約束條件是...

經典例題 元素的最大值和次最大值

方法一 排序後查詢,直接呼叫sort 函式 特別注意sort 函式的用法 include using namespace std intmain sort a 1 a n cout 排序後輸出最後兩個元素即可。方法二 迴圈遍歷比較陣列元素 將陣列元素前兩個看作最大和次最大值,然後從第三個開始迴圈比較...