实习冲刺第三十六天

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搜索数组中尚未被使用的元素依次排在首元素的后面,直到所有元素都被使用过了,我们就返回对应数组的结果集

代码详解;

cpp 复制代码
class Solution {
public:
    vector<vector<int>> ans;//定义存储结果集的数组
    vector<int> combine;//定义存储当前组合的数组
    vector<bool>used;//定义标记数组,用以记录数字是否被使用过
    vector<vector<int>> permute(vector<int>& nums) {
        used=vector<bool>(nums.size());//初始化标记数组大小
        dfs(nums,0);//调用搜索函数
        return ans;
    }

    void dfs(vector<int>& nums,int index)//搜索函数
    {
        if(index==nums.size())//如果最后一个位置也被枚举完了就将当前组合加入
        {
            ans.push_back(combine);
            return;
        }
        for(int i=0;i<nums.size();i++)//否则继续查找是否有合适的数字
        {
            if(!used[i])//如果数字未被使用,就加入
            {
                combine.push_back(nums[i]);
                used[i]=true;//更新使用状态
                dfs(nums,index+1);//搜索下一个位置
                used[i]=false;//回溯
                combine.pop_back();//从当前组合中删除
            }
        }
    }
};

面经:

  1. 什么是内存对齐,为什么要这么做

在C++中,内存对齐是指数据在内存中的存放地址与它的自然边界(即该数据大小的边界)对齐的行为。在结构体或类中,成员通常会按照其类型的最大对齐要求来对齐,结构体或类的整体对齐方式通常是成员中最大对齐要求的最小公倍数。

cpp 复制代码
struct Example {
    char a;    // 占用1字节
    int b;     // 占用4字节,通常要求4字节对齐
    char c;    // 占用1字节

};

// 在大多数系统上,这个结构体的大小不是6字节,而是12字节或更多,因为:
// a后面会有3个字节的填充,以确保int类型的b是4字节对齐的。
// b后面会有3个字节的填充,以确保整个结构体的大小是最大成员int的对齐要求(通常是4字节)的倍数。

为什么需要内存对齐:

  1. 性能优化:

对齐的内存访问更高效。许多处理器在访问非对齐的数据时会降低系统整体性能,因为它们可能需要多次内存访问来读取或 写入一个值,或者有的处理器可能不支持非对齐访问,这会导致程序运行时出错。

  1. 硬件要求:

某些硬件平台只能从特定地址开始读取特定类型的数据。例如,32位的数据可能需要从4的倍数的地址开始。

  1. 兼容性:

当不同的编译器或者不同的硬件平台之间进行交互时,保证数据结构是按照一定的规则对齐的,可以确保二进制兼容性。

  1. 数据对齐可能减少填充:

在结构体和类中,合理的内存对齐可以减少因对齐而引入的填充字节,从而节省内存空间。

相关推荐
旖-旎1 分钟前
深搜练习(组合总和)(7)
c++·算法·深度优先·力扣
T0uken8 分钟前
基于 vcpkg 与 LLVM-MinGW 的 Qt6 静态链接开发方案
c++·windows·qt
睡一觉就好了。11 分钟前
C++11(一)
c++
小O的算法实验室12 分钟前
2026年ASOC,基于人工势场的差分进化算法改进框架,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
xieliyu.13 分钟前
Java手搓数据结构:从零模拟实现无头双向非循环链表
java·数据结构·链表
爱学习的张大17 分钟前
具身智能论文精读(五):OpenVLA
人工智能·算法
水云桐程序员27 分钟前
C++的主要应用场景
c++·学习方法
刘大猫.1 小时前
宝马发布全新AI智能座舱助手 能理解用户复杂出行需求
人工智能·算法·机器学习·ai·大模型·算力·ai智能座舱助手
如何原谅奋力过但无声1 小时前
【灵神高频面试题合集01-03】相向双指针、滑动窗口
数据结构·python·算法·leetcode
leoufung1 小时前
LeetCode 42:接雨水 —— 从“矩形法”到双指针的完整思考过程
java·算法·leetcode