最大利益: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);
}
}