LeetCode之买卖股票的最佳时机系列共6道题

news2024/11/20 6:27:29

文章目录

  • 0 引言
  • 1 121. 买卖股票的最佳时机
    • 1. 1 暴力法
    • 1.2 一次遍历
    • 1.3 动态规划
  • 2 122. 买卖股票的最佳时机 II
    • 2.1 一次遍历
    • 2.2 动态规划
  • 3 123. 买卖股票的最佳时机 III
    • 3.1 动态规划
  • 4 188. 买卖股票的最佳时机 IV
    • 4.1 动态规划
  • 5 309. 买卖股票的最佳时机含冷冻期
    • 5.1 动态规划
  • 6 714. 买卖股票的最佳时机含手续费
    • 6.1 动态规划
  • Reference

0 引言

本文主要记录如何解决LeetCode中的《买卖股票的最佳时机》,相关题目总共有6道,主要解法是动态规划,也可以通过这几道题熟悉动态规划算法。

👉 简单—> 121. 买卖股票的最佳时机
👉 中等—> 122. 买卖股票的最佳时机 II
👉 困难—> 123. 买卖股票的最佳时机 III
👉 困难—> 188. 买卖股票的最佳时机 IV
👉 中等—> 309. 买卖股票的最佳时机含冷冻期
👉 中等—> 714. 买卖股票的最佳时机含手续费

1 121. 买卖股票的最佳时机

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0

核心问题:虽然是模拟买卖股票,但这题是开了天眼,知道后续的股票涨跌,所以在已知给定数组中,找出其中差值最大的两个数,但第二个数必须排在第一个数后边。

1. 1 暴力法

很容易想到暴力解法,主循环和子循环来求差值,c++代码如下:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = int(prices.size());
        int ans = 0;
        for (int i = 0; i < n; ++i){
            for (int j = i+1; j < n; ++j){
                ans = max(ans, prices[j] - prices[i]);
            }
        }
        return ans;
    }
};

但这样的时间复杂度: O ( n 2 ) O(n^2) O(n2),超时不符合题目要求。后面的题目就不记录暴力法的解法了。

请添加图片描述

1.2 一次遍历

仔细想想,暴力解法其实多了一次不必要的循环,其实一次遍历不仅可以计算差值,还能记录数组中的最小值,有了最小值的更新,就可以更新最大差值,即最大利润。c++代码如下:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int inf = 1e9;
        int minprice = inf, maxprofit = 0;
        for (int i = 0; i < int(prices.size()); ++i){
            maxprofit = max(maxprofit, prices[i] - minprice);
            minprice = min(prices[i], minprice);
        }
        return maxprofit;
    }
};

复杂度分析

  • 时间复杂度 O ( n ) O(n) O(n),只需要遍历一次。
  • 空间复杂度 O ( 1 ) O(1) O(1),只使用了常数个变量。

1.3 动态规划

动态规划(dynamic programming,DP)
简单解释
首先写一下 1+1+1+1=?
“它等于多少呢?”
易知“等于4!”
如果在左边添一个 1+,即1+1+1+1+1=?
“会等于多少呢?”
也易知“等于5!”
“为什么会计算得这么快呢?”
“因为 4+1=5
所以,没有重新计算 1+1+1+1+1 的值,因为记住了前面的和等于 4,再次计算时只需再加 1 就可以了。
这种通过记住一些事情来节省时间,就是动态规划的精髓
具体来说,如果一个问题的子问题会被重复利用,则可以考虑使用动态规划

动态规划一般分为一维、二维、多维(使用 状态压缩),对应形式为 d p ( i ) dp(i) dp(i) d p ( i ) ( j ) dp(i)(j) dp(i)(j) d p ( i ) ( j ) dp(i)(j) dp(i)(j)。本题用的是一维 d p ( i ) dp(i) dp(i)

本题就是用动态规划的 d p [ i ] dp[i] dp[i] 表示前 i i i 天的最大利润,因为始终要使利润最大化,则遍历过程中:

d p [ i ] = m a x ( d p [ i − 1 ] , p r i c e s [ i ] − m i n p r i c e ) dp[i]=max(dp[i−1],prices[i]−minprice) dp[i]=max(dp[i1],prices[i]minprice)

