5.买卖股票的最佳时机
题目描述: 给定一个数组,它的第i个元素是一支给定股票第i天的价格。如果最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。
注意,不能在买入股票前卖出股票。
示例:
输入:[7,1,5,3,6,4]
输出:5
解释:在第2天(股票价格 = 1) 的时候买入,在第5天(股票价格 = 6)的时候卖出,最大利润 = 6-1=5。
注意:利润不能是 7-1=6,因为卖出价格需要大于买入价格;同时,不能在买入前卖出股票。
-
解法一:暴力求解。首先,对题目的理解就是低买高卖,就能获得最大利润。
//解法1:暴力求解 public static int maxProfit(int[] nums) { int maxProfit = 0;//定义最大利润,初始化为0 //获得第i天的股票价格 for (int i = 0; i < nums.length - 1; i++) { //获得今日后,每天的股票价格 for (int j = i + 1; j < nums.length ; j++) { int profit = nums[j] - nums[i];//当日卖出的股票获得的收益 //判断当日卖出的股票获得的收益是否大于已知的最大收益 if (profit > maxProfit) { maxProfit = profit; } } } return maxProfit; }
-
解法二:一次遍历。首先定义一个变量代表股票的最小价格minPrice,然后再定义一个变量代表获取到的最大利润maxProfit,通过循环获取每天的股票价格,在当天的时候,比较当日价格和最小价格的大小,如果小于最小价格,则将当日价格赋给minPrice,否则判断当日卖出股票的利润是否大于最大利润,如果大于,就把当日利润赋值给maxProfit,否则进入下次循环,待循环结束,就获取到了最大利润。
//解法2:一次遍历 public static int maxProfit2(int[] nums) { int minPrice = Integer.MAX_VALUE; //定义最小价格 int maxProfit = 0; //定义目前获得的最大利润 //获取每一天的股票价格 for (int i = 0; i < nums.length; i++) { //判断当天的价格是否小于目前已知最小价格 if (nums[i] < minPrice) { minPrice = nums[i]; }else { //判断当天卖出股票获得的利润是否大于目前获得的最大利润 if (nums[i] - minPrice > maxProfit) { maxProfit = nums[i] - minPrice; } } } return maxProfit; }