算法编程专题

给定任意数组,右边的数减去左边的数差值最大。要求时间复杂度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;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值