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

免费网站建设嘉兴网站建设

免费网站建设,嘉兴网站建设,苏州有什么好玩的景点,合肥软件公司排名📝前言说明: 本专栏主要记录本人的动态规划算法学习以及LeetCode刷题记录,按专题划分每题主要记录:(1)本人解法 本人屎山代码;(2)优质解法 优质代码;&…

📝前言说明:

  • 本专栏主要记录本人的动态规划算法学习以及LeetCode刷题记录,按专题划分
  • 每题主要记录:(1)本人解法 + 本人屎山代码;(2)优质解法 + 优质代码;(3)精益求精,更好的解法和独特的思想(如果有的话)
  • 文章中的理解仅为个人理解。如有错误,感谢纠错

🎬个人简介:努力学习ing
📋本专栏:C++刷题专栏
📋其他专栏:C语言入门基础,python入门基础,C++学习笔记,Linux
🎀CSDN主页 愚润泽

你可以点击下方链接,进行不同专题的动态规划的学习

点击链接开始学习
斐波那契数列模型路径问题
简单多状态(一)简单多状态(二)
子数组系列(一)子数组系列(二)
子序列问题(一)子序列问题(二)
回文串问题两个数组dp问题(一)
两个数组的dp问题(二)01背包问题
完全背包二维的背包问题
其他

题目

  • 1218. 最长定差子序列
    • 优质解
  • 873. 最长的斐波那契子序列的长度
    • 优质解
  • 1027. 最长等差数列
    • 优质解
  • 446. 等差数列划分 II - 子序列
    • 优质解


1218. 最长定差子序列

题目链接:https://leetcode.cn/problems/longest-arithmetic-subsequence-of-given-difference/description/
在这里插入图片描述


优质解

思路:

  • 像解递增一样解这道题肯定是超时的,时间复杂度太高了
  • 我们要利用题目的difference信息,我们可以通过difference信息直接计算出前一个数的值
  • 然后准确找到前一个数的下标,把dp[i]更新
  • 怎么快速找前一个数呢?利用哈希表

代码(直接在哈希表里面dp):

class Solution {
public:int longestSubsequence(vector<int>& arr, int difference) {int n = arr.size();unordered_map<int, int> hash; // 存储{arr[i], dp[i]}int ans = 1;hash.insert({arr[0], 1}); // 初始化插入第一个元素for(int i = 1; i < n; i++){int front = arr[i] - difference;hash[arr[i]] = hash.find(front) != hash.end()? hash[front] + 1 : 1;ans = max(hash[arr[i]], ans);}return ans;}
};

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)


873. 最长的斐波那契子序列的长度

题目链接:https://leetcode.cn/problems/length-of-longest-fibonacci-subsequence/description/
在这里插入图片描述


优质解

