给定一个正整数数组,它的第 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版