使用正整数数组a设计当j>i时的有效算法:a[j]+a[i]的最大值,a[j]-a[i]的最大值,a[j]*a[i]的最大值,a[j]/a[i]的最大值。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chenbaige/article/details/80645274

问题描述:使用正整数数组a设计有效算法:

  1. a[j]+a[i]的最大值,其中j>i;
  2. a[j]-a[i]的最大值,其中j>i;
  3. a[j]*a[i]的最大值,其中j>i;
  4. a[j]/a[i]的最大值,其中j>i;

解决问题:解决这些问题的难点在于j>=i的附加条件,代表被加数,被减数,被乘数与被除数都要在数组中加数,减数,乘数与除数的后面。

问题一:a[j]+a[i]的最大值,其中j>=i;

  1. 先介绍时间复杂度为ON2的算法:通过两层循环,计算出所有两数和的可能性,再选出相加后和最大的。算法如下:
 private static int findMaxSum(int[] arr) {
        int sum = 0;
        int len = arr.length;
        for (int i = 0; i < len - 1; i++) {
            for (int j = i+1; j < len - 1; j++) {
                if(arr[i]+arr[j]>sum)
                    sum = arr[i] + arr[j];
            }
        }
        return sum;
    }
这种是最通俗的办法,也是最容易理解的常规办法,时间复杂度为ON2,它的缺点就在于时间复
杂度太高。在计算过程中,我们只需要计算最大值即可,并不需要知道i和j的位置。因此接下来
我们介绍一种时间复杂度为ON的算法。

2. 通过一层循环降低时间复杂度为ON的算法如下:

private static int findMaxSum(int[] arr) {
        int first = arr[0];
        int next = arr[0];
        int len = arr.length;
        for (int i = 0; i < len; i++) {
            if (arr[i] > first) {
                next = first;
                first = arr[i];
            } else if (arr[i] > next) {
                next = arr[i];
            }
        }
        return first + next;
    }
时间复杂度为ON的算法,通过两个指针(分别记录最大值和次大值)记录,只需要一次数组的遍
历,就可以得到最大的两个数。

问题二:a[j]-a[i]的最大值,其中j>=i;

  1. 和计算最大和一样,先介绍时间复杂度为ON2的算法,它也是通过穷举所有可能性,并且从中找出最大值的算法,算法如下:
private static int findMaxSub(int[] arr) {
        int sub = 0;
        int len = arr.length;
        for (int i = 0; i < len - 1; i++) {
            for (int j = i+1; j < len - 1; j++) {
                if(arr[j]-arr[i]>sub)
                    sub = arr[j] - arr[i];
            }
        }
        return sub;
    }

2.时间复杂度ON的算法,在遍历数组的同时,通过记录当前位置前最小的数,并且计算当前位置数与之前最小数的最大值。算法如下:

 private static int findMin(int[] arr) {
        int minSu = 0;
        int min = arr[0];
        int len = arr.length;
        for (int i = 0; i < len; i++) {
            if (arr[i] < min) {
                min = arr[i];
                continue;
            }
            if (arr[i] - min > minSu) {
                minSu = arr[i] - min;
            }
        }
        return minSu;
    }

问题三:a[j]*a[i]的最大值,其中j>i;
时间复杂度ON2与时间复杂度为ON的算法都与问题一解决问题的算法很类似,这里就不过多阐述了。

问题4:a[j]/a[i]的最大值,其中j>i;
1. 时间复杂度为ON2的算法也不介绍,方法同方法一的穷举法,穷举所有可能性,并且找出最大值即可。
2. 时间复杂度为ON的算法也和算法2中算法类似,先找出当前遍历位置前的最小值,再将两数相除,记录最大值即可。

总结:算法可能有不妥之处,您也可能有更优的解决方案,欢迎大家说出自己的想法,大家共同进步。

猜你喜欢

转载自blog.csdn.net/chenbaige/article/details/80645274
今日推荐