给你一份工作时间表 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;
}