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

被折叠的 条评论
为什么被折叠?



