12.16 - 全排列 && C语言中声明和定义的区别

目录

1.全排列

a.核心思想

b.思路

c.步骤

2.C语言中声明和定义的区别

a.核心区别

b.场景对比

c.关键规则

d.特殊情况


1.全排列

46. 全排列 - 力扣(LeetCode)https://leetcode.cn/problems/permutations/

cpp 复制代码
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.场景对比

|-----|-------------------------------|--------------------------------------------------|
| 类型 | 声明 | 定义 |
| 变量 | extern int global;(不分配内存) | int global = 0;(分配内存+初始化) |
| 函数 | double add(double, double); | double add(double a, double b) { return a+b; } |
| 结构体 | struct Point;(不完整类型声明) | struct Point { int x, y; };(完整类型定义) |
| 数组 | extern int arr[10]; | int arr[10] = {0}; |

c.关键规则

唯一性: 定义只能出现一次(如全局变量、函数体),声明可多次(如头文件中的extern)。

内存 **分配:**定义必然分配内存,声明不分配(除非定义时隐含声明)。

初始化: 带初始化的变量声明(如int a=5;)本质是定义;extern声明不可初始化。

头文件作用: 头文件通常存放声明(函数原型、extern变量),源文件存放定义(函数实现、变量初始化)。

d.特殊情况

结构体/联合体: 声明(如struct S;)需后续定义才能使用成员;定义(如struct S { int x; };)直接创建完整类型。

匿名结构体: struct { int x; } var;同时完成声明与定义,无法复用类型。

函数参数: 形参列表中的变量名仅是声明(如void func(int a);),不分配内存。

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

感谢大家的三连支持!

相关推荐
linweidong3 小时前
C++ 模块化编程(Modules)在大规模系统中的实践难点?
linux·前端·c++
半桔8 小时前
【IO多路转接】高并发服务器实战:Reactor 框架与 Epoll 机制的封装与设计逻辑
linux·运维·服务器·c++·io
HABuo9 小时前
【linux文件系统】磁盘结构&文件系统详谈
linux·运维·服务器·c语言·c++·ubuntu·centos
我在人间贩卖青春9 小时前
C++之多重继承
c++·多重继承
颜酱9 小时前
图结构完全解析:从基础概念到遍历实现
javascript·后端·算法
m0_7369191010 小时前
C++代码风格检查工具
开发语言·c++·算法
yugi98783810 小时前
基于MATLAB强化学习的单智能体与多智能体路径规划算法
算法·matlab
DuHz10 小时前
超宽带脉冲无线电(Ultra Wideband Impulse Radio, UWB)简介
论文阅读·算法·汽车·信息与通信·信号处理
Polaris北极星少女10 小时前
TRSV优化2
算法
代码游侠11 小时前
C语言核心概念复习——网络协议与TCP/IP
linux·运维·服务器·网络·算法