- 题目:多个有序32位整数集合求交 int32
- 例如:A = {0, 1, 3, 4}, B = {1, 4, 5}, C = {0, 1, 4}, A&B&C的交集为{1, 4}
- 要求:设计函数接口并实现算法, 计算和空间复杂度尽可能低
class Solution{
public:
vector<int> arrayIntersection01(vector<vector<int>> &arr){
vector<int> ret;
int len01 = arr.size();
unordered_map<int,int> umap;
for(int i = 0; i < len01; i++){
int len02 = arr[i].size();
for(int j = 0; j < len02; j++){
umap[arr[i][j]]++;
}
}
int len03 = umap.size();
for(int k = 0; k < len03; k++){
if(umap[k] == len01){
ret.push_back(k);
}
}
return ret;
}
#include<algorithm>
vector<int> ArrIntersection01(vector<int> &vec1, vector<int> &vec2){
vector<int> vec;
int index = 0;
for(int i = 0; i < vec1.size(); i++){
if(count(vec2.begin(), vec2.end(), vec1[i])) vec[index++] = vec1[i];
}
vec1 = vec;
return vec1;
}
vector<int> ArrIntersection02(vector<int> &vec1, vector<int> &vec2){
vector<int> vec;
int i = 0,j = 0,index = 0;
while(i < vec1.size() && j < vec2.size()){
if(vec1[i] < vec2[j]){
i++;
}else if(vec1[i] > vec2[j]){
j++;
}else{
vec[index++] = vec1[i];
}
}
vec1 = vec;
return vec1;
}
#include <set>
vector<int> ArrIntersection03(vector<int> &vec1, vector<int> &vec2){
vector<int> vec;
set<int> st1;
set<int> st2;
for(int i : vec1) st1.insert(i);
for(int i : vec2){
if(st1.count(i)){
vec.push_back(i);
}
}
vec1 = vec;
return vec1;
}
#include <math.h>
vector<int> ArrIntersection01(vector<int> &vec1, vector<int> &vec2);
vector<int> ArrIntersection02(vector<int> &vec1, vector<int> &vec2);
vector<int> ArrIntersection03(vector<int> &vec1, vector<int> &vec2);
vector<int> arrayIntersection02(vector<vector<int>> &arr){
vector<int> ret;
int turn = 1;
int len = arr.size();
len = ceil(len/2);
if(len == 1){
if(arr.size() == 1){
ret = arr[0];
}else{
ret = ArrIntersection01(arr[0], arr[1]);
}
}
while(len != 1){
for(int i = 0; i < len; i++){
if((i+turn) > (arr.size() - 1)){
continue;
}else{
arr[i] = ArrIntersection01(arr[i], arr[i+turn]);
}
i += 2*turn;
}
len = ceil(len/2);
turn = 2*turn;
}
ret = arr[0];
return ret;
}
};