【笔试题】携程2018笔试[中位数、]
来源:互联网 发布:韶关网络问政平台12333 编辑:程序博客网 时间:2024/06/06 04:29
1.中位数
有两个有序数组nums1和nums2,他们的大小各是m和n,请找出这两个数组所有数的中位数,总得时间复杂度不超过O(log(m+n))
思路
如果对时间复杂度没有要求,这个方法是实现起来最简单的,我们只需要从下往上依次数(n+m)/2个元素即可。由于两个数组都已经排序,我们可以使用两个指针指向数组“底部”,通过比较两个数组“底部”的元素大小来决定计哪一个元素,同时将其所在数组的指针“向上”移一位。为了方便处理总元素为偶数的情况,这里将找中位数变成找第k小的元素。
注意
- 计数的循环是用来找到第k-1个元素的,最后return的时候再判断第k个元素是哪一个
- 在每次计数的循环中要先判断两个数组指针是否超界,在最后return之前也要判断一次
public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[] arr1 = new int[n]; for (int i = 0; i < n; i++) { arr1[i] = sc.nextInt(); } int m = sc.nextInt(); int[] arr2 = new int[m]; for (int i = 0; i < m; i++) { arr2[i] = sc.nextInt(); } double res = findMidArrays(arr1, arr2); System.out.println(res); } public static double findMidArrays(int[] nums1, int[] nums2) { int len1 = nums1.length; int len2 = nums2.length; int total = len1 + len2; if (total % 2 == 0) { return (findKth(nums1, nums2, total / 2) + findKth(nums1, nums2, total / 2 + 1)) / 2.0; } else { return findKth(nums1, nums2, total / 2 + 1); } } public static int findKth(int[] nums1, int[] nums2, int k) { int p = 0, q = 0; //要找到第k个数,即索引为k-1. for (int i = 0; i < k - 1; i++) { if (p >= nums1.length && q < nums2.length) { q++; } else if (q >= nums2.length && p < nums1.length) { p++; } else if (nums1[p] > nums2[q]) {//两个数组都有空间时 q++; } else { p++; } } if (p >= nums1.length) { return nums2[q]; } else if (q >= nums2.length) { return nums1[p]; } else { return Math.min(nums1[p], nums2[q]); } }}
阅读全文
0 0
- 【笔试题】携程2018笔试[中位数、]
- 笔试题经典算法:查找中位数
- 中兴笔试题:两有序数组的中位数求解
- 【雅虎笔试题】两个已经排好序的数组,找中位数
- 【雅虎笔试题】两个已经排好序的数组,找中位数
- 【笔试集锦】百度2018前端笔试笔试第一题
- 【笔试题】网易2018秋招内推笔试
- 2018科大讯飞校招笔试题
- 2018有赞校招笔试题
- 笔试
- 笔试
- 笔试
- 笔试
- 笔试
- 笔试
- 笔试
- 笔试~~
- 笔试
- gdb基本命令(非常详细)
- 创业者都是梦想家
- CentOS 7下安装集群Zookeeper-3.4.9
- Tomcat认知
- a标签去掉点击默认样式
- 【笔试题】携程2018笔试[中位数、]
- 欢迎使用CSDN-markdown编辑器
- jsp中9个内置对象与servlet对应关系及四个作用域
- 慕课火拼俄罗斯方块
- 第一个简单的Servlet
- Hibernate Session
- tableview中自定义自定义左滑显示编辑按钮
- c++ int转string
- 数据结构实验一