1. 程式人生 > >相鄰最大差值

相鄰最大差值

請設計一個複雜度為O(n)的演算法,計算一個未排序陣列中排序後相鄰元素的最大差值。給定一個整數陣列A和陣列的大小n,請返回最大差值。保證陣列元素個數大於等於2小於等於500。

測試樣例:[9,3,1,10],4

返回:6

 

方法一:陣列下標法

 

解析:根據題意,我們可以先定義一個一維陣列儲存資料,然後通過sort進行由小到大排序,再通過for語句兩兩算出差值,並將其儲存到新的一維陣列中,最後將儲存差值的陣列利用sort進行由小到大排序,所得的最後一個元素就是要求解的最大差值。

 

程式碼:

#include<iostream>

#include<algorithm>

using namespace std;



int main()

{

       int n,solve;

       cin>>n;

       int a[n],b[n-1];

       for(int i=0;i<n;i++)

              cin>>a[i];

       sort(a,a+n);

       for(int i=0;i<n;i++)

              b[i]=a[i+1]-a[i];

       sort(b,b+n-1);

       cout<<b[n-1]<<endl;

       return 0;

}

方法二:最大初值法

 

解析:根據題意,我們可以定義一個一維陣列的容器儲存資料,呼叫findMaxDivision函式,即先將資料由小到大排序,因排序後後一項減前一項大於等於0則定義一個變數初始化為0,然後用for語句迴圈,利用if語句判斷差值是否大於給定的變數,如果大於則賦值給變數,由此找到最大的差值,從而輸出其值。

 

程式碼:

#include<iostream>

#include<vector>

#include<algorithm>

using namespace std;



int findMaxDivision(vector<int> A, int n)

{

       sort(A.begin(),A.end());

       int max=0;

       for(int i=1;i<n;i++)

              if(max<A[i]-A[i-1])

                     max=A[i]-A[i-1];

       return max;

}



int main()

{

       vector<int> a;

       int n,temp;

       cin>>n;

       for(int i=0;i<n;i++)

       {

              cin>>temp;

              a.push_back(temp);

       }

       cout<<findMaxDivision(a,n)<<endl;

       return 0;

}