返回两个数组的交
样例
nums1 = [1, 2, 2, 1]
, nums2 = [2, 2]
, 返回 [2]
.
先排序,从nums1数组中取数判断时,若nums1[i] > nums2[j]才继续遍历nums2,并用一个k值记录nums2中比nums1[i-1]小的最大数的角标,下次判断nums[i]时nums2从k值开始取。
class Solution {
public:
/**
* @param nums1 an integer array
* @param nums2 an integer array
* @return an integer array
*/
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
// Write your code here
int size1 = nums1.size(), size2 = nums2.size();
if(size1 == 0 || size2 == 0)
return vector<int>();
sort(nums1, 0, size1-1);
sort(nums2, 0, size2-1);
//int j = 0;
vector<int> result;
int k = 0;
for(int i = 0; i < size1; i++)
{
for(int j = k; j < size2; j++)
{
if(nums1[i] == nums2[j])
{
if(result.empty() || *--result.end() != nums1[i])
result.push_back(nums1[i]);
break;
}
else if(nums1[i] < nums2[j])
break;
else
k = j;
}
}
return result;
}
void sort(vector<int> &a, int left, int right)
{
if(left < right)
{
int i = left;
int j = right;
int temp = a[left];
while(i < j)
{
while(i < j && temp <= a[j])
j--;
if(i < j)
{
a[i] = a[j];
i++;
}
while(i < j && temp > a[i])
i++;
if(i < j)
{
a[j] = a[i];
j--;
}
}
a[i] = temp;
sort(a, left, i-1);
sort(a, i+1, right);
}
}
};