c++代码如下

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = int(prices.size());
        if (n == 0) return 0; 

        int minprice = prices[0];
        // 创建了一个名为dp的整数类型向量(vector),其长度为n,并且初始化所有元素的值为0
        vector<int> dp (n, 0);
        for (int i = 1; i < n; ++i){
            minprice = min(minprice, prices[i]);
            dp[i] = max(dp[i - 1], prices[i] - minprice);
        }
        return dp[n - 1];
    }
};

复杂度分析

  • 时间复杂度 O ( n ) O(n) O(n),只需要遍历一次。
  • 空间复杂度 O ( n ) O(n) O(n),使用了长度为 n n n的数组。

2 122. 买卖股票的最佳时机 II

给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。
在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。
返回 你能获得的 最大 利润

通过题目和示例可知:本题相对于第I题,可以多次交易的,但每次交易前都要先售出才能再买入。所以本题需要计算多次交易的利润和

2.1 一次遍历

与第I题的一次遍历有些许差异,遍历过程中,只要第i天的价格比第i-1的价格低,就把差值计入利润和中。c++代码如下:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int inf = 1e9;
        int profit = 0;
        for (int i = 1; i < int(prices.size()); ++i){
            if (prices[i] > prices[i-1]){
                profit += (prices[i] - prices[i-1]);
            }
        }
        return profit;
    }
};

复杂度分析

  • 时间复杂度 O ( n ) O(n) O(n),只需要遍历一次。
  • 空间复杂度 O ( 1 ) O(1) O(1),只使用了常数个变量。

2.2 动态规划

与第I题的动态规划有些许差异,这次是多次交易,动态规划的利润和 d p [ i ] dp[i] dp[i] 有增加有减少,即买入时利润和减少,卖出时利润和增加

所以分两种情况,如何区分呢? d p [ i ] dp[i] dp[i] 增加一维,用二维来表示 d p [ i ] [ j ] dp[i][j] dp[i][j]但这里的第二维其实只需用来表示没有股票[0]或持有股票[1],也即没有股票的利润和 d p [ i ] [ 0 ] dp[i][0] dp[i][0]和持有股票的利润和 d p [ i ] [ 1 ] dp[i][1] dp[i][1]

  1. d p [ i ] [ 0 ] dp[i][0] dp[i][0]时,如何计算 d p [ i ] [ 0 ] dp[i][0] dp[i][0]呢?肯定是由前一天计算得出,前一天同样也有两种情况, d p [ i − 1 ] [ 0 ] dp[i-1][0] dp[i1][0]即前一天已经没有股票,或者 d p [ i − 1 ] [ 1 ] dp[i-1][1] dp[i1][1]前一天手里有股票,但为了计算得到 d p [ i ] [ 0 ] dp[i][0] dp[i][0],需要今天卖掉股票(价格是今日的 p r i c e [ i ] price[i] price[i],即 d p [ i − 1 ] [ 1 ] + p r i c e [ i ] dp[i-1][1]+price[i] dp[i1][1]+price[i],两种情况取最大值。
  2. 同理, d p [ i ] [ 1 ] dp[i][1] dp[i][1]时,前一天同样有两种情况, d p [ i − 1 ] [ 1 ] dp[i-1][1] dp[i1][1]即前一天已经有股票,或者 d p [ i − 1 ] [ 0 ] dp[i-1][0] dp[i1][0]前一天手里没有股票,但为了计算得到 d p [ i ] [ 1 ] dp[i][1] dp[i][1],需要今天买入股票(价格是今日的 p r i c e [ i ] price[i] price[i],即 d p [ i − 1 ] [ 0 ] − p r i c e [ i ] dp[i-1][0]-price[i] dp[i1][0]price[i],两种情况取最大值。

对于初始状态, d p [ 0 ] [ 0 ] = 0 , d p [ 0 ] [ 1 ] = − p r i c e s [ 0 ] dp[0][0]=0,dp[0][1]=−prices[0] dp[0][0]=0dp[0][1]=prices[0]

c++代码如下

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = int(prices.size());
        int dp[n][2];
        dp[0][0] = 0;
        dp[0][1] = -prices[0];
        for (int i = 1; i < n; ++i){
            // dp[i][0]第 i 天手里没有股票的利润和
            dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] + prices[i]);
            // dp[i][1]第 i 天手里有股票的利润和
            dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i]);          
        }
        return dp[n - 1][0];
    }
};

