1442. 形成两个异或相等数组的三元组数目

本文针对LeetCode上的一道题目,给出了从三重循环到双重循环的优化过程,并提出了使用哈希表进一步优化的可能性。通过具体示例展示了如何减少循环次数以提高执行效率。

题目链接:leetcode.

暴力三重循环

/*
执行用时:176 ms, 在所有 C++ 提交中击败了13.02%的用户
内存消耗:7.5 MB, 在所有 C++ 提交中击败了30.23%的用户
*/
class Solution {
public:
    int countTriplets(vector<int>& arr) {
    	if(arr.empty())
    		return 0;
        int N = arr.size();
		vector<int> tmp(N, 0);
		tmp[0] = arr[0]; 
		for(int i = 1;i < N;++i)
		{
			tmp[i] = tmp[i - 1] ^ arr[i];
		}
		
		int ans = 0;
		for(int i = 0;i < N;++i)
		{
			for(int j = i + 1;j < N;++j)
			{
				int a = tmp[j - 1];
				if(i)
				{
					a ^= tmp[i - 1];
				}
				for(int k = j;k < N;++k)
				{
					int b = tmp[k] ^ tmp[j - 1];
					if(a == b)
						ans++;
				}
			}
		}
		return ans;
    }
};

tmp[i-1]^tmp[j-1] == tmp[j-1]^tmp[k]就是寻找 tmp[i-1] == tmp[k]
而在其中的j共有k-i个,都满足条件,将三重循环优化为两重循环

/*
执行用时:4 ms, 在所有 C++ 提交中击败了73.95%的用户
内存消耗:7.3 MB, 在所有 C++ 提交中击败了46.51%的用户
*/
class Solution {
public:
    int countTriplets(vector<int>& arr) {
    	if(arr.empty())
    		return 0;
        int N = arr.size();
		vector<int> tmp(N, 0);
		tmp[0] = arr[0]; 
		for(int i = 1;i < N;++i)
		{
			tmp[i] = tmp[i - 1] ^ arr[i];
		}
		
		int ans = 0;
		for(int i = 0;i < N;++i)
		{
			int a = 0;
			if(i) 
				a ^= tmp[i - 1];
			for(int k = i + 1;k < N;++k)
			{
				if(a == tmp[k])
					ans += k - i;
			}
		}
		return ans;
    }
};

还可以用哈希表降成一重循环,懒得看了hhhh

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值