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

学院网站建设需求分析调研表公司简介ppt模板

学院网站建设需求分析调研表,公司简介ppt模板,网站建设简介是什么,苏州三石网络科技有限公司一、题目 给你一个链表数组#xff0c;每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中#xff0c;返回合并后的链表。 示例 1#xff1a; 输入#xff1a;lists [[1,4,5],[1,3,4],[2,6]] 输出#xff1a;[1,1,2,3,4,4,5,6] 解释#xff1a;链表数组如…一、题目 给你一个链表数组每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中返回合并后的链表。 示例 1 输入lists [[1,4,5],[1,3,4],[2,6]] 输出[1,1,2,3,4,4,5,6] 解释链表数组如下[ 1-4-5, 1-3-4, 2-6 ] 将它们合并到一个有序链表中得到1-1-2-3-4-4-5-6 示例 2 输入lists [] 输出[] 示例 3 输入lists [[]] 输出[] k lists.length 0 k 10^4 0 lists[i].length 500 -10^4 lists[i][j] 10^4 lists[i]按 升序 排列 lists[i].length的总和不超过10^4 二、代码 合并两个有序链表 在解决「合并K个排序链表」这个问题之前我们先来看一个更简单的问题如何合并两个有序链表假设链表a和b的长度都是n如何在O(n)的时间代价以及O(1)的空间代价完成合并 这个问题在面试中常常出现为了达到空间代价是O(1)我们的宗旨是「原地调整链表元素的next指针完成合并」。以下是合并的步骤和注意事项对这个问题比较熟悉的读者可以跳过这一部分。此部分建议结合代码阅读。 【1】首先我们需要一个变量head来保存合并之后链表的头部你可以把head设置为一个虚拟的头也就是head的val属性不保存任何值这是为了方便代码的书写在整个链表合并完之后返回它的下一位置即可。 【2】我们需要一个指针tail来记录下一个插入位置的前一个位置以及两个指针aPtr和bPtr来记录a和b未合并部分的第一位。注意这里的描述tail不是下一个插入的位置aPtr和bPtr所指向的元素处于「待合并」的状态也就是说它们还没有合并入最终的链表。 当然你也可以给他们赋予其他的定义但是定义不同实现就会不同。 【3】当aPtr和bPtr都不为空的时候取val属性较小的合并如果aPtr为空则把整个bPtr以及后面的元素全部合并bPtr为空时同理。 【4】在合并的时候应该先调整tail的next属性再后移tail和*Ptr或者bPtr。那么这里tail和*Ptr是否存在先后顺序呢它们谁先动谁后动都是一样的不会改变任何元素的next指针。 public ListNode mergeTwoLists(ListNode a, ListNode b) {if (a null || b null) {return a ! null ? a : b;}ListNode head new ListNode(0);ListNode tail head, aPtr a, bPtr b;while (aPtr ! null bPtr ! null) {if (aPtr.val bPtr.val) {tail.next aPtr;aPtr aPtr.next;} else {tail.next bPtr;bPtr bPtr.next;}tail tail.next;}tail.next (aPtr ! null ? aPtr : bPtr);return head.next; }时间复杂度 O(n)。 空间复杂度 O(1)。 【1】顺序合并 我们可以想到一种最朴素的方法用一个变量ans来维护以及合并的链表第i次循环把第i个链表和ans合并答案保存到ans中。 class Solution {public ListNode mergeKLists(ListNode[] lists) {ListNode ans null;for (int i 0; i lists.length; i) {ans mergeTwoLists(ans, lists[i]);}return ans;}public ListNode mergeTwoLists(ListNode a, ListNode b) {if (a null || b null) {return a ! null ? a : b;}ListNode head new ListNode(0);ListNode tail head, aPtr a, bPtr b;while (aPtr ! null bPtr ! null) {if (aPtr.val bPtr.val) {tail.next aPtr;aPtr aPtr.next;} else {tail.next bPtr;bPtr bPtr.next;}tail tail.next;}tail.next (aPtr ! null ? aPtr : bPtr);return head.next;} }时间复杂度 假设每个链表的最长长度是n。在第一次合并后ans的长度为n第二次合并后ans的长度为2×n第i次合并后ans的长度为i×n。第i次合并的时间代价是O(n(i−1)×n)O(i×n)那么总的时间代价为O(∑i1k(i×n))O(((1k)⋅k)/2×n)O(k^2n)故渐进时间复杂度为O(k^2 n)。 空间复杂度 没有用到与k和n规模相关的辅助空间故渐进空间复杂度为O(1)。 【2】分治合并 考虑优化方法一用分治的方法进行合并。 1、将k个链表配对并将同一对中的链表合并 2、第一轮合并以后k个链表被合并成了k/2个链表平均长度为2n/k​然后是k/4个链表k/8个链表等等 3、重复这一过程直到我们得到了最终的有序链表。 class Solution {public ListNode mergeKLists(ListNode[] lists) {return merge(lists, 0, lists.length - 1);}public ListNode merge(ListNode[] lists, int l, int r) {if (l r) {return lists[l];}if (l r) {return null;}int mid (l r) 1;return mergeTwoLists(merge(lists, l, mid), merge(lists, mid 1, r));}public ListNode mergeTwoLists(ListNode a, ListNode b) {if (a null || b null) {return a ! null ? a : b;}ListNode head new ListNode(0);ListNode tail head, aPtr a, bPtr b;while (aPtr ! null bPtr ! null) {if (aPtr.val bPtr.val) {tail.next aPtr;aPtr aPtr.next;} else {tail.next bPtr;bPtr bPtr.next;}tail tail.next;}tail.next (aPtr ! null ? aPtr : bPtr);return head.next;} }时间复杂度 考虑递归「向上回升」的过程——第一轮合并k/2组链表每一组的时间代价是O(2n)第二轮合并k/4组链表每一组的时间代价是O(4n)…所以总的时间代价是O(∑i1∞k/2^i×2^in)O(kn×log⁡k)故渐进时间复杂度为O(kn×log⁡k)。 空间复杂度 递归会使用到O(log⁡k)空间代价的栈空间。 【3】使用优先队列合并 这个方法和前两种方法的思路有所不同我们需要维护当前每个链表没有被合并的元素的最前面一个k个链表就最多有k个满足这样条件的元素每次在这些元素里面选取val属性最小的元素合并到答案中。在选取最小元素的时候我们可以用优先队列来优化这个过程。 class Solution {class Status implements ComparableStatus {int val;ListNode ptr;Status(int val, ListNode ptr) {this.val val;this.ptr ptr;}public int compareTo(Status status2) {return this.val - status2.val;}}PriorityQueueStatus queue new PriorityQueueStatus();public ListNode mergeKLists(ListNode[] lists) {for (ListNode node: lists) {if (node ! null) {queue.offer(new Status(node.val, node));}}ListNode head new ListNode(0);ListNode tail head;while (!queue.isEmpty()) {Status f queue.poll();tail.next f.ptr;tail tail.next;if (f.ptr.next ! null) {queue.offer(new Status(f.ptr.next.val, f.ptr.next));}}return head.next;} }时间复杂度 考虑优先队列中的元素不超过k个那么插入和删除的时间代价为O(log⁡k)这里最多有kn个点对于每个点都被插入删除各一次故总的时间代价即渐进时间复杂度为O(kn×log⁡k)。 空间复杂度 这里用了优先队列优先队列中的元素不超过k个故渐进空间复杂度为O(k)。
http://www.zqtcl.cn/news/206475/

