100分解法
比较基础的一个差分题。可以选择离散化m个区间去差分,时间复杂度o(mlogm),空间复杂度o(m)。当然,由于本题n较小,也可以不进行差分,时间复杂度o(n),空间复杂度o(n)。
讲一下具体的思路。首先如果我们每棵树都没有浇水的话,m天后每棵树高度都为m。如果m是奇数的话,我们找到浇水次数为偶数的树的个数即可,反之找到浇水次数奇数的树个数即可,统计这一件事就需要用到差分。对于每个区间,我们可以在l[i]打上一个+1的标志,在r[i]打上一个-1的标志,然后用sum一边遍历数组一边记录数组的前缀和,在某一棵树的位置sum的值就是这棵树浇水的次数,统计一下其中奇数偶数的个数即可。下面给出不离散化的代码:
int a[20000005];
class Solution {
public:
/**
* 返回m天后高度为奇数的树的数量
* @param n int整型
* @param m int整型
* @param l int整型vector
* @param r int整型vector
* @return int整型
*/
int oddnumber(int n, int m, vector<int>& l, vector<int>& r) {
// write code here
for(int i=0;i<m;i++)a[l[i]]++,a[r[i]+1]--;
int ans=0,sum=0;
for(int i=1;i<=n;i++)
{
sum+=a[i];
if(sum%2)ans++;
}
if(m%2)return n-ans;
return ans;
}
};
京公网安备 11010502036488号