两个集合的交
问题是简单难度
但是,我一开始暴力破解,一直没有过。要么是我暴力破的太菜了,要么就是这个题目本身就是这么要求的。
用到的方法:
快排(O(nlogn))
加上用了个比较好的思路大概是O(n+m)(有点像归并)
综合起来应该是O(nlogn + m)
代码如下
class Solution {
public:
vector<int> intersection(vector<int> nums1, vector<int> nums2) {
vector<int> new_nums;
if (nums1.size() == 0 || nums2.size() == 0)
return new_nums;
sort(nums1, 0, nums1.size() - 1);
sort(nums2, 0, nums2.size() - 1);
int i, j;
i = j = 0;
while ( i < nums1.size() && j < nums2.size() ) {
if (nums1[i] == nums2[j]) {
new_nums.push_back(nums1[i]);
i = move(nums1, i, nums1[i]);
j = move(nums2, j, nums2[j]);
} else if (nums1[i] < nums2[j]) {
i = move(nums1, i, nums1[i]);
} else if (nums1[i] > nums2[j]) {
j = move(nums2, j, nums2[j]);
}
}
return new_nums;
}
private :
void sort(vector<int>& v, int s, int e) {
if (s >= e) return;
int k = v[s], i = s, j= e;
while (i != j) {
while (i < j && v[j] >= k)
--j;
if (i < j)
v[i++] = v[j];
while (i < j && v[i] <= k)
++i;
if (i < j)
v[j--] = v[i];
}
v[j] = k;
sort(v, s, j-1);
sort(v, j+1, e);
}
int move(vector<int>& v, int pos, int val) {
for (int i = pos + 1; i < v.size(); ++i) {
if (v[i] == val)
continue;
return i;
}
return v.size();
}
};