【leetcode详解】特殊数组II : 一题代表了一类问题(前缀和思想)

 前缀和的优势

        给定一个数组,前缀和的特点在于,任意给出一对始末位置,能够用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;
    }
};

思路来源

本解法借鉴解题达人 @灵茶山艾府,膜拜大佬!

~希望对你有启发!~ 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值