dedecms医院网站wap模板(橙色),证书兼职网,宣传片拍摄脚本,网站数据46.全排列
给定一个不含重复数字的数组 nums #xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
示例 1#xff1a;
输入#xff1a;nums [1,2,3]
输出#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2#xff1a;
输入#…46.全排列
给定一个不含重复数字的数组 nums 返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
示例 1
输入nums [1,2,3]
输出[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2
输入nums [0,1]
输出[[0,1],[1,0]]
思路详解我们可以让数组中的每一个数充当首元素然后使用dfs搜索数组中尚未被使用的元素依次排在首元素的后面直到所有元素都被使用过了我们就返回对应数组的结果集
代码详解
class Solution {
public:vectorvectorint ans;//定义存储结果集的数组vectorint combine;//定义存储当前组合的数组vectorboolused;//定义标记数组,用以记录数字是否被使用过vectorvectorint permute(vectorint nums) {usedvectorbool(nums.size());//初始化标记数组大小dfs(nums,0);//调用搜索函数return ans;}void dfs(vectorint nums,int index)//搜索函数{if(indexnums.size())//如果最后一个位置也被枚举完了就将当前组合加入{ans.push_back(combine);return;}for(int i0;inums.size();i)//否则继续查找是否有合适的数字{if(!used[i])//如果数字未被使用就加入{combine.push_back(nums[i]);used[i]true;//更新使用状态dfs(nums,index1);//搜索下一个位置used[i]false;//回溯combine.pop_back();//从当前组合中删除}}}
};
面经
什么是内存对齐为什么要这么做
在C中内存对齐是指数据在内存中的存放地址与它的自然边界即该数据大小的边界对齐的行为。在结构体或类中成员通常会按照其类型的最大对齐要求来对齐结构体或类的整体对齐方式通常是成员中最大对齐要求的最小公倍数。
struct Example {char a; // 占用1字节int b; // 占用4字节通常要求4字节对齐char c; // 占用1字节};// 在大多数系统上这个结构体的大小不是6字节而是12字节或更多因为
// a后面会有3个字节的填充以确保int类型的b是4字节对齐的。
// b后面会有3个字节的填充以确保整个结构体的大小是最大成员int的对齐要求通常是4字节的倍数。
为什么需要内存对齐
1. 性能优化 对齐的内存访问更高效。许多处理器在访问非对齐的数据时会降低系统整体性能因为它们可能需要多次内存访问来读取或 写入一个值或者有的处理器可能不支持非对齐访问这会导致程序运行时出错。
2. 硬件要求 某些硬件平台只能从特定地址开始读取特定类型的数据。例如32位的数据可能需要从4的倍数的地址开始。
3. 兼容性 当不同的编译器或者不同的硬件平台之间进行交互时保证数据结构是按照一定的规则对齐的可以确保二进制兼容性。
4. 数据对齐可能减少填充 在结构体和类中合理的内存对齐可以减少因对齐而引入的填充字节从而节省内存空间。