从2段已序的数组中查找某一个数的算法
来源:互联网 发布:网络大电影如何赚钱 编辑:程序博客网 时间:2024/06/01 18:53
朋友最近面试某公司,被一道笔试题难住,最后被无情pass了。题目大致是:int a[] 由2个已序且范围无交叉的序列组成,比如4,5,6,7,1,2,3,从中查找指定的数。要求时间复杂度小于O(N)。
算法思路
首先想到的是折半查找,时间复杂度应该为O(log N)。假设数组起始位置为x和y,折半位置为h,2个序列边界为*,查找数的位置为n。
数组表示为:
|---------->|---------->|x h y
由a[h]与a[x],a[y]比较可知,序列边界*在h的左边还是右边。分为两种情况:
1. 当a[h] < a[x]时,序列边界*在h的左边
|-----><----->|---------->|x * h y
此时位置n分三种情况,只有当a[n] > a[h] 且 a[n] <= a[y]时下一次将在h的右边开始查找。
- 当a[h] > a[x]时,序列边界*在h的右边
|---------->|-----><----->|x h * y
此时位置n分三种情况,只有当a[n] >= a[x] 且 a[n] < a[h]时下一次将在h的左边边开始查找。
代码实现
int find_in_two_sort_part(int a[], int len, int n){ int begin = 0; int end = len - 1; while (begin <= end) { // |---------->|---------->| // x h y int half = (begin + end) >> 1; if (n == a[half]) { return half; } // |-----><----->|---------->| // x * h y if (a[half] < a[end]) { // |------><----->|-----*----->| // x * h n y if ((n > a[half]) && (n <= a[end])) { begin = half + 1; } else { end = half; } } // |---------->|-----><----->| // x h * y else if (a[half] > a[begin]) { // |----*----->|-----><----->| // x n h * y if ((n >= a[begin]) && (n < a[half])) { end = half; } else { begin = half + 1; } } else { return -1; } } return -1;}
0 0
- 从2段已序的数组中查找某一个数的算法
- 查找数组中最大的2个数
- 查找数组中最大的2个数
- 算法习题48:一个数组是由一个递减数列左移若干位形成的,在这种数组中查找某一个数。
- 二维数组中某一元素的查找
- 算法与数据结构面试题(14)-在数组中查找2个数的和为已知数
- 二维数组查找某一个数
- 查找出数组中符合某一条件的数组索引
- 算法:从数组中查找重复的元素并分组
- 查找一个有序数组中某一数值出现的次数
- 写正确程序需要注意的地方:一个数组是有一个递减数列座椅若干位形成的,在这种数组中查找某一个数。
- 数组计数某一个数的数量
- 48.微软: 一个数组是由一个递减数列左移若干位形成的,比如{4,3,2,1,6,5} 是由{6,5,4,3,2,1}左移两位形成的,在这种数组中查找某一个数。
- 一个数组是由一个递减数列左移若干位形成的,比如{4,3,2,1,6,5}是由{6,5,4,3,2,1}左移两位形成的,在这种数组中查找某一个数。
- 一个数组是由一个递减数列左移若干位形成的,比如{4,3,2,1,6,5}是由{6,5,4,3,2,1}左移两位形成的,在这种数组中查找某一个数。
- 一个数组是由一个递减数列左移若干位形成的,比如{4,3,2,1,6,5}是由{6,5,4,3,2,1}左移两位形成的,在这种数组中查找某一个数
- 一个数组是由一个递减数列左移若干位形成的,比如{4,3,2,1,6,5}是由{6,5,4,3,2,1}左移两位形成的,在这种数组中查找某一个数
- 一个数组是由一个递减数列左移若干位形成的,比如{4,3,2,1,6,5} 是由{6,5,4,3,2,1}左移两位形成的,在这种数组中查找某一个数
- Factorialize a Number
- UISearchController(使用、修改cancel文字)
- RabbitMQ~广播消息
- cookie和session的区别
- python基础学习-输入输出
- 从2段已序的数组中查找某一个数的算法
- 两个div右侧固定,左侧自适应屏幕
- I2C总线协议学习笔记
- 先存储逆序后的整数再输出
- 【RxJava】种下一棵树RxJava
- Android TelecomService的来电处理过程
- ubuntu下创建Eclipse快捷方式
- 《unix/linux编程实践教程》学习笔记:第二章 编写who,cp命令
- Check for Palindromes