这是曾经一次面试时被问到的题。

当时很直观的是想到先用归并排序中的合并两个列表的方法把列表合并起来,一边合并一边记count,等count等于n时就返回当前处理的元素。

这是最原始的做法。面试官问还有没有优化版本。

当时一时半会儿没什么思路,总的思路是想想有没有什么办法能缩小查询范围。

面试官也多次提示。最后初步得出一个方案,大概是:

  • 比较两个数列的位于中间的元素哪个大,如果某一个数列(数列A)中第n/2个元素比另一个数列(数列B)的要小,那说明这个数列的第1到n/2个元素肯定在合并后数列的前n个元素中。
  • 然后再取出数列A中的位于第n/2+1到n的元素段的中间元素去和数列B中之前的中间位置的元素比较,如果数列A中的这个元素比数列B中的这个元素小,就又继续取数列A中后面的元素段中的中间元素(Binary Search),否则这次轮到用数列A中的这个元素跟数列B中第n/2到n的元素段的中间元素去比较。
  • 重复前两步,直到最后把比较范围从元素段缩小到单个元素。

在这个算法里有很多细节要注意,比如在取中间元素时要注意数列长度是奇数还是偶数,两个数列不等长的问题以及在这种情况下以中间段元素选取的调整等。

基于这个算法, 一般情况下,选取位于合并后数列靠近两端(无论前后)的元素所花时间会比靠近中间的元素时间要小。

大家可以在这里下载源代码,并编译执行(基于.net 2.0)。

这里是算法演示动画程序,大家可以在这个程序里设置两个数列的长度(List A/B Length)和数据随机增长率(List A/B Gap Rate),然后设定要选择第几项(Fetch Index),然后就可以观看算法动画。

照例上传一个算法演示动画(数列A和B长度都为30,选取合并后第40个元素):

转载于:https://www.cnblogs.com/laynelin/archive/2009/12/12/1622313.html

算法面试题:找出由两个有序列表合并而成的新列表中的第n个元素相关推荐

  1. python两个数组合并、找出中位数_leetcode刷题记录-找出这两个有序数组的中位数(python版本)...

    谨以此文记录一下自己刷题的过程,虽然技术能力一般,相信刷完整套题目自己的编程能力定会有提高,代码都是个人创作,不一定是最好的,仅供参考和交流 给定两个大小为 m 和 n 的有序数组 nums1 和 n ...

  2. 链表面试题3:将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成 的。

    链表面试题3:将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成 的. 首先我们的思想是将得一个链表和第二个链表的每个结点进行比较,谁小谁就插入到新链表的最后. ...

  3. leetcode C++ 4. 寻找两个有序数组的中位数 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log

    一.概述: 这道题思路其实蛮简单的,就是边界太难考虑了,所以一直没能通过,写了好长的代码考虑边界,然后看到一个大神写的代码: https://leetcode-cn.com/problems/medi ...

  4. prim算法_历时两月,终拿字节跳动offer,算法面试题分享「带答案」

    欢迎关注专栏<Java架构筑基>--专注于Java技术的研究与分享! Java架构筑基​zhuanlan.zhihu.com Java架构筑基--专注于Java技术的研究与分享! 后续文章 ...

  5. 二叉树寻找祖先C语言,微软算法面试题:给定两个二叉树节点,寻找其最近共同祖先...

    给定一颗二叉树,并指定二叉树中任意两个节点,要求找出这两个节点在二叉树中的最近祖先,假定二叉树每个节点都有一个指向其父节点的指针,图中没有画出来,要求算法的空间复杂度必须是O(1), 时间复杂度为O( ...

  6. 谷歌给 Max Howell 出的一个简单算法面试题:翻转二叉树

    这个问题是谷歌给 Max Howell 出的一个算法面试题 谷歌:我们90%的工程师使用您编写的软件(Homebrew),但是您却无法在面试时在白板上写出翻转二叉树这道题,这太糟糕了. 谷歌给 Max ...

  7. Java面试题:在一个递增的数组里面,找出任意两个数的和等于100,编写程序输出这些数对,可以假设数组中不存在重复元素

    本文使用两种算法来实现,分别是二分查找法和插值查找法,发现插值查找法更好,更快地找到需要的数据. 代码如下: package com.moson.search;import java.util.Arr ...

  8. [Z]谷歌(Google)算法面试题

    谷歌(Google)算法面试题 1.谷歌面试题:给定能随机生成整数 1 到 5 的函数,写出能随机生成整数 1 到 7 的函数. 回答:此题的关键是让生成的 1 到 7 的数出现概率相同. 只要我们可 ...

  9. twitter java_Twitter算法面试题详解(Java实现)

    最近在网上看到一道Twitter的算法面试题,网上已经有人给出了答案,不过可能有些人没太看明白(我也未验证是否正确),现在给出一个比较好理解的答案.先看一下题目. 图1 先看看图图1.可以将方块看做砖 ...

最新文章

  1. NDK JNI Android Studio开发与调试DEMO(三)(生成 .so 文件)
  2. 组合模型---贝叶斯模型平均
  3. 自定义控件:广告内容后期加载。以及NamingContainer层次的应用
  4. c#中的奇异递归模式
  5. java 输入流关闭顺序_Java IO流中先关闭输出流还是先关闭输入流?为什么?
  6. Java数据库篇2——数据库基本操作
  7. oracle批量替换保留字,oracle保留字大全
  8. 2016网易有道内推笔试题
  9. 【面试题系列|前端面试题】前端高频面试题总结(2021年最新版)
  10. Frammer X for mac(mac高清视频截图工具)
  11. oracle pck文件是什么,PCK文件扩展名 - 什么是.pck以及如何打开? - ReviverSoft
  12. 数据库系统的主要组成部分
  13. 谷歌退出中国为360挑战百度创造了机会
  14. android 开游艇游戏,游艇狂飙游戏-游艇狂飙安卓版预约_第一手游网
  15. cmd静默运行_如何在Win10上静默运行批处理文件
  16. 将两个各有n个元素的有序表归并成一个有序表,其最多的比较次数
  17. 字符编码asc与utf-8与GB2312相互转换
  18. CSA云安全指南V4.0 D1 D2
  19. 耀华YHL-5屏幕开发教程
  20. Linux拷贝U盘文件(命令行)

热门文章

  1. Js中Symbol对象
  2. ipsec加密技术谁提出的_如何提出技术问题以获得高质量的答案
  3. 双赢思维的五个要领_可访问网站双赢的4个原因
  4. Gnome即将满18岁,适用于Docker,Kali Linux 2.0的新工具以及更多新闻
  5. Kali Linux 自定义分辨率
  6. es6 什么是async函数
  7. String.fromCodePoint()方法
  8. PyQt5 关于自动补全 QCompleter
  9. flume监听服务器文件,flume监听服务器端口数据库
  10. 学习笔记 :E1696 C1107 错误提示