复杂度分析

  • 时间复杂度 O ( n ) O(n) O(n),只需要遍历一次。
  • 空间复杂度 O ( n ) O(n) O(n),使用了长度为 n n n的数组。

3 123. 买卖股票的最佳时机 III

给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

3.1 动态规划

本题有了最多两笔交易的限制,不能像之前那样多次买卖交易,而两次交易的话,其实最多就是4个状态

  1. 第一次买入后的利润和;
  2. 第一次卖出后的利润和;
  3. 第二次买入后的利润和;
  4. 第二次卖出后的利润和;

首先设第一次买入后的利润和为 b u y 1 buy1 buy1,而第 i i i天对应的有两种情况,一种是没有交易,仍未 b u y 1 buy1 buy1;一种是之前还没操作过,第一次买入,利润和即 − p r i c e s [ i ] -prices[i] prices[i]
b u y 1 = m a x ( b u y 1 , − p r i c e s [ i ] ) buy1 = max(buy1, -prices[i]) buy1=max(buy1,prices[i])
其次设第一次卖出后的利润和为 s e l l 1 sell1 sell1,而第 i i i天对应的有两种情况,一种是没有交易,仍未 s e l l 1 sell1 sell1;一种是第一次卖出,利润和即 b u y 1 + p r i c e s [ i ] buy1+prices[i] buy1+prices[i]
s e l l 1 = m a x ( s e l l 1 , b u y 1 + p r i c e s [ i ] ) sell1 = max(sell1, buy1 + prices[i]) sell1=max(sell1,buy1+prices[i])
然后设第二次买入后的利润和为 b u y 2 buy2 buy2,而第 i i i天对应的有两种情况,一种是没有交易,仍未 b u y 2 buy2 buy2;一种是第一次卖出后还没有第二次买入,利润和即 s e l l 1 − p r i c e s [ i ] sell1-prices[i] sell1prices[i]
b u y 2 = m a x ( b u y 2 , s e l l 1 − p r i c e s [ i ] ) buy2 = max(buy2, sell1 - prices[i]) buy2=max(buy2,sell1prices[i])
最后设第二次卖出后的利润和为 s e l l 2 sell2 sell2,而第 i i i天对应的有两种情况,一种是没有交易,仍未 s e l l 2 sell2 sell2;一种是第二次卖出,利润和即 b u y 2 + p r i c e s [ i ] buy2+prices[i] buy2+prices[i]
s e l l 2 = m a x ( s e l l 2 , b u y 2 + p r i c e s [ i ] ) sell2 = max(sell2, buy2 + prices[i]) sell2=max(sell2,buy2+prices[i])

对于初始状态, b u y 1 = − p r i c e s [ 0 ] , s e l l 1 = 0 , b u y 2 = − p r i c e s [ 0 ] , s e l l 2 = 0 buy1 = -prices[0], sell1 = 0, buy2 = -prices[0], sell2 = 0 buy1=prices[0],sell1=0,buy2=prices[0],sell2=0

c++代码如下

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        int buy1 = -prices[0], sell1 = 0, buy2 = -prices[0], sell2 = 0;
        for (int i = 1; i < n; ++i){
            buy1 = max(buy1, -prices[i]);
            sell1 = max(sell1, buy1 + prices[i]);
            buy2 = max(buy2, sell1 - prices[i]);
            sell2 = max(sell2, buy2 + prices[i]);
        }
        return sell2;
    }
};

复杂度分析

  • 时间复杂度 O ( n ) O(n) O(n),其中 n n n 是数组 p r i c e s prices prices 的长度。
  • 空间复杂度 O ( 1 ) O(1) O(1)

4 188. 买卖股票的最佳时机 IV

给你一个整数数组 prices 和一个整数 k ,其中 prices[i] 是某支给定的股票在第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。也就是说,你最多可以买 k 次,卖 k 次。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

4.1 动态规划

相比上一题的3.1解法,本题由2次的限制变成了k次,但整体的思想是可以延用的,对应的 b u y 2 buy2 buy2 s e l l 2 sell2 sell2也变成了 b u y [ j ] buy[j] buy[j] s e l l [ j ] sell[j] sell[j],即有2种状态

  1. j次买入后的利润和,设为 b u y [ j ] buy[j] buy[j]
  2. j次卖出后的利润和,设为 s e l l [ j ] sell[j] sell[j]

