1. 程式人生 > >數組中後面元素與前面元素的最大差值

數組中後面元素與前面元素的最大差值

AI 如果 數組array 暴力搜索 動態 int i+1 ray str

求數組中兩個元素差的最大值(後面的元素減去前面的元素)O(N)時間復雜度O(1)空間復雜度
題目:在數組中找到兩個元素,計算後面的元素減去前面的元素的差。求出所有差的最大值。
(你可以認為你在炒股票,買入價格和賣出價格就是你的盈利)
//數組A[0...n] , 對於0<=i<j<=n, 找出A[j]-A[i]的最大值
public class MaxDifference {

public static void main(String[] arg) {

int[] a = {12, 20, 23, 1, 2, 5, 7, 10};
//動態規劃
System.out.println(maxDifference(a)); //後面減前面, 最大差值
//動態規劃
int[] b = {13, 20, 23, 1, 2, 5, 7, 10};
System.out.println("動態規劃" + maxDifference1(b));

//暴力搜索
System.out.println("暴力搜索: " + maxDifference2(a));
System.out.println("暴力搜索: " + maxDifference2(b));


//轉化法
System.out.println("轉化法: " + maxDifference4(a));
}


//自底向上動態規劃: O(n)
//後面的數減去前面的數
public static int maxDifference(int[] a){


int minLeft = a[0];//默認最小的值

int maxDiff = a[1] - a[0]; //初始最大差值

for(int i = 2; i < a.length; i++)
{
if(a[i - 1] < minLeft)//得到i之前數組的最小值
{
minLeft = a[i - 1];
}
if(a[i] - minLeft > maxDiff)//獲取最大差值
{
maxDiff = a[i] - minLeft; //用當前值減去當前值之前的最小值, 得到最大差值
}
}
return maxDiff;

}

//前面的數減去後面的數
public static int maxDifference1(int[] a){
int maxLeft = a[0];//默認最大的值

int maxDiff = a[0] - a[1]; //初始最大差值

for(int i = 2; i < a.length; i++)
{
if(maxLeft < a[i - 1])//得到i之前數組的最大值
{
maxLeft = a[i - 1];
}
if(maxLeft - a[i] > maxDiff)//獲取最大差值
{
maxDiff = maxLeft - a[i]; //用當前值之前的最大值減去當前值, 得到最大差值
}
}
return maxDiff;
}



//分治法: 最大值和最小值都在左邊數組中, 最大值最小值都在右邊數組中, 最大值最小值分別位於左邊數組或者右邊數組中
//O(nlgn)
public static int maxDifference3(int[] a){


return 0;
}


//轉換法
/*
1、有一數組array[n],數組長度為n

2、構建一個長度為n-1的輔助數組array2[n-1],且array2[i] = array[i] - array[i+1]; (0<=i<n-1)

3、如果累加輔助數組array2從i到j(j>i),即array[i] + array2[i+1] + ... + array2[j],

有(array[i] - array[i+1]) + (array[i+1] -array[i+2]) + ... + (array[j] - array[j+1]) = array[i] - array[j+1]

分析至此,發現數組中最大的數對之差(即array[i] - array[j+1])其實是輔助數組array2中最大的連續子數組之和。
*/
public static int maxDifference4(int[] a){
//int[] b = Arrays.copyOf(a, a.length); //對a進行深拷貝, 長度可以自定義
int[] temp = new int[a.length - 1];
for (int i = 0; i < temp.length; i ++){
temp[i] = a[i+1] - a[i];
}

int sum = 0;
for (int i = 0; i < temp.length; i ++){
if (sum <= 0){
sum = temp[i];
}else {
sum += temp[i];
}

}

return sum;
}


//暴力搜索 O(n^2)
public static int maxDifference2(int[] a){
int max = 0;
for (int i = 0; i < a.length - 1; i ++){
for (int j = i + 1; j < a.length; j ++){
if (a[j] - a[i] > max){
max = a[j] - a[i];
}
}
}
return max;
}

//尋找下標差值最大的兩個數
//動態規劃

}

數組中後面元素與前面元素的最大差值