Leetcode-数组-5686. 移动所有球到每个盒子所需的最小操作数

题目5686. 移动所有球到每个盒子所需的最小操作数:

Leetcode-数组-5686. 移动所有球到每个盒子所需的最小操作数_第1张图片

题解:

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;
    }
};

 

你可能感兴趣的:(#,LeetCode)