- 浏览: 53946 次
- 性别:
- 来自: 北京
文章分类
最新评论
package com.viking.divide; /** * * @author viking * * 查找中间数 有两个长度相等,按升序排列的数组,现要查找中间数 因为有两个中间数,返回偏小的那一个 * * 中间数是数组中大小处于中间的那个数 * * 基本思路,用而分查找的方法查找 * * * */ public class Middle { public static void main(String[] args) { int[] a = {15, 16, 23,27 }; int[] b = {7, 10, 12,13 }; int mid = findMiddle(a, b); System.out.println(mid); } public static int findMiddle(int[] a, int[] b) { int n = a.length; int amid = 0, bmid = 0; int alow = 0, blow = 0; int ahight = n - 1, bhight = n - 1; while (alow < ahight && blow < bhight) { amid = (alow + ahight) / 2; bmid = (blow + bhight) / 2; if (a[amid] > b[bmid]) { // 中间数会在 a的中 alow-amid半区和b的blow-bhight半区中 ahight = amid; blow = bmid; } else { // 中间数会在 b的中 blow-bmid半区和a的alow-ahight半区中 alow = amid; bhight = bmid; } } // 由于取整问题,下标总是指向偏小的数 // a[amid+1]或者b[bmid+1]有可能是中间数 // middle 肯定在a[amid] a[amid+1] b[bmid] b[bmid+1]这四个数中 // 对amid bmid 进行修正 if (amid + bmid + 1 == n - 2) { if (a[amid] > b[bmid]) { amid++; } else { bmid++; } } else if (amid + bmid + 2 == n - 2) { amid++; bmid++; } if (a[amid] > b[bmid]) { if (bmid < n && a[amid] > b[bmid + 1]) { // bmid+1才是偏小的那个中间数 return b[bmid + 1]; } return a[amid]; } else { if (amid < n && b[bmid] > a[amid + 1]) { // amid+1才是偏小的那个中间数 return a[amid + 1]; } return b[bmid]; } } }
发表评论
-
查找任意两个节点的公共父节点
2011-11-04 00:42 3554基本思路是对需要查找的节点赋权值为1,其它节点权值为0.那么只 ... -
树中任意两个节点之间的距离
2011-11-04 00:28 9624树中任意两个节点之间的距离是指,从一个节点到另一个几点之间的一 ... -
用5,7,12加减运算,求最少步数得到任意数n
2011-11-03 23:59 1270package www.viking.com.algori ... -
线段重合问题
2011-11-01 13:21 2978问题:y=ax+b; 有很多线段{x0,y0,x1,y1}{ ... -
区间覆盖问题
2011-11-01 13:00 1651问题: 有很多区间,比如[1.1,3.4] [1,3] [-1 ... -
数组循环移位
2011-10-31 22:09 1442比如1 2 3 4 5 循环移位1位 ... -
最大子矩阵的和
2011-10-25 15:30 764package www.viking.com.algo ... -
最大字段和
2011-10-25 14:43 925package www.viking.com.algo ... -
有重复数的全排列
2011-10-21 18:34 8127有重复数的全排列和全排列的算法是一样的 只不过要去掉重复的序列 ... -
有重复数的组合
2011-10-21 18:33 932package com.viking.divide; ... -
无重复数组合
2011-10-21 18:30 931无重复数的组合问题 就 ... -
m n 全排列
2011-10-21 08:54 851n个字符中长度为m的全排列 public class MN ... -
子集的全排列
2011-10-21 08:51 865比如 123 1 2 3 12 21 13 31 23 32 ... -
google笔试题 人民币问题
2011-10-20 23:57 776方法一:递归方法 对 charge[]={1,5,10,20, ... -
查找无向图中的环
2011-10-19 23:51 1923static int[][] M = { { 0 ... -
无重复数的全排列问题
2011-10-18 09:51 911采用分治思想,很多书都有。。。 这里只是引用一下,因为有很几 ... -
爬台阶问题
2011-10-18 07:57 947package com.viking.dynamic; ... -
整数的因子分解
2011-10-17 23:21 956package com.viking.divide; ...
相关推荐
二分查找的基本步骤包括:首先比较中间元素与目标值,如果相等则找到,否则根据中间元素与目标值的大小关系调整搜索范围,递归地在左半部分或右半部分继续查找。由于每次查找都将搜索范围减半,二分查找的时间复杂度...
二分查找是一种高效的查找算法,它的实现方式是将数组或链表分成两个部分,然后比较目标元素和中间元素,如果目标元素小于中间元素,则在左半部分继续查找,否则在右半部分继续查找。二分查找的时间复杂度为O(logn)...
算法的基本思路是将查找区间不断减半,每次比较中间元素与目标值,如果目标值等于中间元素则查找成功,否则根据目标值与中间元素的大小关系缩小查找区间。二分查找的时间复杂度为O(logn),在大规模数据查找时效率较...
1. 确定中间位置记录的序号 m = [(n + 1)/2],其中 n 为记录个数。 2. 将给定值 K 与中间位置记录的关键字值进行比较,有三种可能的结果: * K = r[m].key:查找成功,结束查找。 * K [m].key:继续在左半部分...
如果树允许重复节点,并且我们要找到的是真正的中位数(即所有不同值的中间值),那么我们需要考虑以下策略: 1. **重复节点计数**:在AVL树中处理重复节点时,每个节点不仅要存储键值,还需要存储该键值出现的次数...
你可以访问ECharts的官方网站,查找关于饼图中间显示数字的实例,通过查看源码并进行实践,可以加深对这个功能的理解。 至于【压缩包子文件的文件名称列表】"echarts饼状图中间展示数组",这可能是指一个包含示例...
本文将深入探讨如何使用二分算法在两个递增序列中查找中位数,这是一个典型的数据结构与算法相结合的问题。 首先,我们要理解什么是中位数。在一组数值中,中位数是指将这些数值按大小顺序排列后处于中间位置的数。...
它的工作原理是首先找到数组的中间元素,然后比较目标值与中间元素的关系,如果目标值等于中间元素,则查找成功;若目标值小于中间元素,则在左半部分数组中继续查找;反之,在右半部分查找。每次查找都将搜索范围...
在无权的情况下,中位数是将一组数值从小到大排序后位于中间位置的数,如果数据个数为奇数,则中位数是中间的那个数;如果是偶数,则是中间两个数的平均值。而在带权的情况下,每个数都有一个对应的权重,中位数不再...
如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且同样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。 代码中...
在这个例子中,我们定义了一个名为`binsearch`的函数,它接受一个整数数组、目标值和数组大小作为参数。在`main`函数中,我们创建了一个有序数组,并调用`binsearch`函数查找目标值7的位置。如果找到,输出其在数组...
3. 如果目标值小于中间元素,那么在数组的左半部分(即中间元素左边的部分)继续查找。 4. 如果目标值大于中间元素,那么在数组的右半部分(即中间元素右边的部分)继续查找。 5. 重复以上步骤,直至找到目标值或...
3. 重复上述过程,直到找到目标值或者查找区间为空,此时可以判断目标值不存在于原始数组中。 折半查找的时间复杂度为O(log n),这是因为每次操作都使查找范围减半。这使得它在大型有序数据集上非常高效。 接下来...
如果中间元素不是目标值,则根据目标值与中间元素的大小关系进一步缩小查找范围,重复上述过程直到找到目标值或确定目标值不存在于数组中。 具体步骤如下: 1. 计算中间位置的索引:`mid = (low + high) / 2`。 2. ...
3. 比较中间值:将目标元素与中间值进行比较,如果目标元素小于中间值,则查找范围缩小到中间值左侧,否则查找范围缩小到中间值右侧。 4. 重复步骤2-3:直到查找范围缩小到只包含一个元素时,判断该元素是否为目标...
在小规模数据中,我们可以直接排序后取中间位置的数,但在海量数据中,直接排序是不切实际的。因此,我们需要采用更高效的方法,如“快速选择”或“线性时间复杂度的中位数查找算法”。 快速选择算法基于快速排序的...
折半查找算法是一种在有序数组中寻找特定元素的搜索算法,其基本思想是将数组分为两半,通过比较中间元素和目标值来缩小搜索范围。然而,传统的折半查找在某些情况下并不一定是效率最高的方法。通过对查找算法的改进...
首先,找到中间元素,如果目标值等于中间元素,查找结束;如果目标值小于中间元素,继续在左半部分查找;否则,在右半部分查找。每次比较都使搜索范围减半,直到找到目标元素或搜索范围为空。 7. **二插排序树**: ...
这样的序列就包含两个连续的子序列 {1, 2, 3} 和 {5, 6, 8, 9, 10},中间由不连续的数字分隔。 接下来,我们要解决的是“查找不连续”的问题。在传统的线性查找中,如果目标值存在于序列中,我们需要遍历整个序列...