目录
1.全排列
a.核心思想
b.思路
c.步骤
2.C语言中声明和定义的区别
a.核心区别
b.场景对比
c.关键规则
d.特殊情况
1.全排列
46. 全排列 - 力扣(LeetCode)https://leetcode.cn/problems/permutations/
class Solution { public: // 回溯算法核心实现 // start - 当前处理的起始位置 void backtrack(vector<int>& nums, int start, vector<vector<int>>& rev) { if (start == nums.size()) { rev.push_back(nums); return; } // 遍历从start到数组末尾的所有元素 for(int i = start; i < nums.size(); i++) { swap(nums[start], nums[i]); backtrack(nums, start+1, rev); swap(nums[start], nums[i]); } } vector<vector<int>> permute(vector<int>& nums) { vector<vector<int>> revv; backtrack(nums, 0, revv); return revv; } };a.核心思想
利用回溯算法,通过递归的方式生成所有可能的排列,在递归过程中通过交换元素的位置来生成不同的排列,当处理到数组末尾时,将当前排列加入结果集。
b.思路
回溯法是一种通过探索所有可能的候选解来找出所有解的算法。如果候选解被确认不是一个解(或者至少不是最后一个解),回溯算法会通过在上一步进行一些变化来丢弃该解,即“回溯”并尝试其他可能性。
c.步骤
① 定义一个递归函数,用于生成排列。
② 在递归函数中,从当前位置开始,依次将每个元素交换到当前位置。
③ 递归处理下一个位置。
④ 当处理到数组末尾时,将当前排列加入结果集。
⑤ 回溯,恢复数组原来的状态,以便进行下一次交换。
2.C语言中声明和定义的区别
a.核心区别
声明:告知编译器标识符(变量/函数/类型)的存在及类型,不分配内存。可多次出现(如头文件中的
extern声明)。
示例:
extern int a;(变量声明)、int func(int, int);(函数声明)。定义:分配内存并创建实体,可包含初始化(变量)或具体实现(函数)。同一作用域只能定义一次。
示例:
int a = 10;(变量定义)、int func() { return 0; }(函数定义)。
b.场景对比
类型 | 声明 | 定义 |
变量 |
|
|
函数 |
|
|
结构体 |
|
|
数组 |
|
|
c.关键规则
唯一性:定义只能出现一次(如全局变量、函数体),声明可多次(如头文件中的
extern)。内存分配:定义必然分配内存,声明不分配(除非定义时隐含声明)。
初始化:带初始化的变量声明(如
int a=5;)本质是定义;extern声明不可初始化。头文件作用:头文件通常存放声明(函数原型、
extern变量),源文件存放定义(函数实现、变量初始化)。
d.特殊情况
结构体/联合体:声明(如
struct S;)需后续定义才能使用成员;定义(如struct S { int x; };)直接创建完整类型。匿名结构体:
struct { int x; } var;同时完成声明与定义,无法复用类型。函数参数:形参列表中的变量名仅是声明(如
void func(int a);),不分配内存。
希望这些内容对大家有所帮助!
感谢大家的三连支持!