首先第 j j j次买入交易对应的有两种情况,一种是没有交易,利润和仍未 b u y [ j ] buy[j] buy[j];一种是要进行买入,利润和是在前一次 [ j − 1 ] [j-1] [j1]卖出后的利润和 s e l l [ j − 1 ] sell[j-1] sell[j1]的基础上,减去本次交易的价格 p r i c e s [ i ] prices[i] prices[i],即 s e l l [ j − 1 ] − p r i c e s [ i ] sell[j-1]-prices[i] sell[j1]prices[i]
b u y [ j ] = m a x ( b u y [ j ] , s e l l [ j − 1 ] − p r i c e s [ i ] ) buy[j] = max(buy[j], sell[j - 1] - prices[i]) buy[j]=max(buy[j],sell[j1]prices[i])
其次第 j j j次卖出交易对应的也有两种情况,一种是没有交易,利润和仍未 s e l l [ j ] sell[j] sell[j];一种是要进行卖出,利润和是在第 [ j ] [j] [j]次买入后的利润和 b u y [ j ] buy[j] buy[j]的基础上,加上本次交易的价格 p r i c e s [ i ] prices[i] prices[i],即 b u y [ j ] + p r i c e s [ i ] buy[j] + prices[i] buy[j]+prices[i]
s e l l [ j ] = m a x ( s e l l [ j ] , b u y [ j ] + p r i c e s [ i ] ) sell[j] = max(sell[j], buy[j] + prices[i]) sell[j]=max(sell[j],buy[j]+prices[i])

对于初始状态, v e c t o r b u y ( 3 , − p r i c e s [ 0 ] ) , s e l l ( 3 , 0 ) vector buy(3, -prices[0]), sell(3, 0) vectorbuy(3,prices[0]),sell(3,0)

c++代码如下

class Solution {
public:
    int maxProfit(int k, vector<int>& prices) {
        int n = prices.size();
        vector buy(3, -prices[0]), sell(3, 0);
        for (int i = 1; i < n; ++i) {
            for (int j = 1; j <= k; j++) {
                buy[j] = max(buy[j], sell[j - 1] - prices[i]);
                sell[j] = max(sell[j], buy[j] + prices[i]);
            }
        }
        return sell[k];
    }
};

复杂度分析

  • 时间复杂度 O ( n m i n ( n , k ) ) O(nmin(n,k)) O(nmin(n,k)),其中 n n n 是数组 p r i c e s prices prices 的大小,即我们使用二重循环进行动态规划需要的时间;
  • 空间复杂度 O ( m i n ( n , k ) ) O(min(n,k)) O(min(n,k)),一维数组。

5 309. 买卖股票的最佳时机含冷冻期

给定一个整数数组prices,其中第 prices[i] 表示第 i 天的股票价格 。​
设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):
卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

5.1 动态规划

本题可以在第2题的基础上思考,多了一个冷冻期的限制。

