IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Leetcode 6003 移除所有载有违禁货物车厢所需的最少时间 -> 正文阅读

[数据结构与算法]Leetcode 6003 移除所有载有违禁货物车厢所需的最少时间

前言:与这道极为类似的题目我曾两度遇到,第一次是在比赛中,我没做出来。正好,力扣本周的周赛题又出了这道,便想写个题解。

6003. 移除所有载有违禁货物车厢所需的最少时间

给你一个下标从 0 开始的二进制字符串 s ,表示一个列车车厢序列。s[i] = '0' 表示第 i 节车厢 含违禁货物,而 s[i] = '1' 表示第 i 节车厢含违禁货物。

作为列车长,你需要清理掉所有载有违禁货物的车厢。你可以不限次数执行下述三种操作中的任意一个:

  1. 从列车 端移除一节车厢(即移除 s[0]),用去 1 单位时间。
  2. 从列车 端移除一节车厢(即移除 s[s.length - 1]),用去 1 单位时间。
  3. 从列车车厢序列的 任意位置 移除一节车厢,用去 2 单位时间。

返回移除所有载有违禁货物车厢所需要的 最少 单位时间数。

注意,空的列车车厢序列视为没有车厢含违禁货物。


动态规划题解:

大致思路:动态规划的关键基础是最优子结构的寻找,这题两侧是对称的为我们找寻子结构增添了些许困难,但观察后可以发现如果条件1,2任意删去一者,子结构就明朗起来。而答案一定同时具有两种子结构(即存在一个分界点,该点左处条件1和3适用,而右侧则适用2和3),于是便有了下述的解法。

?

对于左侧,数组front[ i ]为将第 i 个车厢及其之前的违禁货物去除所花时间。如果第 i 个车厢为无需移除(为0),则front[i]=front[i-1];若需要移除(为1),则可以使用规则3直接移除,或将第 i 位和其右侧完全移除,front[i]=min(front[i-1]+2,i+1)。右侧对称。综上,有状态转移方程:

front[i]=\left\{\begin{matrix} front[i-1]\ (s[i]='0') & & \\ min(front[i-1]+2,i+1)\ (s[i]='1')& & \end{matrix}\right.

?

back[i]=\left\{\begin{matrix} back[i+1]\ (s[i]='0') & & \\ min(back[i+1]+2,s.len-i)\ (s[i]='1')& & \end{matrix}\right.

构建完数组后(第一个元素需要注意),枚举断点,得到时间最短的即可 :

ans=min\left \{ front[i]+back[i+1]\right \}_{i=0\ to\ s.len-1}?

?最后愉快地编程实现即可~~~

class Solution {
public:
    int front[200005],back[200005];
    int minimumTime(string s) {
        int len=s.length();
        //动态规划得到front数组
        front[0]=s[0]=='0'?0:1;
        for(int i=1;i<len;i++){
            if(s[i]=='0'){
                front[i]=front[i-1];
            }else{
                front[i]=min(front[i-1]+2,i+1);
            }
        }
        //动态规划得到back数组
        back[len-1]=s[len-1]=='0'?0:1;
        for(int i=len-2;i>=0;i--){
            if(s[i]=='0'){
                back[i]=back[i+1];
            }else{
                back[i]=min(back[i+1]+2,len-i);
            }
        }
        //枚举断点
        int ans=1000000;//充分大即可
        for(int i=0;i<len;i++){
            ans=min(ans,front[i]+back[i+1]);
        }
        return ans;
    }
};

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-02-07 13:58:02  更:2022-02-07 13:59:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 18:54:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码