Maximum Profit

最大利益:Maximum Profit

计算出价格差Rj-Ri(其中j>i)的最大值

输入示例:

6

5

3

1

3

4

3

输出示例:3

这道题目首先我们拿到手,首先我们应该想到使用数组去做存储输入的数据,但是我们需要注意的是价格差的计算就相当于一个数组中元素相减,但是这里有一个条件必须是j>i,

第一种方法,设定两个for循环

forj从1到n-1

fori从0到j-1

然后在设定一个maxv比如为一个不可能到达的值-2000000,每次拿元素相减与maxv比较,更新maxv

这个算法的时间小老板比较低O(n^2)

import java.util.*;

public class MaximumProfit {

	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
        int []a = new int [200000];
        int n = input.nextInt();
        for(int i = 0;i<n;i++)
        {
        	a[i] = input.nextInt();
        }
        input.close();
        int maxv = -200000;
        for(int j = 1;j<n;j++)
        {
        	for(int i = 0;i<j;i++)
        	{
        		if(a[j]-a[i]>maxv)
        		{
        			maxv = a[j]-a[i];
        		}
        	}
        }
        System.out.println(maxv);
	}

}

当输入的数据有200000这么多的话算法时间效率极低

第二种方法

我们可以设定一个常量minv给定一个初值比如数组元素的第一个值,通过一层循环j=1到n-1

minv每次更新出minv到a[j]之间的最小的一个

maxv与a[j]-minv中最大的

这个时间复杂度只要O(1)很高效

import java.util.*;

public class MaximumProfit {

	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
        int []a = new int [200000];
        int n = input.nextInt();
        for(int i = 0;i<n;i++)
        {
        	a[i] = input.nextInt();
        }
        input.close();
        int maxv = -200000;
 /*     for(int j = 1;j<n;j++)
        {
        	for(int i = 0;i<j;i++)
        	{
        		if(a[j]-a[i]>maxv)
        		{
        			maxv = a[j]-a[i];
        		}
        	}
        }*/
        int minv = a[0];
        for(int j = 1;j<n;j++)
        {
        	maxv = Math.max(maxv,a[j]-minv);
        	minv = Math.min(minv, a[j]);
        }
        System.out.println(maxv);
	}

}

猜你喜欢

转载自blog.csdn.net/lytwy123/article/details/81389506
今日推荐