给定一个正整数数组,它的第 i 个元素是比特币第 i 天的价格。
如果你最多只允许完成一笔交易(即买入和卖出一次),设计一个算法来计算你所能获取的最大利润。
注意你不能在买入比特币前卖出。
import java.util.Scanner;
/*
运行时间:33ms,内存占用:10m */
public class Main{
public static void main(String args[]){
Scanner scan = new Scanner(System.in);
String[] str = scan.nextLine().split(" ");
int[] arr = new int[str.length];
for(int i=0;i<str.length;i++){
arr[i] = Integer.parseInt(str[i]);
}
int maxProfit = 0;
int buyPrice = arr[0];int salePrice = 0;
for(int i=0;i<arr.length-1;i++){
//买入价格从左到右始终取最小的
if(arr[i]<buyPrice){
buyPrice = arr[i];
}
salePrice = arr[i+1];
for(int j=i+1;j<arr.length;j++){
if(maxProfit<(arr[j]-arr[i])){
salePrice = arr[j];
maxProfit = arr[j]-arr[i];
}
}
}
System.out.println(maxProfit);
}
} import java.io.*;
public class Main{
public static void main(String[] args) throws IOException{
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String[] str = bf.readLine().split(" ");
int[] arr = new int[str.length];
for(int i = 0;i < str.length;i++){
arr[i] = Integer.parseInt(str[i]);
}
int maxprofit = 0;
for(int i = 0;i < arr.length;i++){
for(int j = i+1;j < arr.length;j++){
if(arr[i] >= arr[j]){
continue;
}else{
if((arr[j] - arr[i]) > maxprofit){
maxprofit = arr[j] - arr[i];
}
}
}
}
System.out.println(maxprofit);
}
}
暴力遍历它不香吗
import java.util.Scanner;
public class Main {
/**
* 运行时间:60ms
*
* 占用内存:10688k
* */
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String[] s = scanner.nextLine().split(" ");
int[] record = new int[s.length];
for (int i = 0; i < s.length; i++) {
record[i]=Integer.parseInt(s[i]);
}
int max=0;
for (int i = 0; i < s.length-1; i++) {
for (int j = i+1; j < s.length; j++) {
max=Math.max(max,record[j]-record[i]);
}
}
System.out.println(max);
}
}
解法二 import java.util.Scanner;
public class Main {
/**
* 运行时间:60ms
*
* 占用内存:10624k
* */
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int min = scanner.nextInt();
int profit=0;
while (scanner.hasNext()){
int i = scanner.nextInt();
profit=Math.max(profit,i-min);
min=Math.min(i,min);
}
System.out.println(profit);
}
} import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String s = sc.nextLine();
String[] split = s.split(" ");
int[] a = new int[split.length];
for (int i = 0; i < split.length; i++)
a[i] = Integer.parseInt(split[i]);
int max = 0;
for (int i = 0; i < a.length - 1; i++) {
int in = a[i];
int outMax = 0;
for (int j = i + 1; j < a.length; j++) {
if (a[j] > outMax)
outMax = a[j];
}
int temp = outMax - in;
if(temp > max)
max = temp;
}
System.out.println(max);
}
}
}
这个leetcode上有一道一模一样的原题,只需要一次遍历
在一次遍历中找到最小值以及最小值之后的最大差值
import java.util.Scanner;
public class Main{
public static void main(String[] args){
int minPrice = Integer.MAX_VALUE;
int maxProfit = 0;
Scanner sc = new Scanner(System.in);
String[] str = sc.nextLine().split(" ");
int[] price = new int[str.length];
for(int i = 0;i < str.length;i++){
price[i] = Integer.parseInt(str[i]);
}
for(int i = 0;i < price.length;i++){
if(price[i] < minPrice){
minPrice = price[i];
}else if(price[i] - minPrice >= maxProfit){
maxProfit = price[i] - minPrice;
}
}
System.out.println(maxProfit);
}
}
import java.util.Scanner;
/*
* O(n)的做法
* 对于第i个位置上的元素,我们只需要知道区间[0, i - 1]最小值,就可以得出第二个数的位置为i的最大差值有序偶,枚举i就可以得出答案;而区间[0, i - 1]最小值可以预处理出来。
*/
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int min = scanner.nextInt(), max = 0;
int temp;
while (scanner.hasNext()) {
temp = scanner.nextInt();
max = Math.max(max, temp - min);
min = Math.min(min, temp);
}
System.out.println(max);
}
}
java版