zoukankan      html  css  js  c++  java
  • 两个有序数组中的交集

    题目:

    两个含有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;
    }
  • 相关阅读:
    mysql中文乱码
    阻止保存要求重新创建表的更改
    PowerDesigner连接数据库(Oracle)
    PowerDesigner连接数据库(SqlServer)
    Environment Variable: "PATH" 失败
    pl/sql查看锁表及解锁
    Oracle将误闪的数据认回到指定的时间段
    内存监测2
    Windows常用的一些DOC命令
    何为序列化
  • 原文地址:https://www.cnblogs.com/yxzfscg/p/4781810.html
Copyright © 2011-2022 走看看