首页 > 试题广场 >

买卖股票的最好时机(一)

[编程题]买卖股票的最好时机(一)
  • 热度指数:170213 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
假设你有一个数组prices,长度为n,其中prices[i]是股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益
1.你可以买入一次股票和卖出一次股票,并非每天都可以买入或卖出一次,总共只能买入和卖出一次,且买入必须在卖出的前面的某一天
2.如果不能获取到任何利润,请返回0
3.假设买入卖出均无手续费

数据范围:
要求:空间复杂度 ,时间复杂度
示例1

输入

[8,9,2,5,4,7,1]

输出

5

说明

在第3天(股票价格 = 2)的时候买入,在第6天(股票价格 = 7)的时候卖出,最大利润 = 7-2 = 5 ,不能选择在第2天买入,第3天卖出,这样就亏损7了;同时,你也不能在买入前卖出股票。            
示例2

输入

[2,4,1]

输出

2
示例3

输入

[3,2,1]

输出

0
/**
  * 
  * @param prices int整型一维数组 
  * @return int整型
  */
function maxProfit( prices ) {
    // write code here
    if(prices.length<2){return 0}
    let len=prices.length;
    // let dp=new Array(len);
    let max=prices[1]-prices[0];
    let min=Math.min(prices[0],prices[1]);
    for(let i=2;i<len;i++){
        min=Math.min(min,prices[i-1])
        max=Math.max(max,prices[i]-min)
    }
    return Math.max(max,0)
}
module.exports = {
    maxProfit : maxProfit
};

发表于 2022-12-05 20:21:46 回复(0)
故意写了个不符合要求的居然过了。。。
发表于 2022-09-04 22:13:37 回复(0)
/**
  * 
  * @param prices int整型一维数组 
  * @return int整型
  */
function maxProfit( prices ) {
    // write code here
    let res = 0;
    let min = prices[0];
    for(let i = 0;i < prices.length -1;i++) {
        let temp = prices[i]
        let next = prices[i+1]
        if(temp <= next) {
            min = Math.min(min,temp)
            res = Math.max(res,next - min)
        } 
    }
    return res
}
module.exports = {
    maxProfit : maxProfit
};

发表于 2022-05-12 21:09:40 回复(0)
function maxProfit( prices ) {
    // write code here
    let dp = [0]
    let min = prices[0]
    for(let i = 1;i < prices.length;i++) {
        min = Math.min(min,prices[i])
        dp[i] = Math.max(prices[i] - min,dp[i - 1])
    }
    return dp[dp.length - 1]
}
module.exports = {
    maxProfit : maxProfit
};

发表于 2022-04-22 16:40:56 回复(0)
动态规划
对于每一天,分两种情况讨论,持有股票(买入或者持有之前买入的)或不持有股票(卖出或者不买入股票)
function maxProfit( prices ) {
    // write code here
    let len = prices.length
    let dp = new Array(len).fill([0,0])
    dp[0] = [-prices[0], 0]
    for(let i = 1; i < len; i ++){
        dp[i] = [Math.max(dp[i - 1][0], -prices[i]), Math.max(prices[i] + dp[i - 1][0], dp[i - 1][1])]
    }
    return dp[len - 1][1]
}


发表于 2022-04-15 10:26:32 回复(0)

动态规划思路整理

/**
  * 
  * @param prices int整型一维数组 
  * @return int整型
  */
function maxProfit(prices) {
    // write code here
    // 动态规划三步走
    // 1. 确定dp[i]意义: dp[i]取第i天卖出时候的最大收益, 但是计算收益需要有买入和卖出, 卖出很好理解, 也就是当前的prices[i], 买入应该是需要继承之前的dp[i-1]的买入大小
    // 2. 确定dp元素关系: dp[i].buy = dp[i-1].buy<prices[i]?dp[i-1].buy:prices[i]   dp[i].val = prices[i] - dp[i].buy
    // 3. 初始化条件: dp[0] = {val:0, buy:prices[0]}
    // 4. 操作
    const dp = [{ val: 0, buy: prices[0] }]
    let i = 1, money = 0

    while (i < prices.length) {
        const buy = dp[i - 1].buy < prices[i] ? dp[i - 1].buy : prices[i]
        const val = prices[i] - buy
        val > money && (money = val)
        dp[i++] = { val, buy }
    }

    return money
}
module.exports = {
    maxProfit: maxProfit
};
发表于 2022-03-12 16:17:28 回复(0)
=
/**
  * 
  * @param prices int整型一维数组 
  * @return int整型
  */
function maxProfit( prices ) {
    // write code here
    let len = prices.length//数组长度
    if(len<=1){return 0}
    let max = prices[0];//最大值
    let min = prices[0];//最小值
    let maxindex = 0;//最大值的下标
    let minindex = 0;//最小值的下标
    
     let n = 0;
     let m = 0;
    prices.map((n,index)=>{
        if(n>max){max = n;maxindex = index}
        if(n<min){min = n;minindex = index}
    })//找出历史最高点和最低点和它们下标
   if(minindex<maxindex){return max - min}//如果最小值在左,最大值在右秒出答案
   else{//事与愿违
       for(let i=minindex;i<len;i++){
           if(prices[i]-prices[minindex]>n){
                n =  prices[i]-prices[minindex]
           }
       }//从最低点开始向右寻找与最高点的差值
       for(let i=maxindex;i>0;i--){
           if(prices[maxindex]-prices[i]>n){
                m =  prices[maxindex]-prices[i]
           }
       }//从最高点开始向左寻找与最低点的差值
       return n>m?n:m
   }
}
module.exports = {
    maxProfit : maxProfit
};

