[路飞]_LeetCode121.买卖股票的最佳时机

183 阅读2分钟

「这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战

LeetCode121.买卖股票的最佳时机

题目内容
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

​你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。

设计一个算法来计算你所能获取的最大利润。​返回你可以从这笔交易中获取的最大利润。如果你不能获
取任何利润,返回 0
示例
输入:[7,1,5,3,6,4]

输出:5

解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大
利润 = 6-1 = 5 。     注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你
不能在买入前卖出股票。
思路(双指针)
1.声明一个快慢指针,在快指针小于数组长度的情况下循环
let slow = 0;
let fast = 1;
let ears = 0;
while (fast < prices.length) {}
2.如果fast的值大于slow的值,就把fast的值赋值给slow值

Ps:slow实际表示最小值

while (fast < prices.length) {  
    if (prices[fast] < prices[slow]) {    
        slow = fast;  
    }
}
3.如果fast的值大于slow的值,求一下他们之间的差是多少,声明一个变量ears = 0;如果这个差大于上一次的差就赋值给ears,然后fast自增(也可以把他们的差值保存到一个数组里面,直接最后return一个数组的最大值);
while (fast < prices.length) {  
    if (prices[fast] < prices[slow]) {    
        slow = fast;  
    } else {    
        if (ears < (prices[fast] - prices[slow])) {      
            ears = prices[fast] - prices[slow];    
        }    
        fast++  
    }
}
4.最后return一下ears就可以得到最终的结果

完整代码1

var maxProfit = function(prices) {    
    let slow = 0;    
    let fast = 1;    
    let ears = 0;    
    while (fast < prices.length) {        
        if (prices[fast] < prices[slow]) {            
            slow = fast;        
        } else {            
            if (ears < (prices[fast] - prices[slow])) {                
                ears = prices[fast] - prices[slow];            
            }            
            fast++        
        }    
    }    
    return ears;
};

完整代码2

var maxProfit = function(prices) {    
    let slow = 0;    
    let fast = 1;    
    let arr = [];    
    while (fast < prices.length) {        
        if (prices[fast] < prices[slow]) {            
            slow = fast;        
        } else {            
            arr.push(prices[fast] - prices[slow]);            
            fast++        
        }    
    }    
    return arr.length ? Math.max.apply(null,arr) : 0;
};