【Leetcode每日一题】 综合练习 - 找出所有子集的异或总和再求和(难度⭐)(68)

1. 题目解析

题目链接:1863. 找出所有子集的异或总和再求和

这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。

2.算法原理

算法思路与实现

为了求解给定整数数组的所有子集并将其异或和相加,我们可以采用递归的方式遍历所有可能的子集。由于每个元素都有两种选择------要么在子集中,要么不在,因此我们可以通过递归函数来模拟这个过程。

递归函数设计

我们定义一个递归函数dfs,该函数接受两个参数:当前正在处理的元素下标idx和待处理的整数数组nums。函数的作用是遍历所有可能的子集选择,并计算这些子集的异或和。

返回值

该函数没有直接的返回值,因为它通过修改全局变量(如一个累加器)来累计异或和。

函数作用

函数的主要作用是:

  1. 在每个递归层级,决定当前元素nums[idx]是否应包含在当前的子集状态中。
  2. 如果包含,更新当前子集的异或和(与nums[idx]进行异或运算)。
  3. 递归调用自身,处理下一个元素(idx+1)。
  4. 如果不包含,保持当前子集的异或和不变,并递归调用自身处理下一个元素。

递归流程

  1. 递归结束条件 :当idx等于数组nums的长度时,说明已经处理完所有元素,此时将当前子集的异或和累加到总和中,并结束递归。

  2. 包含当前元素 :在当前子集的异或和基础上,与nums[idx]进行异或运算,然后递归调用dfs(idx+1, nums)处理下一个元素。

  3. 不包含当前元素 :直接递归调用dfs(idx+1, nums)处理下一个元素,当前子集的异或和保持不变。

算法步骤

  1. 初始化一个变量来累计所有子集的异或和总和。
  2. 调用递归函数dfs(0, nums),从数组的第一个元素开始处理。
  3. 在递归函数中,根据递归结束条件、包含当前元素和不包含当前元素三种情况,分别处理并更新当前子集的异或和,以及递归调用自身。
  4. 递归结束后,返回累计的异或和总和作为结果。

注意

  • 由于异或操作满足交换律和结合律,因此不需要担心子集元素的顺序。
  • 为了避免重复计算,我们使用递归而不是迭代,因为递归能够清晰地表示出所有可能的子集选择。
  • 在递归过程中,通过更新全局变量或传递引用参数来累计异或和总和。

3.代码编写

cpp 复制代码
class Solution 
{
    int sum = 0;
    int path = 0;
public:
    int subsetXORSum(vector<int>& nums) 
    {
        dfs(nums, 0);
        return sum;
    }
    void dfs(vector<int> nums, int pos)
    {
        sum += path;
        for(int i = pos; i < nums.size(); i++)
        {
            path ^= nums[i];
            dfs(nums, i + 1);
            path ^= nums[i];
        }
    }
};

The Last

嗯,就是这样啦,文章到这里就结束啦,真心感谢你花时间来读。

觉得有点收获的话,不妨给我点个吧!

如果发现文章有啥漏洞或错误的地方,欢迎私信我或者在评论里提醒一声~

相关推荐
梓䈑1 小时前
【算法题攻略】BFS 解决FloodFill 算法、最短路问题、多源BFS 和 拓扑排序
c++·算法·宽度优先
Adios7944 小时前
设置交集大小至少为2
数据结构·算法·leetcode
程序喵大人6 小时前
【C++进阶】STL容器与迭代器 - 01 STL 容器先解决元素放在哪里
开发语言·c++·stl
野生风长10 小时前
C++入门基础:从命名空间到引用与指针的全面解析
开发语言·c++
来一碗刘肉面10 小时前
栈的应用(表达式求值)
数据结构·算法
xiaowang1234shs11 小时前
怪兽轻断食技术深度测评:从断食计时引擎到AI识别算法的工程实践解析
数据库·人工智能·算法·macos·机器学习·p2p·visual studio
小果因子实验室11 小时前
量化研究--策略迁移算法1研究
算法
Escalating_xu12 小时前
C++可变参数模板与引用折叠精讲
开发语言·c++
Web极客码12 小时前
如何用三段式确定性剪枝,为 LLM Agent 砍掉 35% 的 Token 成本?
服务器·人工智能·算法·机器学习