所以也是分两种情况,用二维来表示 d p [ i ] [ j ] dp[i][j] dp[i][j],设持有股票的收益 d p [ i ] [ 0 ] dp[i][0] dp[i][0]和不持有股票的利润和 d p [ i ] [ 1 ] dp[i][1] dp[i][1]**。

  1. d p [ i ] [ 0 ] dp[i][0] dp[i][0]时,有两种情况,一种是持有股票并不交易,收益就是和前一天一样,即 d p [ i − 1 ] [ 0 ] dp[i-1][0] dp[i1][0];或今日进行买入交易,由于有1天冷冻期的限制,所以是在前2天的不持有股票的利润和 d p [ i − 2 ] [ 1 ] dp[i-2][1] dp[i2][1]的基础上,减去今日需要买入股票价(价格是今日的 p r i c e [ i ] price[i] price[i],即 d p [ i − 2 ] [ 1 ] − p r i c e [ i ] dp[i-2][1]-price[i] dp[i2][1]price[i],两种情况取最大值。
    d p [ i ] [ 0 ] = m a x ( d p [ i − 1 ] [ 0 ] , d p [ i − 2 ] [ 1 ] − p r i c e s [ i ] ) dp[i][0] = max(dp[i-1][0], dp[i-2][1]-prices[i]) dp[i][0]=max(dp[i1][0],dp[i2][1]prices[i])
  2. 同理, d p [ i ] [ 1 ] dp[i][1] dp[i][1]时,也有两种情况,一种是持续不持有股票,收益就是和前一天一样,即 d p [ i − 1 ] [ 1 ] dp[i-1][1] dp[i1][1];或今日进行卖出交易,由于卖出没有限制,所以仍旧是在前1天的持有股票的利润和 d p [ i − 1 ] [ 0 ] dp[i-1][0] dp[i1][0]的基础上,增加今日卖出的股票价(价格是今日的 p r i c e [ i ] price[i] price[i],即 d p [ i − 1 ] [ 0 ] + p r i c e [ i ] dp[i-1][0]+price[i] dp[i1][0]+price[i],两种情况取最大值。
    d p [ i ] [ 1 ] = m a x ( d p [ i − 1 ] [ 1 ] , d p [ i − 1 ] [ 0 ] + p r i c e s [ i ] ) dp[i][1] = max(dp[i-1][1], dp[i-1][0]+prices[i]) dp[i][1]=max(dp[i1][1],dp[i1][0]+prices[i])

对于初始状态, d p [ 0 ] [ 0 ] = − p r i c e s [ 0 ] , d p [ 1 ] [ 0 ] = m a x ( − p r i c e s [ 0 ] , − p r i c e s [ 1 ] ) , d p [ 1 ] [ 1 ] = m a x ( 0 , p r i c e s [ 1 ] − p r i c e s [ 0 ] ) dp[0][0]=−prices[0],dp[1][0]=max(-prices[0], -prices[1]),dp[1][1] = max(0, prices[1]-prices[0]) dp[0][0]=prices[0]dp[1][0]=max(prices[0],prices[1])dp[1][1]=max(0,prices[1]prices[0])

c++代码如下

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        if(n == 1){
            return 0;
        } 
        vector<vector<int>> dp(n, vector<int>(2));
        dp[0][0] = -prices[0];
        dp[1][0] = max(-prices[0], -prices[1]);
        dp[1][1] = max(0, prices[1]-prices[0]);
        for(int i = 2; i < n; ++i){
            dp[i][0] = max(dp[i-1][0], dp[i-2][1]-prices[i]);
            dp[i][1] = max(dp[i-1][1], dp[i-1][0]+prices[i]);
        }
        return dp[n-1][1];
    }
};

复杂度分析

  • 时间复杂度 O ( n ) O(n) O(n),只需要遍历一次。
  • 空间复杂度 O ( n ) O(n) O(n),使用了长度为 n n n的数组。

6 714. 买卖股票的最佳时机含手续费

给定一个整数数组 prices,其中 prices[i]表示第 i 天的股票价格 ;整数 fee 代表了交易股票的手续费用。
你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。
返回获得利润的最大值。
注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。

6.1 动态规划

本题可以在第2题的基础上思考,比第5题简单,仅仅多了一个手续费的问题,即在 d p [ i ] [ 0 ] dp[i][0] dp[i][0]时,卖出股票时,减去对应的手续费fee,其他保持不变。

  1. d p [ i ] [ 0 ] dp[i][0] dp[i][0]时,状态转移方程:
    d p [ i ] [ 0 ] = m a x ( d p [ i − 1 ] [ 0 ] , d p [ i − 1 ] [ 1 ] + p r i c e s [ i ] − f e e ) dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] + prices[i] - fee) dp[i][0]=max(dp[i1][0],dp[i1][1]+prices[i]fee)
  2. d p [ i ] [ 1 ] dp[i][1] dp[i][1]时,状态转移方程:
    d p [ i ] [ 1 ] = m a x ( d p [ i − 1 ] [ 1 ] , d p [ i − 1 ] [ 0 ] − p r i c e s [ i ] ) dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i]) dp[i][1]=max(dp[i1][1],dp[i1][0]prices[i])

对于初始状态, d p [ 0 ] [ 0 ] = 0 , d p [ 0 ] [ 1 ] = − p r i c e s [ 0 ] dp[0][0]=0,dp[0][1]=−prices[0] dp[0][0]=0dp[0][1]=prices[0]

c++代码如下

class Solution {
public:
    int maxProfit(vector<int>& prices, int fee) {
        int n = int(prices.size());
        int dp[n][2];
        dp[0][0] = 0;
        dp[0][1] = -prices[0];
        for (int i = 1; i < n; ++i){
            // dp[i][0]第 i 天手里没有股票的利润和
            dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] + prices[i] - fee);
            // dp[i][1]第 i 天手里有股票的利润和
            dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i]);          
        }
        return dp[n - 1][0];        
    }
};

