题目来源:
leetcode题目,网址:1893. 检查是否区域内所有整数都被覆盖 - 力扣(LeetCode)
解题思路:
start 和 end 的取值范围是 1- 50,因此可以使用比特位位数为 64 的 Long 来表示,第 i 位为 1表示 i 在范围内,否则不在。
获得范围后,通过逻辑运算将所给区间与数组内区间进行逻辑运算,若所给区间内的某个数在数组区间内,对应位变为 1 ,即当且仅当所给区间第 i 位为 1 且数据内区间 第 i 位为 0 时结果为 1 。对应逻辑运算:a&1&(!b)。 最后返回 所给区间是否为 0 即可。
解题代码:
class Solution {
public boolean isCovered(int[][] ranges, int left, int right) {
long range=0;
long one=1;
range=((one<<(right)) - (one<<(left-1)));
for(int i=0;i<ranges.length;i++){
long temp=((one<<(ranges[i][1])) - (one<<(ranges[i][0]-1)));
range= (range &((one<<51)-1))&((~temp)) ;
}
return range==0;
}
}
总结:
1<<51 实际为 1<<(51%32) ,因为系统默认 1 为整型,在写代码时,这个报错处理了好长时间。文章来源:https://www.toymoban.com/news/detail-518448.html
官方题解是基于差分数组的思想解题的。新建整数数组,对于数据内的某个区间[ranges[0],range[1]] ,将ranges[0] 对应值加一,range[1]+1 对应值减去一,这样在对所有区间进行相同的操作后,遍历整数数组并求前缀和的过程中,就得到了每个数被包含在多少个 ranges 区间中。在计算时,若某个数包含在 0 个 ranges 区间中但包含在 [left,right] 区间中,返回false。文章来源地址https://www.toymoban.com/news/detail-518448.html
到了这里,关于题目:1893.检查是否区域内所有整数都被覆盖的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!