栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

交换最少次数得到连续的1(黑白棋游戏)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

交换最少次数得到连续的1(黑白棋游戏)

现有一个黑白棋游戏,初始时给出一排棋子,记作数组 chess,其中白色棋子记作 0,黑色棋子记作 1。用户可以每次交换 任意位置 的两颗棋子的位置。

为了使得所有黑色棋子相连,请返回最少需要交换多少次。

示例 1:

输入: chess = [1,0,1,0,1,0]
输出: 1
解释: 
有四种可能的方法可以把所有的 1 组合在一起:
[1,1,1,0,0,0],交换 1 次;
[0,1,1,1,0,0],交换 2 次;
[0,0,1,1,1,0],交换 1 次;
[0,0,0,1,1,1],交换 2 次。
所以最少的交换次数为 1。

思路:滑动窗口,假设数组中 1的个数为cnt,那么若经过最少次数交换之后连续1的序列的起始位置为i,则结束位置为i+cnt-1;这段序列区间内的所有0都要被交换走,所以维护一个长度为cnt的窗口,窗口内0个数最少的窗口就是最后的窗口,0的个数就是最少的交换次数。对于0的个数统计可以使用前缀和统计,preSum[i]表示到下标i时出现的0的个数,那么窗口内出现的0的个数为preSum[i]-preSum[cnt];

代码:

class Solution {
    public int minSwaps(int[] chess) {
        int cnt = 0;
        int preSum[] = new int[chess.length];
        for(int i = 0; i < chess.length; i++){
            
            if(chess[i] == 1){
                cnt++;
                preSum[i] = (i==0?0:preSum[i-1]);
            }else{
                preSum[i] = 1 + (i==0?0:preSum[i-1]);
            }
        }
        if(cnt <= 1 || cnt >= chess.length -1){
            return 0;
        }
        int ans = preSum[cnt-1];
        for(int i = cnt; i < chess.length; i++){
            int t = preSum[i] - preSum[i - cnt];
            if(t < ans){
                ans = t;
            }
        }
        return ans;

    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1009102.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号