力扣每日一题——3184.构成整天的下标对数目Ⅰ
**题目描述:**给你一个整数数组 hours,表示以 小时 为单位的时间,返回一个整数,表示满足 i < j 且 hours[i] + hours[j] 构成 整天 的下标对 i, j 的数目。
整天 定义为时间持续时间是 24 小时的 整数倍 。
例如,1 天是 24 小时,2 天是 48 小时,3 天是 72 小时,以此类推。
示例 1:
输入: hours = [12,12,30,24,24]
输出: 2
解释:
构成整天的下标对分别是 (0, 1) 和 (3, 4)。
示例 2:
输入: hours = [72,48,24,3]
输出: 3
解释:
构成整天的下标对分别是 (0, 1)、(0, 2) 和 (1, 2)。
提示:
1 <= hours.length <= 1001 <= hours[i] <= 109
**解法一:**暴力双重for循环
public int countCompleteDayPairs(int[] hours) {
//count计数
int count = 0;
for (int i = 0; i < hours.length -1; i++) {
for (int j = i+1; j < hours.length; j++) {
if ((hours[i]+hours[j])%24 == 0){
count++;
}
}
}
return count;
}
解法二:计数数组+排列组合
//分情况讨论 建立count数组 数学排列组合知识
public int countCompleteDayPairs(int[] hours) {
//按小时计数,一天也就24个小时,将每中小时出现的次数存放到count数组中
int[] count = new int[24];
for (int hour : hours) {
//对hours中每个元素取模,得到24以内的数,存放到count数组中
count[hour%24]++;
}
int result =0;
//相当于求count中两个数加起来等于24的个数
//但是要注意,0和12需要分开讨论。相当于从count[0]个数组选出两个两两组合。count[12]同理
result += count[0]*(count[0]-1)/2;
result += count[12]*(count[12]-1)/2;
//求两两相加为24的组合数
for (int i = 0; i < 12; i++) {
result += count[i] * count[24 - i];
}
return result;
}
1818

被折叠的 条评论
为什么被折叠?



