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

服装鞋帽商城网站建设猎头公司收费标准

服装鞋帽商城网站建设,猎头公司收费标准,html样式代码大全,网络营销方案成功案例想要精通算法和SQL的成长之路 - 最长递增子序列 II#xff08;线段树的运用#xff09; 前言一. 最长递增子序列 II1.1 向下递推1.2 向上递推1.3 更新操作1.4 查询操作1.5 完整代码#xff1a; 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 最长递增子序列 II 原题链接… 想要精通算法和SQL的成长之路 - 最长递增子序列 II线段树的运用 前言一. 最长递增子序列 II1.1 向下递推1.2 向上递推1.3 更新操作1.4 查询操作1.5 完整代码 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 最长递增子序列 II 原题链接 在做这个题目之前先看一下数据结构 - 线段树的运用 。 在线段树的基础上思路如下 首先题目要求了子序列中相邻的元素差不能超过 k 值。我们假设线段树的val值存储的就是最长递增子序列的长度。我们定义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://www.zqtcl.cn/news/70992/

相关文章:

  • 网站建设系统源码网站专业技能培训机构
  • 记事本做网站背景色怎么弄自适应h5网站模板
  • 成都网站建设公司创新互联58网站怎么样做效果会更好
  • 乐清网站制作优化海南省建设厅官方网站
  • 网站分类目录有哪些app软件开发公司
  • 官方网站建设银行2010年存款利息网站流量是如何计算的
  • wordpress能做大站吗帮助做APP的网站公司
  • 360网站排名怎么做寻乌网站建设
  • 外贸网站优化服务程序员公司有哪些
  • 网站修改关键词动漫与游戏制作这个专业怎么样
  • 宁波网站建设 泊浮科技创意型网站建设
  • 商务网站管理与建设seo运营
  • wcm 可以做网站吗腾讯云域名服务商
  • 网站开发项目教程wordpress做静态网页
  • 建一个全部由自己控制的网站需要多少钱个人网站咋推广啥叫流量
  • 柳州做网站设计的公司网站建设logo设计
  • 白云品牌型网站建设朋友圈广告推广文字
  • 怎么用PS做珠宝网站外链生成网站
  • 怎么查看网站主机商德清县建设局网站
  • 建设电子商务网站必须首先确定的是企业网站的建设有哪些经典问题
  • 合肥龙岗医院网站建设seo公司推广
  • 做网站要招什么样的程序员双域名网站
  • 电信备案新增网站wordpress里点击图片放大
  • 济南做网站软件wordpress权限不够
  • 上海网站建设口碑最好的公司网站建设论文参考文献
  • 网站开发项目团队wordpress设置数据库密码
  • 织梦cms怎么更改网站的路径wordpress设置阅读更多
  • 做网站要服务器吗建设论坛网站需要做什么的
  • 申请免费个人网站和域名郑州百姓网
  • 网站建设外包需要多少钱法人一证通主副证书管理新流程