问题描述:
给一个array比如[4,2,1,3,5],根据这个array现在我们能有了一个新的array => 每个数是在原array里, 在它左边的所有比它大的number的个数,就是[0,1,2,1,0]. 题目是现在给了这个[0,1,2,1,0]要求原array, 原来array的range是1~n,
思路描述:
首先,初始化一个动态数组vector,使其值为:1-n
然后,从给定数组的最后一个开始,依次确定每一个位置上的数字,并将其值从动态数组中删除.
举例:
初始化数组:orderNumber{1,2,3,4,5};给定数组:data{0,1,2,1,0};求原数组res,res初始化为res{0,0,0,0,0}。
1. data[5-1]=0,说明前面没有比其大的数字,则res[5-1]=5.擦除掉orderNumber中已经确定的数字,此时orderNumber数组为orderNumber={1,2,3,4}
2. data[5-2]=1,说明前面有1个比其大的数字,则在剩余数字orderNumber中,有1个比其大的数字为3,则res[5-2]=3,此时,orderNumber={1,2,4}
3. data[5-3]=2,说明前面有2个比其大的数字,则在剩余数字orderNumber中,有2个比其大的数字为1,则res[5-2]=1,此时,orderNumber={1,2,4}
...
依次,可以得到每一个位置上的数字:res = {4,2,1,3,5}
代码:
#define ArrarRightGreater #ifdef ArrarRightGreater #include <iostream> #include <vector> using namespace std; int main(int argc, char* argv[]) { vector<int> data; char tempc; while ((tempc = cin.get()) != '\n') { if (tempc != ' ') { data.push_back(tempc - '0'); } } //6 2 7 5 8 11 13 1 4 10 3 12 9 //vector<int> data{0,1,0,2,0,0,0,7,6,2,8,1,4}; int nsize = data.size(); vector<int> orderNumber(nsize, 0); for (int i = 0; i < nsize; ++i) { orderNumber[i] = i+1; } vector<int> res(nsize, 0); for (int i = nsize - 1; i >= 0; --i) { res[i] = orderNumber[orderNumber.size() - 1 - data[i]]; orderNumber.erase(orderNumber.end() - 1 - data[i]); } for (int i = 0; i < nsize; ++i) { cout << res[i]<<" "; } cout << endl; system("pause"); return 0; } #endif/*ArrarRightGreater*/
测试: