基于二分查找的两个数组求合集

      吾十有五而志于学,三十而立,四十而不惑,五十而知天命,六十而耳顺,七十而从心所欲不逾矩

                                          ---- 论语

  一个非常简单的例子,听到有人在说这个,就写下来玩玩。

package test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Demo2 {

    public static List<Integer> intersection(int[] arr1, int[] arr2){
        List<Integer> list = new ArrayList<Integer>();
        for(int i : arr1){
            if(binarySearch(arr2, i))
                list.add(i);
        }
        return list;
    }

    public static boolean binarySearch(int[] i, int j){
        Arrays.sort(i);
        int low = 0;
        int high = i.length - 1;

        while(high >= low && low <= i.length - 1 && high <= i.length - 1){
            int middle = low + ((high - low) >> 1);
            if(j == i[middle]){
                return true;
            }else if(j > i[middle]){
                low = middle + 1;
            }else{
                high = middle - 1;
            }
        }
        return false;
    }

    public static void main(String[] args) {
        int[] arr1 = {1,2,4,5,6,7,11,34,56,55};
        int[] arr2 = {6,7,11,4,35,9,0,44};

        List<Integer> list = intersection(arr1, arr2);

        for(int i : list)
            System.out.print(i + ",");

    }

}
时间: 2024-10-05 05:12:42

基于二分查找的两个数组求合集的相关文章

顺序表 | 二分查找:两个数组合并后的中位数

输入两个长度相同的升序数组,返回这两个数组合并后的中位数 C++代码: int bisearch_midNum(int a[],int b[],int n){ int s1=0,s2=0,d1=n-1,d2=n-1,m1,m2; while(s1!=d1 || s2!=d2){//只要a,b序列同时出现了s==d的情况,才能False退出 m1=(s1+d1)/2; m2=(s2+d2)/2; system("pause"); if(a[m1]==b[m2]) return a[m1]

基于二分查找法的数值区间查找

1.问题定义: 在有序数组中,查找在输入数组满足大于某值a,小于某值b的所有元素.其中a和b可以不在数组中. 2.举例描述: 输入数组eg:{2,7,8,11,16,26,31,33,37,40,45,49}.查找满足大于10小于30的所有数字,则输出的结果为{11,16,31}子集.若查找大于50或小于2则输出空集. 3.线性扫描方式: 复杂度O(n) 从左到右扫描满足条件的区间 4.二分查找方式: 复杂度O(logN)二分查找满足条件的区间,两次二分查找,确定子数组范围. auto bina

数组去重和两个数组求交集

引言 今天在项目中一个功能要用到两个数组求交集的算法. 大概是这样: 两个表格分别用easyui datagrid实现,要把A表格的一列数据和B表格的一列数据取出来,然后去重,去重后求交集. 那么在计算出的交集中分别根据求出的数据选中两个表格的对应行. 故用到js数组去重和求交集. 交集 Array.prototype.intersect = function(b) { var flip = {}; var res = []; for(var i=0; i< b.length; i++) fli

Python 迭代器&amp;生成器,装饰器,递归,算法基础:二分查找、二维数组转换,正则表达式,作业:计算器开发

本节大纲 迭代器&生成器 装饰器  基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式,运算后得出结果,结果必须与真实的计算器所得出的结果一致 迭代器&

二分查找的两种实现方式

笔者在这里给出二分查找的两种实现方式. 一. 第一种是健忘版的二分查找,即不管是否已经找到target,查找算法都继续对表进行再分,直到剩下的表的长度为1. 递归实现如下: Error_code recursive_binary_1(const Ordered_list &the_list, const Key &target, int bottom, int top, int &position) { Record data; if (bottom < top) { int

c#二分查找的两种方式

其实:两种方式的实现结果一样,却体现出了不同的思考过程: 地中方式,是在一个while循环中,每次从中间找,不断的去改变low 和 high的 位置,然后求他们的中间位置,知道low=high=0:如果还没有知道值,就直接返回-1: /// <summary> /// 二分查找方式 /// </summary> /// <param name="arr"></param> /// <param name="target&q

算法与数据结构总结1 二分查找与旋转排序数组

一. 二分搜索(Binary Search)模板及其理解 1.通用模板,解决start, end, mid, <(<=), >(>=)等问题 http://www.lintcode.com/en/problem/binary-search/ class Solution { public: /** * @param nums: The integer array. * @param target: Target number to find. * @return: The firs

二分查找的两种实现方式(JAVA)

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用中间位置记录将表分成前.后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表.重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功. 条件是:1.必须

python常用的简单算法,二分查找、冒泡排序、数组翻转等

1.二分查找:主要用于查询元素数量较多的列表,采用二分查找,取中位值,进行大小比较,可以提高效率 1 #二分查找,用于在较大的数据列表中查询某个值,考虑到元素比较多,单纯的遍历会造成内存压力过大,考虑使用二分查找 2 #二分查找的关键在于查询中间值,将需要查找的值与中间值进行比较,然后确定查找方向 3 def binary_search(data_source,find_n): 4 #取中位数 5 mid=int(len(data_source)/2) 6 7 if len(data_sourc