3810.最长连续休息时间-AcWing题库
作者 : Xia Xinyu
日期 : 2021-08-20
原题链接
题目:一天可以被分为 n 个时段。
一个工人的每日工作安排可以用一个长度为 n 的 01 序列 a1,a2,…,an 来表示。
ai 为 0 表示第 i 个时间段是工作时间,ai 为 1 表示第 i 个时间段是休息时间。
工人日复一日的严格按照这个工作安排来进行工作和休息。
请问,工人的最长连续休息时间有多长(单位:时段)?
注意,连续休息时间可能跨天。
保证工人至少在一个时间段处于工作状态。
输入格式
第一行包含整数 T,表示共有 T 组测试数据。
每组数据第一行包含整数 n。
第二行包含 n 个整数 a1,a2,…,an。
输出格式
每组数据输出一行结果,表示最长连续休息时间。
数据范围
1≤T≤10,
1≤n≤2×105,
0≤ai≤1,
同一测试点内所有 n 的和不超过 2×105。
输入样例:
4
5
1 0 1 0 1
6
0 1 0 1 1 0
7
1 0 1 1 1 0 1
3
0 0 0
输出样例:
2
2
3
0
思路1(双指针算法
): 先统计出数组中值全为1
的最长连续子序列长度,由于连续休息时间可能跨天,所以判断一天中的开始和结束时间段是否存在满足条件的子序列并求出长度之和(可能为一个或两个或不存在
),将两个长度取一个max即可。
代码1:
public class Main{public static void main(String[] args){Scanner in = new Scanner(System.in);int T = in.nextInt();while(T-- != 0){int n = in.nextInt();var a = new int[n];int cost = 0;for(int i = 0;i < n;i++) a[i] = in.nextInt();for(int i = 0;i < n;i++){if(a[i] == 0) continue;int j = i + 1;while(j < n && a[j] == 1) j++;cost = Math.max(cost,j - i);i = j;}int t = 0;for(int i = 0;i < n;i++) {if(a[i] == 1) t++;elsebreak;}for(int i = n - 1;i >= 0;i--) {if(a[i] == 1) t++;elsebreak;}cost = Math.max(t,cost);System.out.println(cost);}}
}
时间复杂度: O(n )
空间复杂度: O(n)
思路2(双指针算法
):将序列的头和尾连接起来,直接将序列复制一遍即可,然后利用双指针算法求出最长连续子序列,
代码2(相比第一种思路代码更加简洁
):
import java.util.*;
public class Main{public static void main(String[] args){Scanner in = new Scanner(System.in);int T = in.nextInt();while(T-- != 0){int n = in.nextInt();var a = new int[2 * n];int cost = 0;for(int i = 0;i < n;i++) a[i] = in.nextInt();for(int i = n;i < 2 * n;i++) a[i] = a[i - n];for(int i = 0;i < 2 * n;i++){if(a[i] != 1) continue;int j = i + 1;while(j < 2 * n && a[j] == 1) j++;cost = Math.max(cost,j - i);i = j;}System.out.println(cost);}}
}
时间复杂度: O(n )
空间复杂度: O(n)
3810.最长连续休息时间-AcWing题库相关推荐
- 703. 数独检查 - AcWing题库
https://www.acwing.com/problem/content/705/ 数独是一种流行的单人游戏. 目标是用数字填充9x9矩阵,使每列,每行和所有9个非重叠的3x3子矩阵包含从1到9的 ...
- nyoj 36 最长公共子序列 dp问题最长公共子序列 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共
最长公共子序列 时间限制: 3000 ms | 内存限制: 65535 KB 难度: 3 描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列. tip:最长公共子序列也称 ...
- [Leedcode][JAVA][第128题][最长连续序列][Hash]
[问题描述][困难] 给定一个未排序的整数数组,找出最长连续序列的长度.要求算法的时间复杂度为 O(n).示例:输入: [100, 4, 200, 1, 3, 2] 输出: 4 解释: 最长连续序列是 ...
- C#LeetCode刷题之#674-最长连续递增序列( Longest Continuous Increasing Subsequence)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3734 访问. 给定一个未经排序的整数数组,找到最长且连续的的递增 ...
- 力扣刷题笔记:1438. 绝对差不超过限制的最长连续子数组(滑窗模板题,选择有序列表SortedList()数据类型就不会超时)
题目: 1438.绝对差不超过限制的最长连续子数组 给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于 ...
- 时间计算题100道_2019四校及分校自招开放日情况汇总(含时间安排、考试内容难度、到场人数等)...
点击上方"上海初升高",选择"星标公众号" 回复"加群"就能加入上万家长信赖的升学群 受到疫情的影响,今年各市重点的自招开放日报名迟迟没有提 ...
- [LetCode-1438] 绝对差不超过限制的最长连续子数组
题目 - letcode1438 难度 - 中等 给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于 l ...
- 【华为OD机试B卷,GO题解独家】最长连续交替方波信号
最近更新的博客 [喜报]华为OD统一考试(B卷)题库清单(已收录130题),更快,更全的 B 卷题库大纲 其他OD统一考试试卷整理 华为 od 2023 | 什么是华为 od,od 薪资待遇,od 机 ...
- 最长递增子序列 最长连续递增序列
引言 这两道题有很大的相似性,在这里主要的地方就是循环的设置,不仅仅适用于这两道题,在很多类似的题目中都可以用到,要学会相应的方法才行: 最长递增子序列 给你一个整数数组 nums ,找到其中最长严格 ...
- Codeforces 527C Glass Carving (最长连续0变形+线段树)
Leonid wants to become a glass carver (the person who creates beautiful artworks by cutting the glas ...
最新文章
- 【题解】 [HNOI2015]落忆枫音 (拓扑排序+dp+容斥原理)
- php in_array 和 str_replace
- 收藏:DPDK内存基本概念
- wxpython制作表格界面_Python wxPython库使用wx.ListBox创建列表框示例
- 7-zip压缩解压软件.html,7-Zip 压缩率比较高的压缩软件 17.01 美化优化版
- 多源信息融合与多视角学习
- uchome二次开发
- VUE提示Gradient has outdated direction syntax
- JAVA + 百度地图API 应用
- php活动倒计时代码,JavaScript实现活动倒计时效果的代码分享
- Xftp卸载修复报错1628:完成基于脚本的安装失败
- 大脑简史(3)-大脑的结构
- 微信红包业务,为什么采用轮询算法?
- HTML:1分钟实现简单网站导航栏
- 阿里走向下一个竞技场
- 培训python排行榜
- 创新谈-数据库概念设计之几点见解-吴雨光
- ARM与X86架构的对决[整编]
- 一种简单的方法让华为手机和windows10共享文件
- Easy Excel读取复杂表格文件