看到倍数,很容易想到先进行求模。
那么,我们先对整个数组的每一个数都进行一次对24的求模,创建一个数组record,一共24个位置,对于位置 i ,记录原数组对24求模后等于 i 的有多少个数。
因为题目要求i < j,所以只能从左到右进行遍历,因为record已经记录下了所有的模后结果,在我们遍历某个值的时候,这个值对应的可以和record[24-i]个数组成成对的下标。
例如,在我们遍历到值为3的时候,我们去找record[21],说明在当前这个位置的后面有record[21]个数是可以和我们当前的3组成成对的下标对的。
一边遍历,一遍维护record数组,具体来说,遍历到了3之后,下一次循环应该把record[3]的值减去1,表示我们记录的对24求模后的值等于3的数少了一个。
AC代码:
class Solution {
public:
long long countCompleteDayPairs(vector<int>& hours) {
vector<int>record(27,0);
for(int i=0;i<hours.size();i++){
hours[i]%=24;
record[hours[i]]++;
}
long long ans=0;
for(int i=0;i<hours.size();i++){
record[hours[i]]--;
if(hours[i]==0) ans+=record[hours[i]];
else ans+=record[24-hours[i]];
}
return ans;
}
};