/*
问题描述:数组序列变换,将数组中元素以新的次序重新排列得到新的数组,例如给定变换后的序列B={4,2,5,6,1,3},变换序列P={3,1,5,4,0,2},找到变换前的序列A,要求在不申请新的数组空间,在A数组上直接进行处理完成
问题描述:数组序列变换,将数组中元素以新的次序重新排列得到新的数组,例如给定变换后的序列B={4,2,5,6,1,3},变换序列P={3,1,5,4,0,2},找到变换前的序列A,要求在不申请新的数组空间,在A数组上直接进行处理完成
来源:网易算法课
说明:关键处理转换序列P,在P的处理上空间复杂度为O(n)还需要改进
*/
#include <iostream>
#include <vector>
using namespace std;
int moveSteps(vector<int> P, int end)
{
int i, count = 0, step = 0;
for (i = 0; i < end; i++)
{
if (P[end] < P[i])
count++;
}
return step + count;
}
void moveArrays(vector<int> &A, int begin, int end)
{
for (; end > begin; end--)
{
A[end] = A[end - 1];
}
}
//处理转换序列P
void convertArray(vector<int> &P)
{
vector<int> pTemp;
int i, j, pos;
for (i = 0; i < P.size(); i++)
{
for (j = 0; j < P.size(); j++)
{
if (i == P[j])
{
pos = j;
break;
}
}
pTemp.push_back(pos);
}
P = pTemp;
}
void arraySequenceTransform(vector<int> &A, vector<int> &P)
{
int i, change, temp;
convertArray(P);//转换P
for (i = 0; i < P.size(); i++)
{
change = P[i] + moveSteps(P, i);
temp = A[change];
//数组i到change-1右移一位
moveArrays(A, i, change);
A[i] = temp;
}
}
int main()
{
vector<int> A = { 4, 2, 6, 5, 1, 3 };
vector<int> P = { 3, 1, 5, 4, 0, 2 };
arraySequenceTransform(A, P);
for (int i = 0; i < A.size(); i++)
cout << A[i] << " ";
return 0;
}