這道題是2016美團面試題:
1.給定乙個陣列arr,陣列長度為len,求滿足 0 <= a <= b < len的 arr[b] - arr[a]最大值。
你的想法:讓每乙個數字減去它右邊的數字,並通過比較得到數對的最大值,時間複雜度(o^2),這應該是面試官不想要的。
解法一:分治法(遞迴實現)
假設把陣列分成兩個子陣列,用左陣列最大的減去右陣列最小的,最大值有三種情況:
(1)被減數和減數都在第乙個子陣列中,即第乙個子陣列中的數對之差的最大值;
(2)被減數和減數都在第二個子陣列中,即第二個子陣列中數對之差的最大值;
(3)被減數在第乙個子陣列中,是第乙個子陣列的最大值;減數在第二個子陣列中,是第二個子陣列的最小值。
(1)、(2)、(3)中,這三個差值的最大者就是整個陣列中數對之差的最大值。
1 #include 2 #includeview code3 #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 }
解法二:轉化為求數字陣列最大和問題。
參考:這裡
使用乙個輔助陣列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 #includeview code6 #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 }
解法三:動態規劃法
依次遍歷陣列用arr[i-1]之前的最大 值減去右邊的元素
1 #include 2 #include 3 #include 4 #include 5 #includeview code6 #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 }
以上三種都是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 排序後輸出最後兩個元素即可。方法二 迴圈遍歷比較陣列元素 將陣列元素前兩個看作最大和次最大值,然後從第三個開始迴圈比較...