给定任意数组,右边的数减去左边的数差值最大。要求时间复杂度O(N*N)空间复杂度小于O(N)
题目
题目:
* 现有一个数组prices,长度为n,其中prices[i]是股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益
* 1.你可以买入一次股票和卖出一次股票,并非每天都可以买入或卖出一次,总共只能买入和卖出一次,
* ----》PS : 相当于任意两个数的差值最大
* 且买入必须在卖出的前面的某一天差值最大
* ----> PS: 相当于后面的数(卖出)减去前面的数(买入)
* 差值最大
* 2.如果不能获取到任何利润,请返回0
* -----> PS : 差值如果小于或者等于0,就返回 0
* 3.假设买入卖出均无手续费
要求:
* 数据范围:0≤n≤10000
* 要求:空间复杂度<=O(n), 时间复杂度<=O(n²) 。
*
* 举例:
* 输入:[8,9,2,5,4,7,1] 返回值:5
*
* 输入:[2,4,1] 返回值:2
*
* 输入:[3,2,1] 返回值:0
解题思路:
PS : 综合题目意思就是:右边的数减去左边的数差值最大。,如果最大差值都小于或者等于0 ,就认为结果是 0
* 所以 题目就很简单了
* 1: 我循环这个数组,拿右边的数减去左边的数,并记录最大差值,这个时候,肯定循环的次数比较多,因为,不一定是相邻的两个数求差值
* 这个时候 时间复杂度 应该为 : O(N*N)
*
* 2: 另外一个思路就是:我先记录 array[0] 和 array[1] 的差值,并记录最新值,然后拿后面的值 去和 差值做比较,如果比差值大,就更新最小值
* 和差值,以此循环,时间复杂度就是 0(N)
public class FindMaxDifNum {
public static final int[] numArray1 = new int[] {8,9,2,5,4,7,1};
public static final int[] numArray2 = new int[] {2,4,1};
public static final int[] numArray3 = new int[] {3,2,1};
public static final int[] numArray4 = new int[] {8,9,2,5,4,7,1,10,555,687,584,1234,5769,32,12,0,22,10000};
public static void main(String[] args) {
System.out.print(findMaxDifference(numArray1));
System.out.print("\n");
System.out.print(findMaxDifference(numArray2));
System.out.print("\n");
System.out.print(findMaxDifference(numArray3));
System.out.print("\n");
System.out.print(findMaxDifference(numArray4));
}
private static int findMaxDifference(int[] numArray){
if (numArray.length <2) {
// 长度小于2个,直接返回
return numArray[0];
}
// 1:先预先把数组前两个值取出来
int leftNum = numArray[0];
int rightNum = numArray[1];
int diffNum = rightNum-leftNum;// 计算差值
int minNum = leftNum > rightNum ? rightNum:leftNum;
for (int i =2;i<numArray.length;i++) {
// 2: 更新差值
if (numArray[i] - minNum > diffNum) {
diffNum = numArray[i]-minNum;
} else {
// 3:小于的情况下,就不用处理了,因为这个,通过步骤4 更新下minNum
}
// 4:找 minNum
if (numArray[i] < minNum) {
minNum = numArray[i];
}
}
// 5: 发现如果 收益是负数,就直接返回0
if (diffNum<=0) diffNum = 0;
return diffNum;
}
}