【代码随想录】刷题笔记Day51

前言

  • 周六刷题,闻所未闻吧兄弟,不用开组会简直太爽啦

300. 最长递增子序列 - 力扣(LeetCode)

  • 子序列系列问题,用动态规划解决
  • dp[i]含义
    • 表示i之前包括i的以nums[i]结尾的最长递增子序列的长度
  • 递推公式
    • j从0到i-1各个位置的最长升序子序列 + 1 的最大值
    • if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1);
  • 初始化
    • dp[i] = 1,长度都为1
  • 遍历顺序
    • 从前到后,i从1到size-1,j从0到i-1
  • 结果
    • 更新dp的时候更新最大值(不是取dp[size-1])
  • class Solution {
    public:
        int lengthOfLIS(vector<int>& nums) {
            int len = nums.size();
            vector<int> dp(len, 1);
            int res = 1;  // 答案最少也有1
            for(int i = 1; i < len; i++){
                for(int j = 0; j < i; j++){
                    if(nums[i] > nums[j]){
                        dp[i] = max(dp[j] + 1, dp[i]);
                    }
                    res = max(res, dp[i]);  // 取长的子序列
                }
            }
            return res;
        }
    };

674. 最长连续递增序列 - 力扣(LeetCode) 

  • 贪心法

    • 遇到nums[i] > nums[i - 1]的情况,count++,否则count为1,记录count的最大值
    • class Solution {
      public:
          int findLengthOfLCIS(vector<int>& nums) {
              int res = 1;  // 连续子序列最少是1
              int count = 1;
              for(int i = 1; i < nums.size(); i++){
                  if(nums[i] > nums[i - 1]) count++;  // 连续记录
                  else count = 1;  // 不连续,从头开始
                  res = max(res, count);  // 更新最长连续
              }
              return res;
          }
      };
  •  动规法

    • dp[i]:以下标i为结尾的连续递增的子序列长度为dp[i]
    • if(nums[i] > nums[i - 1])  dp[i] = max(dp[i - 1] + 1, dp[i]);

    • class Solution {
      public:
          int findLengthOfLCIS(vector<int>& nums) {
              int len = nums.size();
              vector<int> dp(len, 1);
              int res = 1;
              for(int i = 1; i < len; i++){
                  if(nums[i] > nums[i - 1]){  // 连续记录
                      dp[i] = max(dp[i - 1] + 1, dp[i]);
                  }
                  res = max(dp[i], res);
              }
              return res;
          }
      };

 718. 最长重复子数组 - 力扣(LeetCode)

  • dp[i][j]含义
    • 以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i][j]
    • 不定义下标i是因为初始化更方便,[-1]直接初始为0
  • 递推公式
    • 当A[i - 1] 和B[j - 1]相等的时候,dp[i][j] = dp[i - 1][j - 1] + 1;
  • 初始化
    • dp[i][0] 和dp[0][j]初始化为0
  • 遍历顺序
    • 两层for遍历两个数组,记录最大值
  • class Solution {
    public:
        int findLength(vector<int>& nums1, vector<int>& nums2) {
            vector<vector<int>> dp (nums1.size() + 1, vector<int>(nums2.size() + 1, 0));
            int result = 0;
            for (int i = 1; i <= nums1.size(); i++) {
                for (int j = 1; j <= nums2.size(); j++) {
                    if (nums1[i - 1] == nums2[j - 1]) {
                        dp[i][j] = dp[i - 1][j - 1] + 1;
                    }
                    if (dp[i][j] > result) result = dp[i][j];
                }
            }
            return result;
        }
    };

后言

  • 好耶,刚好刷完,找女朋友玩耍去咯~ 

相关推荐

  1. 代码随想笔记Day51

    2024-01-13 12:52:02       53 阅读
  2. 代码随想笔记Day55

    2024-01-13 12:52:02       54 阅读
  3. 代码随想笔记Day36

    2024-01-13 12:52:02       41 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-13 12:52:02       75 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-13 12:52:02       80 阅读
  3. 在Django里面运行非项目文件

    2024-01-13 12:52:02       64 阅读
  4. Python语言-面向对象

    2024-01-13 12:52:02       75 阅读

热门阅读

  1. google drive api

    2024-01-13 12:52:02       49 阅读
  2. 【AI】Pytorch 系列:学习率设置

    2024-01-13 12:52:02       51 阅读
  3. 网络视频监控和流媒体技术-基础知识整理

    2024-01-13 12:52:02       37 阅读
  4. vue3+TS使用component 组件的实例

    2024-01-13 12:52:02       53 阅读
  5. 多线程面试题目(1)

    2024-01-13 12:52:02       56 阅读
  6. K8S的搭建步骤

    2024-01-13 12:52:02       57 阅读
  7. 单片机学习记录(一)

    2024-01-13 12:52:02       43 阅读
  8. Spring整理-Spring Bean的作用域

    2024-01-13 12:52:02       48 阅读
  9. PyTorch核心--tensor 张量 !!

    2024-01-13 12:52:02       51 阅读
  10. AOSP 编译

    2024-01-13 12:52:02       51 阅读
  11. Spring整理-Spring Bean的生命周期

    2024-01-13 12:52:02       52 阅读