天天看點

#yyds幹貨盤點# 動态規劃專題:買賣股票的最好時機(一)

1.簡述:

描述

假設你有一個數組prices,長度為n,其中prices[i]是股票在第i天的價格,請根據這個價格數組,傳回買賣股票能獲得的最大收益

1.你可以買入一次股票和賣出一次股票,并非每天都可以買入或賣出一次,總共隻能買入和賣出一次,且買入必須在賣出的前面的某一天

2.如果不能擷取到任何利潤,請傳回0

3.假設買入賣出均無手續費

資料範圍: 

輸入描述:

第一行輸入一個正整數 n 表示數組的長度

第二行輸入 n 個正整數,表示股票在第 i 天的價格

輸出描述:

輸出隻買賣一次的最高收益

示例1

輸入:

7
8 9 2 5 4 7 1      

輸出:

5      

說明:

在第3天(股票價格 = 2)的時候買入,在第6天(股票價格 = 7)的時候賣出,最大利潤 = 7-2 = 5 ,不能選擇在第2天買入,第3天賣出,這樣就虧損7了;同時,你也不能在買入前賣出股票。      

示例2

輸入:

3
2 4 1      

輸出:

2      

示例3

輸入:

3
3 2 1      
2      
import java.util.*;

public class Main {
    public static void main(String[] args) {

     
        Scanner scan = new Scanner(System.in);
        String nStr = scan.nextLine(); // 輸入一個正整數 n
        int n = Integer.valueOf(nStr); // 将 String 類型轉換為 int 類型
        String numsStr = scan.nextLine(); // 輸入 n 個正整數
        String[] numsStrList = numsStr.split(" ");
        int[] nums = new
        int[numsStrList.length]; // 定義一個整型變量,用于存放這 n 個正整數
        for (int i = 0; i < nums.length; i++) {
            nums[i] = Integer.valueOf(numsStrList[i]);
        }

       
        // 一些特殊情況的處理
        if (1 == nums.length) {
            System.out.println(0);
            return;
        }

        int rs = nums[1] - nums[0];
        int now = nums[1] - nums[0];
        int pre = nums[1] - nums[0];
        for (int i = 1; i < nums.length - 1; i++) {
            if (pre <= 0) {
                now = nums[i + 1] - nums[i];
            } else {
                now = pre + nums[i + 1] - nums[i];
            }
            pre = now;
            rs = Math.max(rs, now);
        }
        System.out.println(rs > 0 ? rs : 0);
    }
}