发表于 2022-02-22 11:55:30 回复(0)
一个比较好理解的办法,比递归的性能差一点
function maxProfit( prices ) {
    // write code here
    let result = 0;
    for (let i=0; i<prices.length; i++) {
        for (let j=i+1; j<prices.length; j++) {
            result = prices[j] - prices[i] > result ? prices[j] - prices[i] : result
        }
    }
    return result;
}


发表于 2021-12-11 11:38:24 回复(1)
/**
  * 
  * @param prices int整型一维数组 
  * @return int整型
  */
function maxProfit( prices ) {
     // write code here
    let min = prices[0], max = 0;
    for(let i = 1; i < prices.length; i++) {
        max = Math.max(max, prices[i] - min);//最小值买入的最大获利
        min = Math.min(min, prices[i]);//买入的最小值
    }
    return max;
}
module.exports = {
    maxProfit : maxProfit
};

发表于 2021-11-20 22:06:59 回复(0)
/**
  * 
  * @param prices int整型一维数组 
  * @return int整型
  */
function maxProfit( prices ) {
    // write code here
    //循环实现。
    /**
    let len = prices.length;
    let max_profit = 0;
    for(let i=0;i<len;i++){
        for(let j=i;j<len;j++){
            let diff = prices[j] - prices[i];
            max_profit = max_profit < diff ? diff : max_profit;
        }
    }
    return max_profit;
    */
// 擂台法
    //思路 1.使用 minPrice 存储当前最低价格,遍历时依次对比更新
    //     2.使用 profit 存储当前最大利润,当前价格减去最低价格得到当前的最大利润 
    // profit = prices[i] - minPrice,动态得到最大利润
    let minProfit = prices[0];//先设置最小值为第一个数
    let profit = 0;
    for(var i = 0;i< prices.length;i++){
        minProfit = Math.min(minProfit,prices[i]);
        
        profit = Math.max(profit,prices[i]-minProfit);//计算最大利润。
        
    }
    return profit;
}
module.exports = {
    maxProfit : maxProfit
};

发表于 2021-11-15 00:16:21 回复(0)
function maxProfit( prices ) {
    // write code here
    let max;
    for(let i=0; i<prices.length; i++){
        if(max<prices[i]){
            max=prices[i];
        }
    }
    if(max===prices[0]){
        return 0;
    }else{
        let maxP=0;
        for(let i=0; i<prices.length-1; i++){
            for(let j=i+1; j<prices.length;j++){
                if(prices[j]-prices[i]>maxP){
                    maxP=prices[j]-prices[i];
                }
            }
        }
        return maxP;
    }
}
发表于 2021-11-06 16:37:55 回复(0)
function maxProfit( prices ) {
    if(prices.length<2){ return 0;}
    let res = 0;
    let temp = 0;
    for(let i = 0 ;i < prices.length-1;i++){
        for(let j = prices.length-1;j>i;j--){
            temp = prices[j]-prices[i];
            if(temp>res){
                res = temp;
            }
        }    
    }
    return res;
}

发表于 2021-09-21 12:15:04 回复(0)
function maxProfit( prices ) {
    // write code here
    var res=0;
    for(var i=0;i<prices.length;i++){
        var val=Math.max(...prices.slice(i))-prices[i];
        res=Math.max(res,val);
    }
    return res;
}

发表于 2021-09-18 11:10:49 回复(0)
利用大佬的动态规划思想完成的,但是他们的动态规划都是利用java来完成的。
而js要想完成动态规划,是不能直接定义二维数组的。
但是可以这样定义二维数组,代码如下所示:
(具体思想就不写了,题解中的大佬已经写的非常清楚了)
function maxProfit( prices ) {
    // write code here
    if(prices==null || prices.length==0)
        {
            return 0
        }
    var length=prices.length
    var dp=[]
    //边界条件
    dp[0,0]=0
    dp[0,1]=-prices[0]
    //从第二天开始,因此i=1
    for(var i=1;i<length;i++)
        {
            //递推公式
            dp[i,0]=Math.max(dp[i-1,0],dp[i-1,1]+prices[i])
            dp[i,1]=Math.max(dp[i-1,1],-prices[i])
        }
    return dp[length-1,0]
}


发表于 2021-08-23 16:44:27 回复(0)
function maxProfit( prices ) {
    // write code here\
    if(prices.length <= 1)return 0;
    //num1保存最小的数,num2保存最大的差
    let num1 = prices[0], num2 = 0;
    for(let i = 1; i < prices.length; i++){
        if(prices[i] - num1 > num2){
            num2 = prices[i] - num1;
        }
        if(prices[i] < num1){
            num1 = prices[i];
        }
        
    }
    return num2;
}
module.exports = {
    maxProfit : maxProfit
};


编辑于 2021-03-23 21:08:57 回复(0)
动态规划
function maxProfit( prices ) {
    // write code here
  let max = 0,minprice = prices[0]
  for( let item of prices){
      minprice = Math.min(minprice,item)
      max = Math.max(item-minprice,max)
  }
    return max
}

编辑于 2020-12-14 10:55:28 回复(0)
function maxProfit( prices ) {
    // write code here
    if(prices.length<=1){
        return 0;
    }
    if(prices.length==2){
        return prices[1]-prices[0]>0?prices[1]-prices[0]:0
    }
    let res = [];
    for(let i=0; i<prices.length;i++){
        let temp = Math.max(...prices.slice(i, prices.length));
        res.push(temp-prices[i])
    }
    return Math.max(...res);
}
module.exports = {
    maxProfit : maxProfit
};

发表于 2020-08-31 11:20:22 回复(0)

问题信息

难度:
19条回答 26832浏览

热门推荐

通过挑战的用户