1,对于位置i来说,要把它前面的向后挪,后面的向前挪,分别设置pre,last来表示这两个所需要的步骤
其实pre[i][0]表示当前在其位置的小球个数,pre[i][1],表示所需要的步骤
最终pre[i][1]+last[i][1]即i处总步骤
class Solution {
public:
vector minOperations(string boxes)
{
int len = boxes.length();
int pre[len][2];
int last[len][2];
pre[0][0] = pre[0][1] = last[len-1][0] = last[len-1][1]=0;
vector res(len);
for(int i = 1; i < len; i++)
{
if(boxes[i-1]=='1')
{
pre[i][0] = 1 + pre[i-1][0];
}
else
{
pre[i][0] = pre[i-1][0];
}
pre[i][1] = pre[i-1][1] + pre[i][0];
}
for(int i = len-2; i >=0; i--)
{
if(boxes[i+1]=='1')
{
last[i][0] = 1 + last[i+1][0];
}
else
{
last[i][0] = last[i+1][0];
}
last[i][1] = last[i+1][1] + last[i][0];
}
for(int i = 0 ;i < len; i++){res[i] = pre[i][1]+last[i][1];}
return res;
}
};
由前一个盒子得到步骤
class Solution {
public:
vector minOperations(string boxes)
{
int len = boxes.length();
vector res(len);
int left = boxes[0]=='1'? 1:0;
int right = 0;
int total = 0;
for(int i = 1; i < len; i++)
{
if(boxes[i]=='1')
{
right++;
total+=i;
}
}
res[0]=total;
for(int i = 1; i < len; i++)
{
total = total + left - right;
if(boxes[i]=='1')
{
left++;
right--;
}
res[i] = total;
}
return res;
}
};