1.30 - 子集 && 死锁的原因

目录

[1. 子集](#1. 子集)

a.核心思想

b.思路

c.步骤

2.死锁的原因


1. 子集

78. 子集 - 力扣(LeetCode)https://leetcode.cn/problems/subsets/description/

cpp 复制代码
class Solution {
public:
    void backtrack(vector<int>& nums, int index, vector<int>& subset, vector<vector<int>>& result) {
        if (index == nums.size()) 
        {
            result.push_back(subset);
            return;
        }
        subset.push_back(nums[index]);
        backtrack(nums, index + 1, subset, result);
        subset.pop_back();
        backtrack(nums, index + 1, subset, result);
    }

    vector<vector<int>> subsets(vector<int>& nums) {
        vector<vector<int>> result;
        vector<int> subset;
        backtrack(nums, 0, subset, result);
        return result;
    }
};class Solution {
public:
    void backtrack(vector<int>& nums, int index, vector<int>& subset, vector<vector<int>>& result) {
        if (index == nums.size()) 
        {
            result.push_back(subset);
            return;
        }
        subset.push_back(nums[index]);
        backtrack(nums, index + 1, subset, result);
        subset.pop_back();
        backtrack(nums, index + 1, subset, result);
    }

    vector<vector<int>> subsets(vector<int>& nums) {
        vector<vector<int>> result;
        vector<int> subset;
        backtrack(nums, 0, subset, result);
        return result;
    }
};

a.核心思想

通过递归的方式生成所有可能的子集。对于数组中的每一个元素,都有两种选择:将其包含在子集中或不包含。通过不断递归处理剩余元素,可以生成所有子集。

b.思路

使用回溯法,从数组的第一个元素开始,对于每个元素,先将其加入当前子集,然后递归处理下一个元素;递归返回后,将该元素从当前子集移除,再递归处理下一个元素(即不选择该元素的情况)。

c.步骤

① 初始化一个结果向量 result 用于存储所有子集,以及一个临时向量 subset 用于存储当前生成的子集。

② 定义一个回溯函数,该函数接受当前处理到的元素索引作为参数。

③ 在回溯函数中,如果当前索引等于数组长度,将当前子集加入结果向量并返回。

④ 否则,先将当前元素加入子集,递归调用回溯函数处理下一个元素;然后从子集中移除刚加入的元素,再次递归调用回溯函数处理下一个元素(不选择当前元素的情况)。

⑤ 调用回溯函数从索引0开始生成所有子集。

⑥ 返回结果向量。

2.死锁的原因

死锁的主要原因可以言简意赅地概括为以下四点:

互斥 **条件:**资源不能被共享,只能由一个进程占用。

**② 占有并等待:**进程在占有至少一个资源的同时,等待额外的资源。

**③ 非抢占条件:**已分配给进程的资源不能被强制释放,只能由进程自行释放。

**④ 循环等待:**存在一个进程等待循环链,每个进程都在等待下一个进程所占有的资源。

这四个条件同时满足时,就会导致死锁的发生。
死锁的原因可以总结为:**多个进程或线程因竞争资源而陷入相互等待的僵局,且都无法继续执行。**具体来说,是由于资源的分配和进程的推进顺序不当,导致进程间形成了相互依赖、相互等待的关系,且这种关系无法自行打破,从而使得系统陷入一种停滞状态。

简而言之,死锁就是"相互等待对方释放资源,导致都无法继续执行"的现象。

希望这些内容对大家有所帮助!

感谢大家的三连支持!

相关推荐
凡人叶枫3 小时前
Effective C++ 条款17:以独立语句将 newed 对象置入智能指针
java·linux·开发语言·c++·算法
凡人叶枫5 小时前
Effective C++ 条款16:成对使用 new 和 delete 时要采取相同形式
开发语言·c++·effective c++
菜鸟‍5 小时前
LeetCode 1 27 和 704 || 两数之和 移除元素 二分查找
算法·leetcode·职场和发展
不吃土豆的马铃薯5 小时前
C++ 高性能网络缓冲区 Buffer 源码解析
linux·服务器·开发语言·网络·c++
.千余6 小时前
【C++】C++继承入门(下):友元、静态成员与菱形继承的底层逻辑
开发语言·c++·笔记·学习·其他
初中就开始混世的大魔王6 小时前
6 Fast DDS-传输层
开发语言·c++·中间件·信息与通信
退休倒计时6 小时前
【每日一题】LeetCode 142. 环形链表 II TypeScript
算法·leetcode·链表·typescript
popcorn_min6 小时前
Digits 手写数字识别:随机森林多分类 + 像素级特征热力图
算法·随机森林·分类
liulilittle7 小时前
拥塞控制:排水终止的两种决策:OR 与 AND
网络·tcp/ip·计算机网络·算法·信息与通信·tcp·通信
weixin_307779138 小时前
从脚本执行到智能体协作:AI辅助测试能力的范式重构
运维·开发语言·人工智能·算法·测试用例