前缀和的优势
给定一个数组,前缀和的特点在于,任意给出一对始末位置,能够用O(1)的时间复杂度得到始末位置之间所有元素的某种关系。
题型分析
这道题目正是“给出始末位置,检测其中元素特点”那一类,那我们就想,如果能够将这种 “元素关系” 与 “奇偶性交替的检验” 挂钩,便可大大提高检测效率。
可以说,本解法可推广解决几乎所有 判断给定区间元素是否恒满足某种关系 那一类需求。
核心部分解释:关于预处理
关于判断语句 (nums[i]%2 != nums[i-1]%2) 为什么可以用 int 型接收
由此就不难理解后面的判断:
- 若 prefix[ A ] = prefix[ B ]
- 则说明位置A, B间所有元素使 (nums[i]%2 == nums[i-1]%2) = 0
- 也就是均满足 (nums[i]%2 != nums[i-1]%2) = true
class Solution {
public:
vector<bool> isArraySpecial(vector<int>& nums, vector<vector<int>>& queries) {
vector<int>prefix(nums.size());//辅助数组,记录前缀和
for(int i=1; i<nums.size(); i++)
{
prefix[i] = prefix[i-1] + (nums[i]%2 == nums[i-1]%2);
}
vector<bool>ret;
for(auto p: queries)
{
ret.push_back(prefix[p[0]] == prefix[p[1]]);
}
return ret;
}
};
思路来源
本解法借鉴解题达人 @灵茶山艾府,膜拜大佬!
~希望对你有启发!~