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

国外做水广告网站大全最流行网站开发工具

国外做水广告网站大全,最流行网站开发工具,wordpress批量上传图片,html5国内网站建设文章目录 方法一:动态规划方法二:贪心 二分查找构造最长递增子序列 方法一:动态规划 dp[i]:末尾元素为arr[i]的最长子序列的长度 从0遍历到i - 1,若遍历到的元素小于当前值arr[i],表示当前值arr[i]可以和…

文章目录

    • 方法一:动态规划
    • 方法二:贪心 + 二分查找
    • 构造最长递增子序列

在这里插入图片描述

方法一:动态规划

  • dp[i]:末尾元素为arr[i]的最长子序列的长度

在这里插入图片描述

从0遍历到i - 1,若遍历到的元素小于当前值arr[i],表示当前值arr[i]可以和前面的某个值组成递增序列,则尝试更新dp[i]

int LIS(vector<int>& arr) {int n = arr.size();if(n == 0) return 0;vector<int> dp(n, 1);int ans = 1;for(int i = 1; i < n; i++){for(int j = 0; j < i; j++){if(arr[j] < arr[i]){dp[i] = max(dp[i], dp[j] + 1);}}ans = max(ans, dp[i]);}return ans;
}

时间复杂度: O ( N 2 ) O(N^2) O(N2)

方法二:贪心 + 二分查找

我们考虑维护一个数组 min_tails,min_tails[i]表示长度为i + 1的递增子序列末尾元素的最小值,min_tails并不是记录arr中的递增子序列

在这里插入图片描述

看最后一个g数组,g[2]=3,表示长度为3的递增子序列末尾的最小值为3。长度为3的递增子序列有[1,6,7]、[1,2,4]、[1,2,5]、[1,2,3]

为什么min_tails数组中要维护各个不同长度递增子序列末尾元素的最小值呢?

min_tails数组中维护各个不同长度递增子序列末尾元素的最小值时,arr的后续元素可以和不同长度子序列末尾的最小值比较,从而确定后续元素可以加入哪个子序列,成为新的递增子序列

在这里插入图片描述

int LIS(vector<int>& arr) {int n = arr.size();if(n == 0) return 0;vector<int> tails(n);min_tails[0] = arr[0];int len = 1;for(int i = 1; i < n; i++){// 如果当前元素比长度为len的子序列末尾元素的最小值大,说明当前元素可以和长度为len的子序列组成新的递增子序列if(min_tails[len - 1] < arr[i]){min_tails[len] = arr[i];len++;continue;}// 二分:用arr[i]更新tails中最靠左侧的大于arr[i]的值int l = 0;int r = len;while(l < r){int mid = l + (r - l) / 2;if(min_tails[mid] < arr[i]) l = mid + 1;  // 用l找第一个比arr[i]大的值,也可以找最后一个小于等于arr[i]的值else r = mid;}min_tails[l] = arr[i];}return len;
}

构造最长递增子序列

在这里插入图片描述

max_len相同时取最小的,ans初始化为len个元素,从后往前填写。如果max_len相同,靠后的arr[i]一定更小,若靠后的arr[i]更大,那max_len就不能相同了。比如:

在这里插入图片描述

class Solution {
public:vector<int> LIS(vector<int>& arr) {int n = arr.size();if(n < 2) return arr;vector<int> min_tails(n); // min_tails[i]:长度为i+1的最长递增子序列末尾元素的最小值min_tails[0] = arr[0];int len  = 1;             // 当前最长递增子序列的长度vector<int> max_len(n);   // max_len[i]:表示以arr[i]结尾的最长递增子序列的长度max_len[0] = 1;for(int i = 1; i < n; i++){// 当前元素arr[i]已经比当前最长递增子序列末尾元素的最小值要大,说明可以和当前递增子序列组成新的递增子序列if(arr[i] > min_tails[len - 1]){min_tails[len] = arr[i];max_len[i] = len + 1; // arr[i]可以增加最长递增子序列的长度len++;continue;}// arr[i]不能和当前最长递增子序列组成新的递增子序列,可以尝试用arr[i]和较短的递增子序列组成新的递增子序列(极端情况下,arr[i]自己组成长度为1的递增子序列)// 在[l, r)之间找第一个大于arr[i]的位置,说明arr[i]可以和前面较短的递增子序列组成新的递增子序列,用arr[i]更新第一个大于arr[i]的元素,即让某递增子序列的长度不变,而末尾元素变小int l = 0;int r = len;while(l < r){int mid = l + (r - l) / 2;if(min_tails[mid] < arr[i]) l = mid + 1;else r = mid;  // 不能是r = mid - 1,因为要找第一个大于arr[i]的值,此时min_tails[mid] >= arr[i],r = mid - 1会跳过大于arr[i]的min_tails[mid]}min_tails[l] = arr[i];max_len[i] = l + 1;  // arr[i]不能增加最长递增子序列的长度,min_tails[l]是第一个大于arr[i]的元素,即用arr[i]可以组成长度为l + 1的递增子序列}vector<int> ans(len);int idx = len - 1;// 只能按顺序填for(int i = n - 1; i >= 0; i--){// 遍历max_len数组,最大长度为idx + 1时才可填写ans[idx],max_len相同时必然取最靠后的arr[i],因为最靠后的最小if(max_len[i] == idx + 1){ans[idx] = arr[i];idx--;}}return ans;}
};
http://www.yayakq.cn/news/261543/

相关文章:

  • 网站搭建工作怎么样武邑县网站建设
  • 苏州h5模板建站中国建设银行官网官网
  • 上海高端网站设计公司网站侧边栏
  • 建立网站基本知识网站大改版
  • 做网站用哪个工具做网站一般用什么配置的电脑
  • 免费的网站cms网站做seo需要些什么
  • 顺义区网站建设html代码怎么变成网页
  • 怎么做谷歌收录的网站企业网站建设哪家
  • WordPress网站封装app教程esu wordpress
  • 佛山外贸网站建设行情腾讯云官网登录入口
  • 商城网站建设需要多少钱山东网站营销seo电话
  • html怎么做网站的背景在线ui设计
  • 网站建设注册什么公司好广州番禺区有什么好玩的地方
  • 佛山专门做网站设计怎样做微网站在哪个平台上搭建好 知乎
  • 快站心动小程序官网腾讯域名怎么做网站
  • tp网站开发网站 做购物车
  • 仿做网站商丘做网站推广的公司
  • 个人网站用什么开发网站怎么做友链
  • 上海网站快速排名优化模板网站代码
  • 网站流量统计系统企业版wordpress 任务发布插件
  • 建设银行泰安分行网站百度一下你就知道搜索
  • 网站建设一龙条互动科技 网站建设
  • 网页游戏排行榜前十名评论seo精准培训课程
  • 广西网站建设哪家强物联网软件开发平台
  • 做企业网站用什么框架企业工商信息查询app
  • 网站首页图片怎么更换农村自建房设计图app
  • 做新网站都需要准备什么wordpress自定义发文章界面
  • 网页设计师 培训wordpress KeyWords优化
  • 郑州建站以来中国十大it培训机构排名
  • 肇庆网站建设制作建设局网站瓯龙建州府3号楼