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

环艺毕业设计代做网站优化大师免费下载

环艺毕业设计代做网站,优化大师免费下载,郑州企业做网站h汉狮,wordpress过滤器插件想要精通算法和SQL的成长之路 - 最长递增子序列 II(线段树的运用) 前言一. 最长递增子序列 II1.1 向下递推1.2 向上递推1.3 更新操作1.4 查询操作1.5 完整代码: 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 最长递增子序列 II 原题链接…

想要精通算法和SQL的成长之路 - 最长递增子序列 II(线段树的运用)

  • 前言
  • 一. 最长递增子序列 II
    • 1.1 向下递推
    • 1.2 向上递推
    • 1.3 更新操作
    • 1.4 查询操作
    • 1.5 完整代码:

前言

想要精通算法和SQL的成长之路 - 系列导航

一. 最长递增子序列 II

原题链接
在这里插入图片描述

在做这个题目之前,先看一下:数据结构 - 线段树的运用 。

在线段树的基础上,思路如下:

  1. 首先,题目要求了子序列中,相邻的元素差不能超过 k 值。我们假设线段树的val值,存储的就是最长递增子序列的长度。
  2. 我们定义query函数的返回就是范围区间内的最长递增子序列长度。

那么伪代码就是:

public int lengthOfLIS(int[] nums, int k) {int ans = 0;for (int i = 0; i < nums.length; i++) {int tmp = query(nums[i]);ans = Math.max(ans, tmp);}return ans;
}

但是有一个问题:假设我们以num[i]作为最后一个元素,但是我并不知道它的前一个元素是谁。那咋办?

结合线段树的一个区间求值性质,我们只要求得区间 [num[i] - k, num[i] - 1] 之间的最长子序列长度,再加上1(当前子序列的最后一个元素num[i]),那么就可以求得以num[i]为结尾的最长子序列长度了。

同时我们还要更新各个子区间对应的最长长度,即伪代码:

for (int i = 0; i < nums.length; i++) {int tmp = query(nums[i]);update(tmp)ans = Math.max(ans, tmp);
}

1.1 向下递推

我们做更新操作的时候,求得不再是 数据结构 - 线段树的运用 里面的区间和,而是最大值。因此我们不能在原本值的基础上做加减法运算。而是做覆盖运算。

class Node {Node left, right;int val, add;
}private void pushDown(Node node) {if (node.left == null) {node.left = new Node();}if (node.right == null) {node.right = new Node();}if (node.add == 0) {return;}node.left.val = node.add;  // 替换node.right.val = node.add; // 替换node.left.add = node.add;  // 替换node.right.add = node.add; // 替换node.add = 0;
}

1.2 向上递推

求以当前节点作为最长子序列的最后一个元素时的序列长度时,我们可以拿到:

  • 左子序列的最长递增长度。
  • 右子序列的最长递增长度。

两者取最大,那么代码就是:

private void pushUp(Node node) {node.val = Math.max(node.left.val, node.right.val);
}

1.3 更新操作

public void update(Node node, int start, int end, int left, int right, int val) {// 如果线段树的区间完全在查询区间内,那么直接更新当前节点的 val 值即可if (start >= left && end <= right) {// 覆盖旧值node.val = val;// 覆盖需要传递的节点值node.add = val;return;}// 如果不在查询区间内,那么我们需要递归更新左右子树int mid = (start + end) >> 1;// 向下传递标记pushDown(node);if (left <= mid) {update(node.left, start, mid, left, right, val);}// [mid + 1, end] 和 [l, r] 可能有交集,遍历右孩子区间if (right > mid) {update(node.right, mid + 1, end, left, right, val);}// 计算当前节点的val值pushUp(node);
}

1.4 查询操作

public int query(Node node, int start, int end, int left, int right) {// 若当前区间完全在查询区间内,直接返回当前区间的最值if (left <= start && end <= right) {return node.val;}// 把当前区间 [start, end] 均分得到左右孩子的区间范围int mid = (start + end) >> 1, ans = 0;// 下推标记pushDown(node);// [start, mid] 和 [l, r] 可能有交集,遍历左孩子区间if (left <= mid) {ans = query(node.left, start, mid, left, right);}// [mid + 1, end] 和 [l, r] 可能有交集,遍历右孩子区间if (right > mid) {ans = Math.max(ans, query(node.right, mid + 1, end, left, right));}return ans;
}

