两个有序数组中的交集

题目:

两个含有n个元素的有序(非降序)整形数组a和b(数组a和b中都没有重复元素),求出其共同元素

a = [0,1,2,3,4]

b = [1,3,5,7,9]

那么交集为{1,3}

解法1:很简单,依次遍历

vector<int> commonValue1(vector<int>a, vector<int> b){
    vector<int> result;
    if (a.size() < 1 || b.size() < 1)
        return result;
    int i = 0, j = 0;
    while (i < a.size() && j < b.size()){
        if (a[i] == b[j]){
            result.push_back(a[i]);
            i++;
            j++;
        }else if (a[i] > b[j]){
            j++;
        }else{
            i++;
        }
    }
    return result;
}

解法2:假设a很长,b很短,那么再这样遍历显然不是一个很好的方法。可以选择对b的每个元素都到a中二分查找。

具体而言,对b从后往前遍历,然后记录下b元素在a中查找的位置index(不管b中元素在不在)。因为a是增序,所以下次处理b的元素时,就可以缩小a中的查找范围index-1

//二分查找 返回下标地址,目标不存在则返回left

int binarySearch(vector<int> v,int size,int target){
    //int size = v.size();
    if (size < 1)
        return -1;
    int l = 0, r = size-1;
    while (l <= r){
        int m = (l + r) / 2;
        if (v[m] == target){
            return m;
        }else if (v[m] > target){
            r = m-1;
        }else{
            l = m+1;
        }
    }
    return l;
}
vector<int> commonValue2(vector<int> a, vector<int> b){
    vector<int> result;
    int index = a.size();
    for (int i = b.size()-1; i >= 0; i--){

        index = binarySearch(a,index-1,b[i]);

        if (a[index] == b[i])
            result.push_back(b[i]);
        if (index < 1)
            return result;
    }
    return result;
}
时间: 2024-10-29 13:20:32

两个有序数组中的交集的相关文章

Coursera Algorithms week3 快速排序 练习测验: Selection in two sorted arrays(从两个有序数组中寻找第K大元素)

题目原文 Selection in two sorted arrays. Given two sorted arrays a[] and b[], of sizes n1 and n2, respectively, design an algorithm to find the kth largest key. The order  of growth of the worst case running time of your algorithm should be logn, where n

两个有序数组中查找第K大数

题目:两个数组A.B,长度分别为m.n,即A(m).B(n),分别是递增数组.求第K大的数字. 方法一: 简单的办法,使用Merge Sort,首先将两个数组合并,然后在枚举查找.这个算法的时间复杂度是O(m+n).空间复杂度也是O(M+n). 这个方法其实没有考虑到有第K大数为两个相同数字的情况. 方法二: 这里需要两个前提条件, 1.如果K是中位数,则(M+n)是奇数还是偶数是有关系的.如果是奇数,那么中位数唯一,如果是偶数就有两个中位数,可以随便取一个. 2.如果找到的第K大数是x,假如在

寻找两个有序数组的中位数 C++实现leetcode系列(四)

给定两个大小为 m 和 n 的有序数组 nums1和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 不会同时为空. 示例 1: nums1 = [1, 3] nums2 = [2] 则中位数是 2.0 示例 2: nums1 = [1, 2] nums2 = [3, 4] 则中位数是 (2 + 3)/2 = 2.5 这道题让我们求两个有序数组的中位数,而且限制了时间复杂度为 O(log (m+n))

算法--两个有序数组合并

两个有序数组合并 关键点:从后往前进行比较,这样保证数组A有用的部分不会因为在合并的过程中覆盖掉 第15节 有序数组合并练习题 有两个从小到大排序以后的数组A和B,其中A的末端有足够的缓冲空容纳B.请编写一个方法,将B合并入A并排序. 给定两个有序int数组A和B,A中的缓冲空用0填充,同时给定A和B的真实大小int n和int m,请返回合并后的数组. Java (javac 1.7) 代码自动补全 1 import java.util.*; 2 3 public class Merge {

求两个有序数组的中位数

这是我做的第二个leetcode题目,一开始以为和第一个一样很简单,但是做的过程中才发现这个题目非常难,给人一种“刚上战场就踩上地雷挂掉了”的感觉.后来搜了一下leetcode的难度分布表(leetcode难度及面试频率)才发现,该问题是难度为5的问题,真是小看了它!网上搜了很多答案,但是鲜见简明正确的解答,唯有一种寻找第k小值的方法非常好,在此整理一下. 首先对leetcode的编译运行吐槽一下:貌似没有超时判断,而且small和large的数据集相差很小.此题一开始我采用最笨的方法去实现,利

合并两个有序数组

思路: 跟替换字符串中的空格一样,都是从后往前遍历.因为从前往后遍历的话,元素需要移动的次数较多. 示意图: 代码: /****************************************** 两个有序数组的合并 by Rowandjj 2014/7/16 ******************************************/ #include<iostream> using namespace std; #define MAX 1024 //合并有序数组a与有序数

合并两个有序数组为一个新的有序数组

题目:有两个有序数组a,b,现须要将其合并成一个新的有序数组. 简单的思路就是先放到一个新的数组中,再排序.可是这种没体现不论什么算法,这里考的不是高速排序等排序算法.关键应该是怎样利用有序已知这个条件.能够这样想.如果两个源数组的长度不一样,那么如果当中短的数组用完了,即所有放入到新数组中去了,那么长数组中剩下的那一段就能够直接拿来放入到新数组中去了. public class MergeTwoSortedArrays { public static int[] merge(int[] a,

两个有序数组的中位数 【算法】

有两个有序数组A和B,设计算法求出A和B的中位数. 情况1. 数组A.B长度相等,设为n. 1)分别计算A和B的中位数m1和m2. 2)比较m1和m2.如果m1等于m2,那么最终结果就是m1(m2). 3)如果m1大于m2,那么中位数必定在和两个子数组中. 4)如果m1小于m2,那么中位数必定在和两个子数组中. 5)重复上述步骤,直至两个子数组的大小均为2,那么最终结果为. 情况2. 数组A.B长度不相等,分别设为m,n(m <= n). 假设是中位数,那么因为数组是有序的,一定比数组A中前数大

找出有序数组中绝对值最小的数

问题: 一个有序数组,值有可能有负值,也有可能没有,现需要找出其中绝对值最小的值. 方法1: 遍历数组,找到绝对值最小值,时间复杂度O(n),n为元素个数. 方法2: 二分查找,因为数组有序,可以利用二分查找,时间复杂度O(logn). 分析步骤: 如果第一个数为正数,说明整个数组没有负数,直接返回第一个数 如果最后一个数为负数,说明整个数组没有正数,直接返回最后一个数 数组元素有正有负,说明绝对值最小的元素肯定在正负数交界处,需要二分查找上场: 如果a[mid]<0,因为数组是升序,说明绝对值