题意:给出一组数字,求出在每个数字之后比这个数小的数字的个数。
思路:这题用了分治的思想。将数组分成前后两部分来做,每一部分分别求出答案。在合并的时候,记录由后面的数组移动到前面的数组的数字的个数,这个数就是后面数组中比前面数组中比某个数小的数的个数。
class Solution {
public:
struct mynode {
int val;
int pos;
int re;
};
vector<int> countSmaller(vector<int>& nums) {
vector<mynode> tempre;
mynode ininode;
for(int i = 0; i < nums.size(); ++ i) {
ininode.val = nums[i];
ininode.pos = i;
ininode.re = 0;
tempre.push_back(ininode);
}
tempre = merge(tempre);
vector<int> re(nums.size(), 0);
for(int i = 0; i < nums.size(); ++ i) {
re[tempre[i].pos] = tempre[i].re;
}
return re;
}
vector<mynode> merge(vector<mynode> tomerge) {
if(tomerge.size() == 1) {
return tomerge;
}
int mid = (tomerge.size() - 1) / 2; //cout << mid << endl;
vector<mynode> tempFront;
vector<mynode> tempAfter;
for(int i = 0; i <= mid; ++ i) tempFront.push_back(tomerge[i]);
for(int i = mid + 1; i < tomerge.size(); ++ i) tempAfter.push_back(tomerge[i]);
if(tempFront.size()) tempFront = merge(tempFront);
if(tempAfter.size()) tempAfter = merge(tempAfter);
int l = 0;
int r = 0;
vector<mynode> tempre;
int count = 0;
while(l < tempFront.size() || r < tempAfter.size()) {
if(l < tempFront.size() && r < tempAfter.size()) {
if(tempFront[l].val <= tempAfter[r].val) {
tempFront[l].re += count;
tempre.push_back(tempFront[l]);
l ++;
}
else {
count ++;
tempre.push_back(tempAfter[r]);
r ++;
}
continue;
}
if(l < tempFront.size()) {
tempFront[l].re += count;
tempre.push_back(tempFront[l]);
l ++;
continue;
}
if(r < tempAfter.size()) {
count ++;
tempre.push_back(tempAfter[r]);
r ++;
}
}
return tempre;
}
};
在类中也是可以定义结构体的。