Re: [闲聊] 每日leetcode

楼主: sustainer123 (caster)   2024-05-30 11:59:36
※ 引述《ray90514 ()》之铭言:
: 1442. Count Triplets That Can Form Two Arrays of Equal XOR
: xor sum i to j = xor sum 0 to j ^ 0 to i - 1
: xor sum i to j - 1 = sum 0 to j - 1 ^ 0 to i - 1 = j to k = 0 to k ^ 0 to j - 1
: 两边的xor sum 0 to j - 1可以消掉
: 所以找两个从0开始xor相等的就是i 跟k
: j是其中任意的数
: class Solution {
: public:
: int countTriplets(vector<int>& arr) {
: vector<int> v(arr.size());
: int sum = 0;
: int ans = 0;
: for(int i = 0; i < arr.size(); i++){
: v[i] = sum;
: sum ^= arr[i];
: for(int j = 0; j < i; j++){
: if(v[j] == sum){
: ans += i - j;
: }
: }
: }
: return ans;
: }
: };
思路:
题目要求寻找a == b
a == b可以换成 a^b == 0
a^b == 0 等于
arr[i] ^ arr[i + 1] ^ ... ^ arr[j - 1]^arr[j] ^ arr[j + 1] ^ ... ^ arr[k] == 0
我们先把arr[i]变成arr[i] ^ arr[i - 1] ^ ... ^ arr[0]
所以arr[i+1] ^= arr[i]
因为处理不到原本的arr[0] 所以开头插入0
假如arr[i] == arr[i+1] 代表
arr[i+1] ^ arr[i] ^ arr[i - 1] ^ ... ^ arr[0]等于0
所以相减加进res
Python Code:
class Solution:
def countTriplets(self, arr: List[int]) -> int:
res = 0
arr.insert(0,0)
for i in range(len(arr)-1):
arr[i+1] ^= arr[i]
for i in range(len(arr)):
for j in range(i+1,len(arr)):
if arr[i] == arr[j]:
res += j - i -1
return res
作者: Smallsh (Smallsh)   2024-05-30 12:03:00
大师
作者: devilkool (对猫毛过敏的猫控)   2024-05-30 12:12:00
你好聪明
作者: JIWP (JIWP)   2024-05-30 12:17:00
别卷了

Links booklink

Contact Us: admin [ a t ] ucptt.com