思路:

  • 因为一个斐波那契数列依赖于三个数
  • 像之前的题目,如果我们知道nums[i],则我们可以根据遍历i前的所有nums[j]来确定子序列的样子
  • 但是这里,我们仅靠i + 遍历,是无法确定斐波那契数列的样子
  • 所以我们需要:i + j + 遍历
  • dp[i][j]:以 i 位置以及 j 位置的元素为结尾的所有的子序列中,最长的斐波那契子序列的长度( j < i
  • 状态转移方程
    • 先找到一个nums[k] == nums[i] - nums[j](并且这个k < j
    • dp[i][j] = dp[j][k] + 1
  • 初始化:dp的所有值为 2
  • 返回值:dp里面最大的,如果最大的是 2 则返回 0

代码:

class Solution {
public:int lenLongestFibSubseq(vector<int>& arr) {int n = arr.size();if(n < 3) return 0;unordered_map<int, int> hash; // {arr[i], 下标} 方便查找元素for(int i = 0; i < n; i++) hash[arr[i]] = i; // 此题没有重复元素int ans = 2;vector<vector<int>> dp(n, vector<int>(n, 2));for(int i = 2; i < n; i++){for(int j = i - 1; j >= 1; j--){int a = arr[i] - arr[j];if(a < arr[j] && hash.find(a) != hash.end()){dp[i][j] = dp[j][hash[a]] + 1;}ans = max(dp[i][j], ans);}}return ans > 2? ans : 0;}
};

时间复杂度: O ( n 2 ) O(n^2) O(n2)
空间复杂度: O ( n 2 ) O(n^2) O(n2)


1027. 最长等差数列

题目链接:https://leetcode.cn/problems/longest-arithmetic-subsequence/description/
在这里插入图片描述


优质解

思路:

  • 因为会有重复元素,只能一遍dp,一遍加{元素,下标}

代码:

class Solution {
public:int longestArithSeqLength(vector<int>& nums) {int n = nums.size();if(n < 3) return n;unordered_map<int, int> hash; // {元素, 下标}hash[nums[0]] = 0;vector<vector<int>> dp(n, vector<int>(n, 2));int ans = 2;for(int j = 1; j < n - 1; j++) // 先枚举倒数第二个,因为要加入dp{for(int i = j + 1; i < n; i++){int a = 2 * nums[j] - nums[i];if(hash.find(a) != hash.end()) // hash[a] < j 天然满足理论,因为每次往hash表里加的都是前[0, j - 1]的元素{dp[i][j] = dp[j][hash[a]] + 1;}ans = max(ans, dp[i][j]);}// 放在后面加,因为往前找元素的时候,找的是倒数第二个元素之前的元素// 为什么可以覆盖前面同元素的下标?(因为,我们可以只考虑最后一个,因为最后一个的“最长子序列”最长)hash[nums[j]] = j; }return ans;}
};

时间复杂度: O ( n 2 ) O(n^2) O(n2)
空间复杂度: O ( n 2 ) O(n^2) O(n2)


446. 等差数列划分 II - 子序列

题目链接:https://leetcode.cn/problems/arithmetic-slices-ii-subsequence/description/
在这里插入图片描述


优质解

思路:

  • 看上去感觉跟前面的题目一样,但是怎么处理重复元素的问题呢?
  • 这里要统计全部,而不是只关注最后一个
  • 所以我们可以用一个vector来记录所有下标,提前把所有元素与下标数组绑定
  • 在判断是否为前驱元素的时候,多加一个下标判断

代码:

class Solution {
public:int numberOfArithmeticSlices(vector<int>& nums) {int n = nums.size();unordered_map<long long, vector<int>> hash; // {元素, 下标数组}for(int i = 0; i < n; i++)hash[nums[i]].push_back(i);vector<vector<int>> dp(n, vector<int>(n, 0));int ans = 0;for(int j = 1; j < n - 1; j++){for(int i = j + 1; i < n; i++){long long num = 2 * (long long)nums[j] - nums[i]; // 会溢出,先强转nums[i]if(hash.find(num) != hash.end()){for(auto k: hash[num]){// 为什么是:+= 不是 = ?// 因为:以 j,i为结尾的数组基于多个 以 k, j结尾的数组if(k < j) dp[i][j] += dp[j][k] + 1;}}ans += dp[i][j];}}return ans;}
};

时间复杂度: O ( n 3 ) O(n^3) O(n3),最坏
空间复杂度: O ( n 2 ) O(n^2) O(n2)


🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

http://www.dtcms.com/wzjs/27099.html

相关文章:

  • 做网站花钱吗网站关键词推广
  • 平面设计师常用的素材网站高质量关键词搜索排名
  • 做网站模板的网页名称是m开头免费网站开发平台
  • 枣庄网站设计微信营销神器
  • 网站建设 开发工具 python营销伎巧第一季
  • 网站图片链接是怎么做的百度账号管理
  • html5企业网站案例游戏推广合作
  • 网站开发人员薪资网站优化主要优化哪些地方
  • 北京 网站建设公司网站优化设计的基础是网站基本要素及每个细节的优化
  • 采集电影做的网站网推
  • 上海做网站 公司排名网站优化哪个公司好
  • 想学做网站学那个软件好win7优化软件
  • ftp网站建设百度爱采购优化排名软件
  • 举例描述该如何布局网站关键词重庆seo建站
  • 网站做定制还是固定模板企业网站建站模板
  • 这几年做哪个网站能致富猪肉价格最新消息
  • 网站 域名 空间 服务器2345浏览器网站进入
  • 网站建设嘉兴公司电话app拉新推广平台有哪些
  • 北京招聘网站排行百度搜索关键词技巧
  • 内蒙古建设厅官方网站seo优化软件
  • 免费申请网站首选百度seo和sem是什么意思
  • 企业网站seo诊断微信营销平台哪个好
  • 乐清北白象网络怎么装百度seo排名优化公司哪家好
  • 建设工程质量检测公司网站免费网页空间到哪申请
  • 网站建设费可以一次性冲费用吗一个产品的网络营销方案
  • 微网站制作方案国外搜索引擎排行榜
  • 怎么让做的网站赚钱吗seo引擎
  • 一那个网站可以做一建题江苏网站建站系统哪家好
  • 凡客网站做SEO能被收录吗友情链接是啥意思
  • 动态网站设计分析淘宝推广