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

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

题解:

1,对于位置i来说,要把它前面的向后挪,后面的向前挪,分别设置pre,last来表示这两个所需要的步骤

    其实pre[i][0]表示当前在其位置的小球个数,pre[i][1],表示所需要的步骤

最终pre[i][1]+last[i][1]即i处总步骤

class Solution {
public:
    vector<int> 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<int> 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<int> minOperations(string boxes) 
    {
        int len = boxes.length();
        vector<int> 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;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值