复杂度分析

  • 时间复杂度 O ( n ) O(n) O(n),只需要遍历一次。
  • 空间复杂度 O ( n ) O(n) O(n),使用了长度为 n n n的数组。

Reference

  • 👉 简单—> 121. 买卖股票的最佳时机
  • 👉 中等—> 122. 买卖股票的最佳时机 II
  • 👉 困难—> 123. 买卖股票的最佳时机 III
  • 👉 困难—> 188. 买卖股票的最佳时机 IV
  • 👉 中等—> 309. 买卖股票的最佳时机含冷冻期
  • 👉 中等—> 714. 买卖股票的最佳时机含手续费



⭐️👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍🌔

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1105430.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

每日温度00

题目链接 每日温度 题目描述 注意点 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替1 < temperatures.length < 100000 解答思路 使用单调栈解决本题&#xff0c;思路为&#xff1a…

IEEE754 FP16

一. 实数的表达方法 1.定点数表示法 <整数部分>.<小数部分> 例. 666.66 2.浮点数表示法 科学计数法&#xff1a;有效数字基数&#xff08;base&#xff09;指数&#xff08;exponent&#xff09;正负符号位 规范化表示&#xff1a;d.ddd*β^e&#xff08;0&…

智能井盖的用处有哪些?好用在什么地方?

智能井盖是一种基于物联网技术的井盖系统&#xff0c;通过集成传感器、通信设备和数据处理功能&#xff0c;实现对井盖的实时监测、远程管理和智能化控制。WITBEE万宾的智能井盖传感器EN100-C2&#xff0c;只要在城市需要的井盖上面安装即可使用&#xff0c;一体式结构&#xf…

Python pip 替换国内镜像源

pip它还有一个非常好的特点&#xff0c;当你安装一个库的时候&#xff0c;它会自动帮你安装所有这个库的依赖库。完全一键式操作。非常方便。但是由于pipy网站是国外网站&#xff0c;很容易会被墙&#xff0c;导致经常下载速度非常慢&#xff0c;经常超时。 解决办法&#xff…

BSA研究方案——如何从容不迫的进行性状定位

&#xff08;一&#xff09;BSA基本概念 BSA即集群分离分析法&#xff0c;是Bulked-Segregant Analysis的首字母缩写。具体是利用差异目标性状的两个亲本构建家系&#xff0c;在子代分离群体中选取目标性状个体构建DNA混合池&#xff0c;采用高通量测序技术对混池DNA进行建库测…

在VScode中启动的前端项目关于 Local 和 Network 两个地址的区别

首先这两个地址在你的电脑上都是可以访问的 具体区别&#xff1a; localhost 是供当前电脑访问的地址&#xff0c;仅供你自己访问&#xff0c;其他人通过localhost 是访问不到你跑的项目的。你把 localhost 换成IP地址 127.0.0.1 也是相同的效果&#xff0c;因为 127.0.0.1 也…

uniapp vue3.0+TS 上传单张或多张图片,并且能删除和预览。

一、uniapp vue3.0TS 上传单张或多张图片&#xff0c;并且能删除和预览。 效果&#xff1a;人菜话不多 先上效果&#xff1a; 二、代码 1.HTML 上传图片相关代码 代码如下&#xff1a; <template><view class"images_box"><view class"img…

初始web项目tomcat部署报错404

问题 简单地创建了一个web项目&#xff0c;结果一运行就404咧&#xff0c;真滴烦。。。接下来的项目也没法继续了 问题原因&#xff1a;缺少文件 其实造成这样问题的原因有不少&#xff0c;但在这里我是踩了一个坑。在出问题之前&#xff0c;我运行的其他项目都是可以跑的&…

antdv 锚点踩坑

目录 1.锚点无滚动效果 2. 进入页面跳转到指定锚点 1.锚点无滚动效果 背景&#xff1a;使用antd的锚点时&#xff0c;按照官方文档的用法配置之后发现锚点组件的锚点Title位置没办法随着我的页面滚动而变化&#xff0c;但是点击Title跳转具体锚定位置的功能却是没有问题的 解…

使用 Elasticsearch 作为向量数据库:深入研究 dense_vector 和 script_score