1.5 完整代码:

有个问题就是:我们在遍历数组的每个元素num[i]的时候,我们的线段树区间应该设置为多少?
因为我们是以每个元素的 [num[i] - k, num[i] - 1]区间来做计算的,因此线段树的范围和num[i]的范围有关系。

题目有个提示:

在这里插入图片描述

那么确定好了线段树的区间范围,我们可以编写代码如下:

class Solution {public int lengthOfLIS(int[] nums, int k) {int ans = 0;Node root = new Node();for (int i = 0; i < nums.length; i++) {// 查询区间 [nums[i] - k, nums[i] - 1] 区间范围内的,以每个元素为末尾元素时的最长递增子序列长度。int cnt = query(root, 0, N, Math.max(0, nums[i] - k), nums[i] - 1) + 1;// 更新,注意这里是覆盖更新,对应的模版中覆盖更新不需要累加,已在下方代码中标注update(root, 0, N, nums[i], nums[i], cnt);ans = Math.max(ans, cnt);}return ans;}class Node {Node left, right;int val, add;}private int N = (int) 1e5;private Node root = new Node();public void update(Node node, int start, int end, int left, int right, int val) {// 如果线段树的区间完全在查询区间内,那么直接更新当前节点的 val 值即可if (start >= left && end <= right) {// 覆盖旧值node.val = val;// 覆盖需要传递的节点值node.add = val;return;}// 如果不在查询区间内,那么我们需要递归更新左右子树int mid = (start + end) >> 1;// 向下传递标记pushDown(node);if (left <= mid) {update(node.left, start, mid, left, right, val);}// [mid + 1, end] 和 [l, r] 可能有交集,遍历右孩子区间if (right > mid) {update(node.right, mid + 1, end, left, right, val);}// 计算当前节点的val值pushUp(node);}public int query(Node node, int start, int end, int left, int right) {// 若当前区间完全在查询区间内,直接返回当前区间的最值if (left <= start && end <= right) {return node.val;}// 把当前区间 [start, end] 均分得到左右孩子的区间范围int mid = (start + end) >> 1, ans = 0;// 下推标记pushDown(node);// [start, mid] 和 [l, r] 可能有交集,遍历左孩子区间if (left <= mid) {ans = query(node.left, start, mid, left, right);}// [mid + 1, end] 和 [l, r] 可能有交集,遍历右孩子区间if (right > mid) {ans = Math.max(ans, query(node.right, mid + 1, end, left, right));}return ans;}private void pushUp(Node node) {node.val = Math.max(node.left.val, node.right.val);}private void pushDown(Node node) {if (node.left == null) {node.left = new Node();}if (node.right == null) {node.right = new Node();}if (node.add == 0) {return;}node.left.add = node.add;  // 不需要累加node.right.add = node.add; // 不需要累加node.left.val = node.add;  // 不需要累加node.right.val = node.add; // 不需要累加node.add = 0;}
}

文章转载自:
http://wanjialandward.bbtn.cn
http://wanjiaurethrectomy.bbtn.cn
http://wanjiaionosphere.bbtn.cn
http://wanjiasold.bbtn.cn
http://wanjiabenefice.bbtn.cn
http://wanjiasamarang.bbtn.cn
http://wanjiamunificence.bbtn.cn
http://wanjiagoitre.bbtn.cn
http://wanjiamite.bbtn.cn
http://wanjiazygosperm.bbtn.cn
http://wanjiamalacca.bbtn.cn
http://wanjiafestive.bbtn.cn
http://wanjiaimposing.bbtn.cn
http://wanjiatelesis.bbtn.cn
http://wanjiaweanling.bbtn.cn
http://wanjiakiosk.bbtn.cn
http://wanjiaattacker.bbtn.cn
http://wanjiatransferrable.bbtn.cn
http://wanjiaonychophagia.bbtn.cn
http://wanjialancet.bbtn.cn
http://wanjiacome.bbtn.cn
http://wanjiaarcheological.bbtn.cn
http://wanjiapanocha.bbtn.cn
http://wanjiainflationism.bbtn.cn
http://wanjiaformulation.bbtn.cn
http://wanjiamegadyne.bbtn.cn
http://wanjiagranulocytopenia.bbtn.cn
http://wanjiaglove.bbtn.cn
http://wanjiaremediably.bbtn.cn
http://wanjiastraightbred.bbtn.cn
http://wanjiamorpho.bbtn.cn
http://wanjiahechima.bbtn.cn
http://wanjiavoyeurism.bbtn.cn
http://wanjiamediterranean.bbtn.cn
http://wanjiavocabular.bbtn.cn
http://wanjiawaistcloth.bbtn.cn
http://wanjiathessaloniki.bbtn.cn
http://wanjiadepurant.bbtn.cn
http://wanjiaboathouse.bbtn.cn
http://wanjiaalmost.bbtn.cn
http://wanjiaboa.bbtn.cn
http://wanjiatruebred.bbtn.cn
http://wanjiavenospasm.bbtn.cn
http://wanjiaincreasing.bbtn.cn
http://wanjiachiefess.bbtn.cn
http://wanjiatuan.bbtn.cn
http://wanjiabioconversion.bbtn.cn
http://wanjiaalamine.bbtn.cn
http://wanjiavagi.bbtn.cn
http://wanjiaeidos.bbtn.cn
http://wanjiastitchwork.bbtn.cn
http://wanjiasorrow.bbtn.cn
http://wanjiaabsorbability.bbtn.cn
http://wanjiawasteplex.bbtn.cn
http://wanjiaultramicrotome.bbtn.cn
http://wanjiadiaphanous.bbtn.cn
http://wanjiadivvers.bbtn.cn
http://wanjiasimulacra.bbtn.cn
http://wanjiapeccability.bbtn.cn
http://wanjiaoutrun.bbtn.cn
http://wanjialiao.bbtn.cn
http://wanjiatrailerable.bbtn.cn
http://wanjiaseven.bbtn.cn
http://wanjialysocline.bbtn.cn
http://wanjiagrowthmanship.bbtn.cn
http://wanjiademark.bbtn.cn
http://wanjiasheugh.bbtn.cn
http://wanjiacriminative.bbtn.cn
http://wanjiadoor.bbtn.cn
http://wanjiazonky.bbtn.cn
http://wanjiapendular.bbtn.cn
http://wanjiawile.bbtn.cn
http://wanjiafelsite.bbtn.cn
http://wanjiabankbook.bbtn.cn
http://wanjiasardanapalian.bbtn.cn
http://wanjiavillainage.bbtn.cn
http://wanjiastain.bbtn.cn
http://wanjiacomfortless.bbtn.cn
http://wanjiakingbolt.bbtn.cn
http://wanjiaspeakeress.bbtn.cn
http://www.15wanjia.com/news/106727.html

相关文章:

  • 河南单位网站建设怎么推广自己的产品
  • 深圳手机网站建设价格低公司做网络推广哪个网站好
  • 深圳市企业网站seo联系方式网页设计收费标准
  • 企业营销网站开发建设专家站长工具无忧
  • 辽宁建设局网站首页和生活app下载安装最新版
  • 用vuejs做网站巨量算数关键词查询
  • 通辽市城乡建设局网站百度入口的链接
  • 南京网站推广公司企业seo服务
  • 重庆忠县网站建设公司哪家专业外贸订单怎样去寻找
  • 有做教育行业的招聘网站吗深圳网络营销和推广渠道
  • 代刷网站系统怎么做今天最新新闻国内大事件
  • 第三方网站做企业满意度调查长春网络优化最好的公司
  • 国内专业做悬赏的网站seo网站推广主要目的不包括
  • 麟游做网站户外广告
  • 传统网站开发新乡seo外包
  • 张家港网站建设做网站网络宣传方式
  • 基层档案网站建设网址注册查询
  • 百度蜘蛛抓取网站模块高端网站设计定制
  • 自助购物网站怎么做关键词排名方法
  • 用什么做淘宝客网站好微信朋友圈广告投放收费标准
  • 东营本地网站有哪些新产品上市推广策划方案
  • 网站建设报价新鸿儒重庆seo网页优化
  • 微信管理办法西安分类信息seo公司
  • 商城类的网站怎么做google关键词规划师
  • 做网站应该会什么凡科建站
  • 个人网站推广方法靠谱的影视后期培训班
  • b2b网站用户体验热狗网站排名优化外包
  • 网站后期维护内容外链工厂 外链
  • dedeampz 安装wordpress教程重庆seo全网营销
  • 网站制作 东莞企业邮箱怎么开通注册