【LeetCode】1769.移动所有球到每个盒子所需的最小操作数

news2024/12/22 19:40:34

题目描述

有 n 个盒子。给你一个长度为 n 的二进制字符串 boxes ,其中 boxes[i] 的值为 ‘0’ 表示第 i 个盒子是 空 的,而 boxes[i] 的值为 ‘1’ 表示盒子里有 一个 小球。
在一步操作中,你可以将 一个 小球从某个盒子移动到一个与之相邻的盒子中。第 i 个盒子和第 j 个盒子相邻需满足 abs(i - j) == 1 。注意,操作执行后,某些盒子中可能会存在不止一个小球。
返回一个长度为 n 的数组 answer ,其中 answer[i] 是将所有小球移动到第 i 个盒子所需的 最小 操作数。
每个 answer[i] 都需要根据盒子的 初始状态 进行计算。

示例 1:

输入:boxes = “110”
输出:[1,1,3]
解释:每个盒子对应的最小操作数如下:

  • 第 1 个盒子:将一个小球从第 2 个盒子移动到第 1 个盒子,需要 1 步操作。
  • 第 2 个盒子:将一个小球从第 1 个盒子移动到第 2 个盒子,需要 1 步操作。
  • 第 3 个盒子:将一个小球从第 1 个盒子移动到第 3 个盒子,需要 2 步操作。将一个小球从第 2 个盒子移动到第 3 个盒子,需要 1 步操作。共计 3 步操作。

示例 2:

输入:boxes = “001011”
输出:[11,8,5,4,3,4]

提示:

n == boxes.length
1 <= n <= 2000
boxes[i] 为 ‘0’ 或 ‘1’

方法一:两次遍历

class Solution {
public:
    vector<int> minOperations(string boxes) {
        int n = boxes.size();
        vector<int> flag;
        vector<int> answer(n);
        // 一次遍历:保存有小球的下标
        for(int i=0; i<n; i++){
            if(boxes[i] == '1') flag.push_back(i);
        }
        
        // 二次遍历:小球下标和当前下标的差值就是操作次数
        for(int i=0; i<n; i++){
            for(int j=0; j<flag.size(); j++){
                answer[i] += abs(flag[j] - i);
            }
        }
    return answer;
    }
};

方法二:方法一的优化-一次遍历
没必要保存小球下标的位置,直接计算即可

class Solution {
public:
    vector<int> minOperations(string boxes) {
        int n = boxes.size();
        vector<int> answer(n);
        // 一次遍历
        for(int i=0; i<n; i++){
        	// 外层遍历移动目标盒子
            for(int j=0; j<n; j++){
            	// 内层遍历盒子里是否有小球
                if(boxes[j] == '1') answer[i] += abs(j - i);
            }
        }
    return answer;
    }
};

方法三:方法二的优化,减少时间
首先考虑该盒子中是否有小球,如果有再继续考虑,没有的话直接遍历下一个小球

class Solution {
public:
    vector<int> minOperations(string boxes) {
        int n = boxes.size();
        vector<int> answer(n);
        for(int i=0; i<n; i++){
        	// 外层遍历是否有小球需要移动
            if(boxes[i] == '0') continue;
            for(int j=0; j<n; j++){
            // 内层遍历要移动目标盒子
                answer[j] += abs(j - i);
            }
        }
    return answer;
    }
};

心得
这道题不算很难,一开始先用 动态规划 去做,但是我还是不太熟练,不太会去找临界条件,觉得有些麻烦,最后还是用最普通的思路,以下做介绍。

