LeetCode 数据结构笔记(一)


前言

  笔者最近开始学习数据结构相关内容,在LeetCode上找到《图解算法数据结构》开啃,因为主要用C++所以主要学习C++方面的(其实是懒)
附原书作者:Krahets
链接:https://leetcode-cn.com/leetbook/read/illustration-of-algorithm/p57uhr/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

一、空间复杂度相关

Return会自动释放内存,循环中不写return会导致空间复杂度增高(困扰笔者很久了的问题)

栈帧空间:
程序调用函数是基于栈实现的,函数在调用期间,占用常量大小的栈帧空间,直至返回后释放。如以下代码所示,在循环中调用函数,每轮调用 test() 返回后,栈帧空间已被释放,因此空间复杂度仍为 O(1) 。
代码如下(示例):

int test() {
   
    return 0;//这里如果不加return空间复杂度是O(N)
}

void algorithm(int N) {
   
    for (int i = 0; i < N; i++) {
   
        test();
    }
}

二、快速排序

1.哨兵划分法

  1. 算法解析:
    快速排序算法有两个核心点,分别为 哨兵划分 和 递归 。

  2. 哨兵划分:
    以数组某个元素(一般选取首元素)为 基准数 ,将所有小于基准数的元素移动至其左边,大于基准数的元素移动至其右边。

  3. 递归:
    对 左子数组 和 右子数组 分别递归执行 哨兵划分,直至子数组长度为 1 时终止递归,即可完成对整个数组的排序。

如下图所示,为示例数组 [2,4,1,0,3,5] 的快速排序流程。观察发现,快速排序和 二分法 的原理类似,都是以 \loglog 时间复杂度实现搜索区间缩小。
在这里插入图片描述
代码如下(示例):

int partition(vector<int>& nums, int l, int r) {
   
    // 以 nums[l] 作为基准数
    int i = l, j = r;
    while (i < j) {
   
        while (i < j && nums[j] >= nums[l]) j--;
        while (i < j && nums[i] <= nums[l
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值