- 博客(43)
- 收藏
- 关注
原创 PythonBase01
1944年,美籍匈牙利数学家冯·诺依曼提出计算机基本结构。五大组成部分:运算器、控制器、存储器、输入设备、输出设备。– 运算器:按照程序中的指令,对数据进行加工处理。– 控制器:根据程序需求,指挥计算机的各个部件协调工作。通常将运算器和控制器集成在中央处理器(CPU)中。– 存储器:保存各类程序的数据信息。内存RAM – 容量小,速度快,临时存储数据硬盘HDD – 容量大,速度慢,永久存储数据输入设备:外界向计算机传送信息的装置。例如:鼠标、键盘、扫描仪…
2024-10-29 14:54:34
964
1
原创 认知觉醒读书笔记
学习的目的是为了改变。反思的最终目的是改变,而不是形式的完美,所以哪怕只有一句话,且这句话让自己发生了改变,那么反思的目的也就达到了。二是尽量提炼认知点或行动点。不要沉溺于情绪释放或碎碎念。因为反思的最终目的是改变,所以要尽可能提炼出具体可操作的认知点和行动点,以指导未来的生活,否则很容易让反思变成日记,效果大打折扣。三是列行动清单。当反思足够多的时候,很多行动点就容易被遗忘,这时,建立一个行动清单非常有必要:把最重要的行动点单列出来,时不时地看一眼,可以保证我们能持续地行动下去。
2024-09-16 23:03:56
1177
原创 leetcode203.移除链表元素
题目信息题意:删除链表中等于给定值 val 的所有节点。示例 1: 输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5]示例 2: 输入:head = [], val = 1 输出:[]示例 3: 输入:head = [7,7,7,7], val = 7 输出:[]
2024-08-21 16:31:22
764
原创 707.设计链表
可以说这五个接口,已经覆盖了链表的常见操作,是练习链表操作非常好的一道题目。下面采用的设置一个虚拟头结点(这样更方便一些,大家看代码就会感受出来)。
2024-08-21 16:30:08
666
原创 leetcode206.反转链表
关键是初始化的地方,可能有的同学会不理解, 可以看到双指针法中初始化 cur = head,pre = NULL,在递归法中可以从如下代码看出初始化的逻辑也是一样的,只不过写法变了。为什么要保存一下这个节点呢,因为接下来要改变 cur->next 的指向了,将cur->next 指向pre ,此时已经反转了第一个节点了。最后,cur 指针已经指向了null,循环结束,链表也反转完毕了。递归法相对抽象一些,但是其实和双指针法是一样的逻辑,同样是当cur为空的时候循环结束,不断将cur指向pre的过程。
2024-08-21 16:29:02
636
原创 卡码网58.区间和
第一行输入为整数数组 Array 的长度 n,接下来 n 行,每行一个整数,表示数组的元素。如上图,如果我们要求 区间下标 [2, 5] 的区间和,那么应该是 p[5] - p[1],而不是 p[5] - p[2]。如果,我们想统计,在vec数组上 下标 2 到下标 5 之间的累加和,那是不是就用 p[5] - p[1] 就可以了。而 p 数组是我们之前就计算好的累加和,所以后面每次求区间和的之后 我们只需要 O(1) 的操作。前缀和的思想是重复利用计算过的子数组之和,从而降低区间查询需要累加计算的次数。
2024-08-20 16:37:34
384
原创 Leetcode 59.螺旋矩阵II
*给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。示例:输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ]]
2024-08-20 15:56:11
590
原创 209.长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
2024-08-18 15:31:54
869
原创 27. 移除元素
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。示例 1: 给定 nums = [3,2,2,3], val = 3, 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。
2024-08-18 14:57:06
422
原创 二分 查找
二分法是非常重要的基础算法,为什么很多同学对于二分法都是一看就会,一写就废?其实主要就是对区间的定义没有理解清楚,在循环中没有始终坚持根据查找区间的定义来做边界处理。区间的定义就是不变量,那么在循环中坚持根据查找区间的定义来做边界处理,就是循环不变量规则。本篇根据两种常见的区间定义,给出了两种二分法的写法,每一个边界为什么这么处理,都根据区间的定义做了详细介绍。相信看完本篇应该对二分法有更深刻的理解了
2024-08-18 14:39:31
925
原创 学 习 观
认为记忆是学习老师和家长总是告诉我们要好好学习,可从没有人告诉过我们什么是学习,学习和记忆的区别又是什么,以至于很多人误以为记忆就是学习。小学vs初中或许你曾有过疑问,为什么小学你经常拿满分,但到了初中后拿满分却越来越难,并非你没有努力,也不是因为难度不同,而是因为前后所运用的是两种不同的能力。
2024-08-15 23:27:41
773
原创 15 贪心
贪心算法(greedy algorithm)是一种常见的解决优化问题的算法,其基本思想是在问题的每个决策阶段,都选择当前看起来最优的选择,即贪心地做出局部最优的决策,以期获得全局最优解。贪心算法简洁且高效,在许多实际问题中有着广泛的应用。贪心算法和动态规划都常用于解决优化问题。它们之间存在一些相似之处,比如都依赖最优子结构性质,但工作原理不同。我们先通过例题“零钱兑换”了解贪心算法的工作原理。这道题已经在“完全背包问题”章节中介绍过,相信你对它并不陌生。
2024-08-15 16:56:04
738
原创 14 动态规划
动态规划(dynamic programming)是一个重要的算法范式,它将一个问题分解为一系列更小的子问题,并通过存储子问题的解来避免重复计算,从而大幅提升时间效率。在本节中,我们从一个经典例题入手,先给出它的暴力回溯解法,观察其中包含的重叠子问题,再逐步导出更高效的动态规划解法给定一个共有 n 阶的楼梯,你每步可以上 1 阶或者 2 阶,请问有多少种方案可以爬到楼顶?如图 14-1 所示,对于一个 3 阶楼梯,共有 3 种方案可以爬到楼顶。本题的目标是求解方案数量,。
2024-08-15 16:54:39
1037
原创 13 回溯
回溯算法(backtracking algorithm)是一种通过穷举来解决问题的方法,它的核心思想是从一个初始状态出发,暴力搜索所有可能的解决方案,当遇到正确的解则将其记录,直到找到解或者尝试了所有可能的选择都无法找到解为止。回溯算法通常采用“深度优先搜索”来遍历解空间。在“二叉树”章节中,我们提到前序、中序和后序遍历都属于深度优先搜索。接下来,我们利用前序遍历构造一个回溯问题,逐步了解回溯算法的工作原理。给定一棵二叉树,搜索并记录所有值为 7 的节点,请返回节点列表。
2024-08-15 16:49:01
727
原创 汉诺塔问题
在归并排序和构建二叉树中,我们都是将原问题分解为两个规模为原问题一半的子问题。然而对于汉诺塔问题,我们采用不同的分解策略给定三根柱子,记为AB和C。起始状态下,柱子AC` 上,并保持它们的原有顺序不变(如图 12-10 所示)。在移动圆盘的过程中,需要遵守以下规则。2. 每次只能移动一个圆盘。。例如 f(3) 代表将 3 个圆盘从A移动至C的汉诺塔问题。
2024-08-15 15:59:29
762
原创 12 分治
分治(divide and conquer),全称分而治之,是一种非常重要且常见的算法策略。分治通常基于递归实现,包括“分”和“治”两个步骤。如图所示,“归并排序”是分治策略的典型应用之一。
2024-08-15 15:58:04
681
原创 10.3 二分查找边界
numstarget回忆二分查找插入点的方法,搜索完成后 i 指向最左一个targettarget。考虑通过查找插入点的函数实现查找左边界。请注意,数组中可能不包含target,这种情况可能导致以下两种结果。
2024-08-14 14:51:34
415
原创 10.1 二分查找
二分查找(binary search)是一种基于分治策略的高效搜索算法。它利用数据的有序性,每轮缩小一半搜索范围,直至找到目标元素或搜索区间为空为止。numstarget我们先初始化指针 i=0 和 j=n−1 ,分别指向数组首元素和尾元素,代表搜索区间 [0,n−1]。请注意,中括号表示闭区间,其包含边界值本身。接下来,循环执行以下两步。nums[m]targettargettargettarget值得注意的是,由于 i 和 j 都是int类型,int。
2024-08-14 14:27:32
780
原创 09 图
图(graph)是一种非线性数据结构,由顶点(vertex)和边(edge)组成。我们可以将图 G 抽象地表示为一组顶点 V 和一组边 E 的集合。以下示例展示了一个包含 5 个顶点和 7 条边的图。如果将顶点看作节点,将边看作连接各个节点的引用(指针),我们就可以将图看作一种从链表拓展而来的数据结构。如图 所示,,因而更为复杂。
2024-08-13 15:28:52
870
原创 8.1 堆
堆(heap)是一种满足特定条件的完全二叉树,主要可分为两种类型,如图 8-1 所示。小顶堆(min heap):任意节点的值 ≤ 其子节点的值。大顶堆(max heap):任意节点的值 ≥ 其子节点的值。堆作为完全二叉树的一个特例,具有以下特性。最底层节点靠左填充,其他层的节点都被填满。我们将二叉树的根节点称为“堆顶”,将底层最靠右的节点称为“堆底”。对于大顶堆(小顶堆),堆顶元素(根节点)的值是最大(最小)的。
2024-08-13 14:59:25
732
原创 07 树
二叉树(binary tree)是一种非线性数据结构,代表“祖先”与“后代”之间的派生关系,体现了“一分为二”的分治逻辑。与链表类似,二叉树的基本单元是节点,每个节点包含值、左子节点引用和右子节点引用。每个节点都有两个引用(指针),分别指向左子节点(left-child node)和右子节点(right-child node),该节点被称为这两个子节点的父节点(parent node)。
2024-08-12 16:52:44
1117
原创 6.3 哈希算法
前两节介绍了哈希表的工作原理和哈希冲突的处理方法。然而无论是开放寻址还是链式地址,。如果哈希冲突过于频繁,哈希表的性能则会急剧劣化对于链式地址哈希表,理想情况下键值对均匀分布在各个桶中,达到最佳查询效率;最差情况下所有键值对都存储到同一个桶中,时间复杂度退化至 O(n)。。
2024-08-12 16:11:07
778
原创 6.2 哈希冲突
上一节提到,,因此理论上哈希冲突是不可避免的。比如,输入空间为全体整数,输出空间为数组容量大小,则必然有多个整数映射至同一桶索引。哈希冲突会导致查询结果错误,严重影响哈希表的可用性。为了解决该问题,每当遇到哈希冲突时,我们就进行哈希表扩容,直至冲突消失为止。此方法简单粗暴且有效,但效率太低,因为哈希表扩容需要进行大量的数据搬运与哈希值计算。为了提升效率,我们可以采用以下策略。哈希表的结构改良方法主要包括“链式地址”和“开放寻址”。
2024-08-12 16:01:21
1101
原创 6.1哈希表
哈希表(hash table),又称散列表,它通过建立键key与值value之间的映射,实现高效的元素查询。具体而言,我们向哈希表中输入一个键key,则可以在 O(1) 时间内获取对应的值value。如图 6-1 所示,给定 n 个学生,每个学生都有“姓名”和“学号”两项数据。假如我们希望实现“输入一个学号,返回对应的姓名”的查询功能除哈希表外,数组和链表也可以实现查询功能。
2024-08-12 15:33:45
750
原创 C++提高编程
学习目标:vector中存放自定义数据类型,并打印输出//自定义数据类型public:mAge = age;//存放对象//创建数据it!= v.end();it++) {//放对象指针//创建数据it!= v.end();test02();return 0;
2024-08-11 16:41:59
547
原创 01C++核心编程
*作用:**函数名可以相同,提高复用性同一个作用域下函数名称相同函数参数类型不同或者个数不同或者顺序不同函数的返回值不可以作为函数重载的条件//函数重载需要函数都在同一个作用域下cout << "func 的调用!" << endl;cout << "func (int a) 的调用!" << endl;cout << "func (double a)的调用!" << endl;cout << "func (int a ,double b) 的调用!" << endl;
2024-08-11 16:40:59
797
原创 c++ 入门基础
所谓数组,就是一个集合,里面存放了相同类型的数据元素**特点1:**数组中的每个数据元素都是相同的数据类型**特点2:**数组是由连续的内存位置组成的数据类型 数组名[ 数组长度 ];数据类型 数组名[ 数组长度 ] = { 值1,值2 ...};数据类型 数组名[ ] = { 值1,值2 ...};示例//定义方式1//数据类型 数组名[元素个数];//利用下标赋值//利用下标输出//第二种定义方式//数据类型 数组名[元素个数] = {值1,值2 ,值3 ...};
2024-08-11 16:18:53
309
原创 5.2 队列
队列(queue)是一种遵循先入先出规则的线性数据结构。顾名思义,队列模拟了排队现象,即新来的人不断加入队列尾部,而位于队列头部的人逐个离开。我们将队列头部称为“队首”,尾部称为“队尾”,将把元素加入队尾的操作称为“入队”,删除队首元素的操作称为“出队”
2024-08-09 14:31:38
740
原创 04 数组与链表
列表(list)是一个抽象的数据结构概念,它表示元素的有序集合,支持元素访问、修改、添加、删除和遍历等操作,无须使用者考虑容量限制的问题。在列表尾部添加元素的时间复杂度为 O(1) ,但插入和删除元素的效率仍与数组相同,时间复杂度为 O(n)。如果我们希望扩容数组,则需重新建立一个更大的数组,然后把原数组元素依次复制到新数组。在复杂的系统环境中,程序难以保证数组之后的内存空间是可用的,从而无法安全地扩展数组容量。值得注意的是,由于数组的长度是固定的,因此插入一个元素必定会导致数组尾部元素“丢失”
2024-08-08 19:27:37
706
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人