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

网站建设策划书提纲图文广告设计

网站建设策划书提纲,图文广告设计,浏览器怎么打开网站服务器,做简单的网站首页文章目录 方法一:动态规划方法二:贪心 二分查找构造最长递增子序列 方法一:动态规划 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/769402/

相关文章:

  • 公司做网站如何跟客户介绍大型门户网站建设运营
  • 用卫生纸做的礼物街网站沈阳专业音响公司
  • 做五金有哪些网站推广网站买卖需要注意什么
  • 彩票网站开发公司wordpress 404.3
  • 企业网站优化服务主要围绕哪些要素上海哪里网站备案
  • 房产网站设计公司vue做电商网站
  • 做个什么样的网站阿里巴巴友情链接怎么设置
  • 在那个网站做推广实用用老薛主机做网站
  • 网站后台 添加用户网页设计案例100例
  • 自己弄个网站要怎么弄做精酿啤酒购买的网站
  • 九江网站建设推广网站查询域名ip查询
  • 别人在百度冒用公司旗号做网站找第三方做网站 需要注意
  • 网站建设 电话长清做网站公司
  • 外链推广网站做热点链接的网站
  • 专门做眼镜的网站惠州住房和城乡建设局网站
  • 青岛网站建设公司大全ppt 做的最好的网站
  • python网站开发项目wordpress怎么建网店
  • 微电影分享网站织梦整站源码脑子笨适合学计算机吗
  • 创建网站论坛个人网站 空间 多少够
  • 网站建设色彩设计有什么用一键生成ppt的软件
  • 有口碑的南昌网站制作防控措施持续优化
  • 网上给别人做设计的网站发布网站要搭建什么
  • 提供邢台企业做网站加大整合力度网站集约建设
  • 网站建设温州手机端网页设计尺寸规范
  • 网站有限公司免费公司注册网站建设
  • 购物网站需要哪些模块专题学习网站开发流程
  • 商城网站备案需要什么软件定制和开发
  • 建设网站有几种渠道龙岩兼职招聘最新发布
  • 有了域名怎么建网站联系方式上海工程网站建设
  • 邮轮哪个网站是可以做特价胃肠的phpcms 手机网站