zoukankan      html  css  js  c++  java
  • 数组中后面元素与前面元素的最大差值

    求数组中两个元素差的最大值(后面的元素减去前面的元素)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;
    }

    //寻找下标差值最大的两个数
    //动态规划

    }
  • 相关阅读:
    JAVA 设计的七大原则
    电脑开机一支黑屏 ,只有鼠标
    oracle 创建表空间 、用户 、赋权、建表
    input 标签禁止输入
    input框限制只能输入正整数、字母、小数、汉字
    LINUX 解压文件
    LINUX vim 修改文件 退出
    layui table表格字段过长,展示不完整时,鼠标放到上面展示完整信息
    全网最全JS正则表达式 校验数字
    《学习笔记》基於NOPI開發 ExeclHelper工具類
  • 原文地址:https://www.cnblogs.com/kexianting/p/8744241.html
Copyright © 2011-2022 走看看