方法一:双重循环模拟

  • 思路
    • 问题在于计算将 所有小球 移动到第 i 个盒子所需的 最小 操作数,并且每次只能移动 一个 小球。从第二个例子可以发现,第 j 个盒子里的小球移动到 第 i 个盒子,所需的操作数就是 abs(j - i) ,这里使用了 abs 是考虑到可能是将左边的小球移动到右边的盒子,此时 j - i 为负数。
    • 确定好 「abs(j - i)」之后,需要知道 j 的位置,因此我首先遍历了 boxes 数组,将有小球的盒子下标保存在 flag 数组里。
    • 之后只需要双重模拟循环,依次将每个盒子 i 与 flag 中有小球的盒子下标相减,就可以得到操作次数。
  • 时间复杂度: O(n2
  • 空间复杂度: O(n)
    在这里插入图片描述

方法二:双重循环模拟(方法一的优化)

  • 思路
    • 总体思路和方法一差不多,考虑到 flag数组 有点多余,因为可以在双重循环的时候顺便判断该盒子里是否有小球,即 「 if ( boxes[j] == ‘1’ ) 」,因此方法二去掉了第一次遍历,空间复杂度降低了。
  • 时间复杂度: O(n2
  • 空间复杂度: O(n)
    在这里插入图片描述

方法三:双重循环模拟(方法二的优化)

  • 思路
  • 总体思路和方法二差不多,将内外层循环的定义做了调换,首先考虑遍历到的盒子里是否有小球,如果有的话再把它加入到移动目标盒子中。除了极端情况(每个盒子都有小球),这样子的遍历次数肯定会少于 n2,运行时间提高了一倍。
  • 时间复杂度 < O(n2
  • 空间复杂度: O(n)
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/53961.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

整理Ubuntu深度学习服务器初始化操作

前言 这两年总是换服务器&#xff0c;每次配置都挺麻烦的要搜一堆东西&#xff0c;干脆直接整理一下供自己以后参考。 版本说明 Ubuntu 20.04 桌面版 系统配置 配置SSH 安装ssh sudo apt update sudo apt install openssh-server检查ssh状态 sudo systemctl status ssh…

js将图片或者文件转成base64格式的两种方法

场景一&#xff0c;项目assets资源里面的图片本地图片&#xff0c;重点如下 需要了解 canvas的基本操作&#xff0c;canvas.toDataURL 方法 HTMLCanvasElement.toDataURL() 方法返回一个包含图片展示的 data URI 。可以使用 type 参数其类型&#xff0c;默认为 PNG 格式。图片…

session和cookie的区别

文章目录一概念理解1、无状态的HTTP协议&#xff1a;2、会话&#xff08;Session&#xff09;跟踪&#xff1a;二cookie1、会话Cookie和持久Cookie2、Cookie具有不可跨域名性三. Session1、两个问题&#xff1a;2、session的创建&#xff1a;3、禁用cookie&#xff1a;四. 总结…

GIS工具maptalks开发手册(二)01-02之GeoJSON转化为Geometry——渲染点

GIS工具maptalks开发手册(二)01-02之GeoJSON转化为Geometry——渲染点 效果 1、html官方版 <!DOCTYPE html> <html> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1"> <t…

c实现mp4解封装

文章目录前序MP4简介MP4的定义MP4的封装格式Box类型详解Box格式ftyp boxmvhd boxtkhd boxhdlr boxmdat boxstbl boxstsd boxstco boxstsc boxstsz boxstts boxstss boxdemuxer demo的实现(视频数据部分)总结&#xff1a;工具介绍源码参考前序 最近为了更加深入了解音视频demux…

nginx源码分析--基数树

typedef struct {ngx_radix_node_t *root;ngx_pool_t *pool;ngx_radix_node_t *free;char *start;size_t size; } ngx_radix_tree_t;预备知识 1.基数树也是一种二叉查找树,目前官方模块中仅geo模块使用了基数树.2.ngx_radix_tree_t基数树要求…

微服务框架 SpringCloud微服务架构 8 Gateway 网关 8.7 网关的cors 跨域配置

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构8 Gateway 网关8.7 网关的cors 跨域配置8.7.1 跨域问题处理8.7.2 案例8.7.…

深入讲解Netty那些事儿之从内核角度看IO模型(下)

接上文深入讲解Netty那些事儿之从内核角度看IO模型&#xff08;上&#xff09; epoll 通过上边对select,poll核心原理的介绍&#xff0c;我们看到select,poll的性能瓶颈主要体现在下面三个地方&#xff1a; 因为内核不会保存我们要监听的socket集合&#xff0c;所以在每次调用…

最全面的Spring教程(六)——WebSocket

前言 本文为 【SpringMVC教程】WebSocket 相关知识介绍&#xff0c;具体将对WebSocket进行简介&#xff0c;并通过实战案例对WebSocket的使用进行详尽介绍~ &#x1f4cc;博主主页&#xff1a;小新要变强 的主页 &#x1f449;Java全栈学习路线可参考&#xff1a;【Java全栈学…

SpringBoot接口 - 如何优雅的写Controller并统一异常处理?

内容目录 为什么要优雅的处理异常 实现案例ControllerAdvice异常统一处理Controller接口运行测试 进一步理解ControllerAdvice还可以怎么用&#xff1f;ControllerAdvice是如何起作用的&#xff08;原理&#xff09;&#xff1f; 示例源码 更多内容 SpringBoot接口如何对异…

【Pygame实战】代码版《舞动青春*炫舞》能否引领音舞游戏再一次爆发?“你还记得最浪漫的舞蹈游戏炫舞吗?”

导语 Hello&#xff0c;大家好呀&#xff01;我是木木子吖&#xff5e; 一个集美貌幽默风趣善良可爱并努力码代码的程序媛一枚。 听说关注我的人会一夜暴富发大财哦~ &#xff08;哇哇哇 这真的爱&#x1f60d;&#x1f60d;&#xff09; 所有文章完整的素材源码都在&#…

GIS工具maptalks开发手册(二)01-11——渲染文字及参数注释

GIS工具maptalks开发手册(二)01-11——渲染文字及参数注释 效果 代码 index.html <!DOCTYPE html> <html> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1"> <title>…

E. Gardener and Tree(拓扑排序)

Problem - 1593E - Codeforces 树是一个无定向的连接图&#xff0c;其中没有循环。这个问题是关于无根的树。一棵树的叶子是一个顶点&#xff0c;它最多与一个顶点相连。 园丁维塔利用n个顶点种了一棵树。他决定对这棵树进行修剪。为了做到这一点&#xff0c;他进行了一些操作…

云原生应用的最小特权原则

IDC 预计&#xff0c;从现在到 2024 年初&#xff0c;将开发和部署 5 亿个新应用程序——超过过去 40 年的总和。 Gartner 预测&#xff0c;到 2025 年&#xff0c;75% 的企业将运行某种容器化应用程序。 现代应用程序需要现代安全性。 公共云供应商非常积极地提升平台安全性&…

JAVA培训之连接查询之子查询

子查询就是嵌套查询&#xff0c;即SELECT语句中包含SELECT语句&#xff0c;如果一条语句中存在两个&#xff0c;或两个以上SELECT&#xff0c;那么就是子查询语句了。 子查询出现的位置&#xff1a; Where子句中&#xff0c;作为条件存在&#xff1b;from后&#xff0c;作为表…

Bootstrap学习(十一)

模态框使用&#xff1a; tab标签页组件 模态框使用&#xff1a; 有属性、方法、事件 fade显示时的渐变动画可加可不加&#xff0c;role是屏幕辅助设备用的 aria-lable屏幕辅助设备用的 静态的模态框是不展示的&#xff0c;需要调用展示方法才能展示 在中心内容放一个表单&…

Transformer Encoder-Decoer 结构回顾

有关于Transformer、BERT及其各种变体的详细介绍请参照笔者另一篇博客&#xff1a;最火的几个全网络预训练模型梳理整合&#xff08;BERT、ALBERT、XLNet详解&#xff09;。 本文基于对T5一文的理解&#xff0c;再重新回顾一下有关于auto-encoder、auto-regressive等常见概念&…

Elasticsearch 安装及启动【Windows】

一、下载 Elasticsearch 官网下载地址&#xff1a;https://www.elastic.co/cn/downloads/past-releases#elasticsearch 选择自己所需版本进行下载&#xff0c;这里以Elasticsearch 8.2.2 为例 点击 Download&#xff0c;选择 Windows 版本 二、使用步骤 1.安装 Elasticse…

大数据培训课程WordCount案例实操

WordCount案例实操 1&#xff0e;需求 在给定的文本文件中统计输出每一个单词出现的总次数 &#xff08;1&#xff09;输入数据 &#xff08;2&#xff09;期望输出数据 atguigu 2 banzhang 1 cls 2 hadoop 1 jiao 1 ss 2 xue 1 2&#xff0e;需求分析 …

如何看待越来越多人报名参加软考?

可以肯定的告诉你软考证书是有用的。 但是软考证书如果对于自己今后的职业生涯规划也有帮助&#xff0c;和你的职业发展和需求相匹配&#xff0c;那才能发挥软考证书最大的优势。 软考证书的用处体现在哪里&#xff1f; 1、证书认可度高 软考是一种简称&#xff0c;全称是计…