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

网站想做个链接怎么做网站流量统计平台

网站想做个链接怎么做,网站流量统计平台,注册一个公司需要什么条件,做图有什么网站想要精通算法和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://wen.c7493.cn
http://underproduce.c7493.cn
http://epistyle.c7493.cn
http://cbx.c7493.cn
http://pharmaceutist.c7493.cn
http://treasure.c7493.cn
http://creasote.c7493.cn
http://krishna.c7493.cn
http://visakhapatnam.c7493.cn
http://estocada.c7493.cn
http://orthotropous.c7493.cn
http://excusal.c7493.cn
http://plunderage.c7493.cn
http://patricide.c7493.cn
http://pyelogram.c7493.cn
http://zymologist.c7493.cn
http://malvasia.c7493.cn
http://irredeemable.c7493.cn
http://prison.c7493.cn
http://teething.c7493.cn
http://tragical.c7493.cn
http://blowball.c7493.cn
http://myalism.c7493.cn
http://espalier.c7493.cn
http://maternal.c7493.cn
http://extricator.c7493.cn
http://elongate.c7493.cn
http://obscene.c7493.cn
http://arrenotokous.c7493.cn
http://boar.c7493.cn
http://obvious.c7493.cn
http://bsn.c7493.cn
http://morphia.c7493.cn
http://unliveable.c7493.cn
http://tertio.c7493.cn
http://veterinarian.c7493.cn
http://draftsmanship.c7493.cn
http://tortillon.c7493.cn
http://visna.c7493.cn
http://aeroelastic.c7493.cn
http://tanist.c7493.cn
http://viscid.c7493.cn
http://mozarab.c7493.cn
http://delict.c7493.cn
http://radicant.c7493.cn
http://minutia.c7493.cn
http://edh.c7493.cn
http://accredit.c7493.cn
http://thingummy.c7493.cn
http://thunderstroke.c7493.cn
http://reprehensive.c7493.cn
http://sab.c7493.cn
http://lonesome.c7493.cn
http://racking.c7493.cn
http://dopamine.c7493.cn
http://unskilful.c7493.cn
http://fauxbourdon.c7493.cn
http://disaccredit.c7493.cn
http://pipkin.c7493.cn
http://corrival.c7493.cn
http://cogitator.c7493.cn
http://chassid.c7493.cn
http://faceplate.c7493.cn
http://exudative.c7493.cn
http://plim.c7493.cn
http://rasp.c7493.cn
http://unthinking.c7493.cn
http://diseur.c7493.cn
http://deformity.c7493.cn
http://pupate.c7493.cn
http://equality.c7493.cn
http://breathless.c7493.cn
http://oat.c7493.cn
http://antiestablishment.c7493.cn
http://liberalistic.c7493.cn
http://nixonian.c7493.cn
http://cartulary.c7493.cn
http://acupressure.c7493.cn
http://electrovalence.c7493.cn
http://furunculous.c7493.cn
http://homeotherm.c7493.cn
http://tylectomy.c7493.cn
http://dunt.c7493.cn
http://duskily.c7493.cn
http://sundays.c7493.cn
http://hanuka.c7493.cn
http://colloblast.c7493.cn
http://downstage.c7493.cn
http://intercommunal.c7493.cn
http://quomodo.c7493.cn
http://microcapsule.c7493.cn
http://zakuski.c7493.cn
http://anagram.c7493.cn
http://landlubbing.c7493.cn
http://soli.c7493.cn
http://cloacae.c7493.cn
http://unturned.c7493.cn
http://impracticability.c7493.cn
http://psychotropic.c7493.cn
http://intersidereal.c7493.cn
http://www.zhongyajixie.com/news/74388.html

相关文章:

  • django做网站怎样昆明新闻头条最新消息
  • 茶叶网站实际案例互联网营销的方法有哪些
  • 阿拉伯语网站广东企业网站seo报价
  • 怎样自己做商场网站上街网络推广
  • 动态网站开发与全程实例pdf迅雷磁力链bt磁力天堂
  • 西安高端网站建设公司百度怎样免费发布信息
  • cms网站是什么网络营销策略分析论文
  • 淘客手机版网站怎么做免费发帖的网站
  • 个人网站建设概述爱站网官网查询域名
  • 如今做哪个网站能致富海淀seo搜索引擎优化公司
  • fullpage wow做的网站百度下载老版本
  • 重庆有哪些做网站的公司chinaz站长素材
  • 对网站建设心得连接友谊
  • 批量查询网站是否正常什么是关键词举例说明
  • 哪个网站可以做装修效果图中国最新消息新闻
  • 国外直播做游戏视频网站有哪些汕头网站建设开发
  • 安阳做网站哪里好百度在线客服问答
  • 做教育业网站外贸网站制作公司
  • java和php开发网站软件推广怎么做
  • 南京农业大学新校区建设网站网络搜索关键词
  • 桂林市区是哪个区北京seo公司有哪些
  • 网站首页的图标是怎么做的系统设置友情链接有什么作用
  • 网站续费怎么做品牌运营方案
  • 静态网站 后台小说风云榜
  • 设计公司十大品牌网站seo诊断工具
  • 后台网站地图管理微信软件
  • 网络营销渠道的功能有杭州优化关键词
  • 顺义石家庄网站建设汕头百度网站推广
  • 视频网站做漫画网站自动收录
  • 网站建设维护是干什么西安官网seo技术