相关文章:

  • 京东物流网站建设特点网站开发与维护岗位说明书
  • 制作一个网站的基本步骤星巴克网站建设ppt
  • 搭建企业网站宽带多大php微信公众号开发教程
  • 国家建设公债拍卖网站新手如何自己建网站
  • 网站建设颊算网站注册界面代码
  • 微信h5网站模板下载百姓网征婚
  • 模板网站和插件有哪些河南第一火电建设公司网站
  • 怎么测网站流量吗网络运维工程师教程
  • 有谁帮做网站网站建设seo合同书
  • 自己做视频网站只能用地址连接专业网站建设效果
  • 重庆网站建设价格费用酒店协会网站集静态模板
  • 会议专题网站建设报价单网站代码在哪里修改
  • 怎么用net123做网站怎么给企业制作网站
  • 网站建设合同模板网页设计团队
  • 做排行的网站淘宝流量平台
  • 用dw怎么做网站后台做一个网站需要怎么做
  • 沧州地区阿里巴巴做网站修改wordpress标题图片
  • 怎么判断网站开发语言互联网推广模式
  • 做电影网站被找版权问题怎么处理网站做的简单是什么意思
  • 九江网站建设网站制作深圳seo优化服务商
  • 上海网站推广珈维做映射后 内网无法通过域名访问网站
  • 太原网站关键词优化常州企业网站建设公司
  • 网站开发流程详细步骤不用淘宝客api如何做网站
  • xuzhou网站制作wordpress漫画小说
  • 公司建设网站的通知书百度经验官网入口
  • 如何做产品网站的推广静态网页制作总结
  • 网站建设有哪些知识点wordpress 静态
  • 买完阿里云域名如何做网站优化软件排行榜
  • 三五互联网站建设怎么样公司网上推广平台
  • 做网站网页的公司机械网站建设公司推荐