当前位置: 首页 > news >正文

力扣刷题DAY11(动态规划-线性DP)

一、最长上升子序列

300. 最长递增子序列

 (一)初版代码

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        int n = nums.size();
        vector<int> f(n + 1, 1); //初始化为1,因为每个数至少可以作为一个单独的序列
        int m = 1;//初始化为1,因为每个数至少可以作为一个单独的序列
        for (int i = 1; i <= n; i++) {
            for (int j = i - 1; j > 0; j--) {
                if (nums[j - 1] < nums[i - 1]) {
                    f[i] = max(f[j] + 1, f[i]);
                    m = max(m, f[i]);
                }
            }
        }
        return m;
    }
};

复杂度分析

  • 时间复杂度:O(n2),其中 n 为 nums 的长度。
  • 空间复杂度:O(n)。

易错点:

 初始化问题:数组和max值都要初始化为1,因为每个数至少可以作为一个单独的序列。

(二)优化动态规划算法:贪心+二分查找

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        int n = nums.size();
        vector<int> g;
        for (int i = 0; i < n; i++) {
            auto it = lower_bound(g.begin(), g.end(), nums[i]);
            if (it != g.end()) {
                *it = nums[i];
            } else
                g.push_back(nums[i]);
        }
        return g.size();
    }
};

复杂度分析

  • 时间复杂度:O(nlogn),其中 n 为 nums 的长度。
  • 空间复杂度:O(n)。

二、买卖股票的最佳时机

 121. 买卖股票的最佳时机

(一)暴力算法(超时)

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = (int)prices.size(), 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(n2),其中 n 为 nums 的长度。
  • 空间复杂度:O(1)。

(二)动态规划 

#include <climits> // 引入INT_MAX

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

复杂度分析

  • 时间复杂度:O(n),其中 n 为 nums 的长度。
  • 空间复杂度:O(1)。

相关文章:

  • 设计模式 --- 状态模式
  • 【软件测试】Postman中如何搭建Mock服务
  • Java流程控制【if分支三种形式】
  • 前端知识点---垃圾回收机制(javascript)
  • mybatis-plus sql改写插件(二)
  • Android:Android Studio右侧Gradle没有assembleRelease等选项
  • 使用js脚本自动生成android项目的app icon图标
  • UML综合实验四
  • 【Linux】进程控制:创建、终止、等待与替换全解析
  • TurtleBot3 Package turtlebot3_drive source code read
  • web前端: 什么是web?
  • Linux shell脚本编程
  • <数据集>苹果识别数据集<目标检测>
  • Python标准库:sys模块深入解析
  • 增长黑客:技术与业务融合,驱动业务增长
  • 电商核心指标解析与行业趋势:数据驱动的增长策略【大模型总结】
  • ZeroLogon(CVE-2020-1472)漏洞复现
  • [蓝桥杯 2022 省 B] 李白打酒加强版
  • 工业制造各个系统术语
  • 提升Windows安全的一些措施
  • 网站设计心的/百度站长统计
  • 焦作电子商务网站建设实例/安卓优化大师下载安装到手机
  • 专业做logo的网站/网站网址查询工具
  • wordpress主页不显示/吉安seo网站快速排名
  • 东营 网站建设/2021关键词搜索排行
  • 在线修图网站/淮安网站seo