LeetCode_1124 表现良好的最长时间段

针对一个记录员工每日工作小时数的数组,此博客探讨了一种算法解决方案,旨在找出并返回最长的「表现良好时间段」,即「劳累的天数」严格大于「不劳累的天数」的时间段的最大长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数。我们认为当员工一天中的工作小时数大于 8 小时的时候,那么这一天就是「劳累的一天」。所谓「表现良好的时间段」,意味在这段时间内,「劳累的天数」是严格 大于「不劳累的天数」。请你返回「表现良好时间段」的最大长度。

示例 1:

输入:hours = [9,9,6,0,6,6,9]
输出:3
解释:最长的表现良好时间段是 [9,9,6]。

提示:

    1 <= hours.length <= 10000
    0 <= hours[i] <= 16

解题思路:

输入:hours = [9,9,6,0,6,6,9]

用1代表大于8的元素,用-1代表小于等于8的元素,得到一个数组[1,1,-1,-1,-1,-1,1]记为arr.

要求「劳累的天数」>「不劳累的天数」的最大长度,即arr数组的子段和>0的 且 是最长的

求sum和数组,sum=[0, 1, 2, 1, 0, -1, -2, -1],sum即前缀数组,sum[i]就是arr[0]+arr[1]+....arr[i-1]的值

这样求子段和的时候,比如arr[2]+arr[3]+...+arr[5]的和直接用sum[6] - sum[2]即可.

因此,找到一个(i,j),使得sum[j] - sum[i] > 0。且j-i最大

public int longestWPI(int[] hours) {
		int[] arr=new int[hours.length];
		int i,j;
		
		for(i=0;i<arr.length;i++) {
			if(hours[i]>8) 
				arr[i]=1;
			else arr[i]=-1;
		}
		System.out.println(Arrays.toString(arr));
		
		int[] sum=new int[arr.length+1];
		int cur_sum=0;
		for(i=0;i<arr.length;i++) {
			sum[i]=cur_sum;
			cur_sum+=arr[i];
		}
		sum[i]=cur_sum;
		System.out.println(Arrays.toString(sum));
		
		//找到一个(i,j)使得sum[j] - sum[i] > 0.
		int max_sum=0;
		int len=0;
		for(i=0;i<sum.length;i++) {
			len=sum[i];
			for(j=i+1;j<sum.length;j++) {
				if(sum[j]-sum[i]>0) {
					max_sum=(j-i)>max_sum?(j-i):max_sum;
				}
				
			}
		}
		return max_sum;
    }

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值