这是我参与8月更文挑战的第31天,活动详情查看:8月更文挑战
1980. 找出不同的二进制字符串
思路分析
数组长度为n,而数组中每个元素的都是长度为n的字符串,这类字符串共有种可能,表示的数字为0到。
在这些知识的基础上,我们可以将字符串转换成对应的数字,并分别存入一个map中,再通过遍历数字0到,最后返回第一个map中不存在的数字所对应的字符串
当然也可以反过来,将字符串存入map中,再将数字0到依次转化为字符串并与map比较。
1109. 航班预订统计
思路分析
这道题最简单的方式是依据每一个bookings[i]对answer进行遍历加,这样的话会写出O()时间复杂度的代码。
尝试降低下时间复杂度。
这道题有很明显的区域加和并且单点查询的特征,因此我们可以使用差分数组解决这个问题,简单的介绍下差分,差分可以简单的理解为前缀和的逆过程,比如d[i]如果是f[i]的前缀和,那么f[i]就是d[i]的差分。
设f[i]为【1,2,3,4】则d[i]有【1,3,6,10】.我们想让d[i]的【1,2】增加10,则d[i]有【1,13,16,10】,则可以计算出f[i]为【1,12,3,-6】
写上述例子是因为看到很多人都只会写“将区间 [l, r]整体增加一个值x -》 l[i] += v; l[r + 1] -= v”
(直接写结论鬼都看懂啊)
因此这道题有
vector<int> corpFlightBookings(vector<vector<int>>& bookings, int n) {
vector<int> nums(n);
for (int i = 0; i < bookings.size(); i++) {
nums[bookings[i][0] - 1] += bookings[i][2];
if (bookings[i][1] < n) { // 对于最后一位不需要减少nums的值,因为后面没有数了,不需要为区域相加而特意平衡代码了。
nums[bookings[i][1]] -= bookings[i][2];
}
}
for (int i = 1; i < n; i++) {
nums[i] += nums[i - 1];
}
return nums;
}