两个有序数组中的交集
2015-09-04 15:38
393 查看
题目:
两个含有n个元素的有序(非降序)整形数组a和b(数组a和b中都没有重复元素),求出其共同元素
a = [0,1,2,3,4]
b = [1,3,5,7,9]
那么交集为{1,3}
解法1:很简单,依次遍历
解法2:假设a很长,b很短,那么再这样遍历显然不是一个很好的方法。可以选择对b的每个元素都到a中二分查找。
具体而言,对b从后往前遍历,然后记录下b元素在a中查找的位置index(不管b中元素在不在)。因为a是增序,所以下次处理b的元素时,就可以缩小a中的查找范围index-1
两个含有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; }
相关文章推荐
- 用于打印UID和GID
- makefile中的注释
- poj1743 Musical Theme(后缀数组--不可重叠最长重复子串+二分)
- nyoj 38 布线问题【最小生成树】
- Android基础入门教程——6.3.1 数据存储与访问之——初见SQLite数据库
- 海量数据处理: Top K算法(问题) 小顶堆实现
- HDU 3879 Base Station(最大权闭合)
- php这是一个随机打印输出字符串的例子
- NotePad大小写转换
- iOS 在UILabel显示不同的字体和颜色
- UVa 714 Copying Books (最大值尽量小_二分+贪心)
- 2015
- Git学习笔记
- 剑指offer:从尾到头打印链表
- 认识自己
- Exception starting filter struts2|java.lang.ClassNotFoundException
- Eclipse中开启java的assert选项
- hdu4291A Short problem 矩阵快速幂
- 3D游戏与计算机图形学中的数学方法-四元数
- PWM设计