題目:
兩個含有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; }