Elasticsearch 是一个非常强大且灵活的搜索和分析引擎。 虽然其主要用例围绕全文搜索&#xff0c;但它的用途广泛&#xff0c;足以用于各种其他功能。 其中一项引起许多开发人员和数据科学家关注的功能是使用 Elasticsearch 作为向量数据库。 随着 dense_vector 数据类型的出现…

排名评估指标综合指南

一、介绍 右排序是机器学习中的一个问题&#xff0c;其目标是以最合适的方式对最终用户的文档列表进行排序&#xff0c;因此最相关的文档出现在顶部。排名出现在数据科学的多个领域中&#xff0c;从推荐系统开始&#xff0c;算法建议一组要购买的商品&#xff0c;最后到 NLP 搜…

STM32F4X TFTLCD ST7735S使用

STM32F4X TFTLCD ST7735S使用 TFTLCD简介TFTLCD使用TFTLCD特点TFTLCD的概念TFTLCD色彩空间三原色RGB颜色RGB565RGB666RGB888 ST7735S驱动芯片ST7735S引脚定义ST7735S 4线SPI模式ST7735S显示原理ST7735S分辨率ST7735S显存结构ST7735S像素点扫描模式MCU操作ST7735S显存方法 TFTLC…

解决appium或selenium使用时driver.find_element_by_xpath中间有删除线问题

一、问题描述 Darren洋在公司电脑搭建完成appium后准备运行appium2.0版本执行脚本时发现执行脚本中的driver.find_element_by_xpath中间有删除线&#xff0c;说明较高版本的appium及selenium中该方法已被弃用。 二、解决办法 该问题解决办法为将driver.find_element_by_xpath()…

广东金媒人的线下交友活动有哪些吸引点呢?

广东金媒人线下交友活动吸引人的地方还是不少的&#xff0c;这也是举办活动的机构中&#xff0c;都具备的优点。 金媒人现场活动有专业的主持人&#xff0c;可以及时帮助大家解疑答惑&#xff0c;让相亲更高效。活动场地都是比较正式、开阔的&#xff0c;一般是西餐厅类型的地方…

网络电视机顶盒怎么样?内行揭晓网络电视机顶盒排名

网络电视机顶盒怎么样&#xff1f;可以说是家家户户不可或缺的部分&#xff0c;但很多朋友买回家发现经常死机和卡顿&#xff0c;究竟要如何选择才不踩坑呢&#xff1f;我身为业内人士给各位分享业内最新发布的网络电视机顶盒排名&#xff0c;跟着我一起看看哪些网络机顶盒最值…

浅谈AI大模型技术:概念、发展和应用

AI大模型技术是指使用超大规模的深度学习模型来解决各种复杂的人工智能问题&#xff0c;如自然语言处理、计算机视觉、多模态交互等。AI大模型技术具有强大的学习能力和泛化能力&#xff0c;可以在多种任务上取得优异的性能&#xff0c;但也面临着计算、存储、通信等方面的挑战…

layui 表格 展开

一、表格嵌套表格&#xff08;手风琴打开&#xff09; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>设备上下线统计</title><script type"text/javascript" src"../../../l…

【NPM】particles.vue3 + tsparticles 实现粒子效果

在 NPM 官网搜索这两个库并安装&#xff1a; npm install element-plus --save npm i tsparticles使用提供的 vue 案例和方法&#xff1a; <template><div><vue-particlesid"tsparticles":particlesInit"particlesInit":particlesLoaded&…

【C语言刷题】#define宏实现一个整数的二进制位的奇数位和偶数位交换

本篇文章目录 1. 分析如何交换1.2 得到所有奇数位1.2 得到所有偶数位1.3 奇数位和偶数位交换后相加 2. 实现交换 1. 分析如何交换 这里为了方便演示&#xff0c;使用较小的正整数&#xff08;负数也是一样的&#xff0c;只不过要用算下补码&#xff09;&#xff0c;且不用一个…

VMware Greenplum 7 正式发布!

在当今瞬息万变的商业环境中&#xff0c;企业持续寻求创新途径以优化运营、简化决策过程&#xff0c;并构建独特的竞争优势。实现这些目标的关键在于有效利用海量数据资源。然而&#xff0c;这项任务并不轻松。数据的数量、复杂性和来源呈现出爆发性增长&#xff0c;同时从数据…