uncle_ll
这个作者很懒,什么都没留下…
展开
-
二分法的应用
二分法的相关应用介绍原创 2023-06-09 23:00:00 · 633 阅读 · 0 评论 -
数据结构与算法脑图
数据结构与算法脑图原创 2023-06-07 22:31:18 · 517 阅读 · 0 评论 -
数据结构与算法简介
研究一组有特定关系的数据的存储与处理通过抽象的方法。原创 2022-11-15 23:00:00 · 494 阅读 · 0 评论 -
算法-二分查找
现在我们来看一下二分查找二分查找的原理每次排除掉一半答案,使可能的答案区间快速缩小。二分查找log2(n)log_2(n)log2(n),因为每次询问会使可行区间的长度变为原来的一半。我们再来看一下二分查找的思路我们设定一个初始的L和R,保证答案在[L,R]中,当[L,R]中不止有一个数字的时候,取区间的中点M,询问这个中点和答案的关系,来判断答案是M,还是位于[L,M-1]中,还是位于[M+1,R]中。二分查找的伪代码如下intL=区间左端点;二分查找。...原创 2022-07-16 14:00:00 · 3369 阅读 · 0 评论 -
算法-递推
递推,意思就是用已经有的信息一点点推出想要知道的信息。显然,如果我们用人脑去模拟一个递推算法,是比较简单的,因为“根据已有信息推出未知信息”是我们常用的思考方式,符合直觉。如果用电脑运行递推算法,我们应该考虑使用循环。我们可以在循环的过程中使用数组和临时变量记录下来每一步递推的过程和结果。比如在刚刚的机器人例子中,我们可以使用数组来记录每一秒结束时机器人的具体位置,使用临时变量来记录机器人当前的朝向。这和我们使用人脑模拟递推算法的区别不大。比如,如果青蛙要从第一个石头跳到第五个石头,有以下五种可能的走法:张原创 2022-07-04 23:00:00 · 956 阅读 · 0 评论 -
算法-有序矩阵中找目标值
问题:题目大致意识是,给定一个有序的二维矩阵,然后给定一个目标值,想从这个有序矩阵中,找到这个目标值,如果没有找到的话,返回False, 找到返回True。该有序的二维矩阵,从左到右行有序,从上到下列有序:以上图为例,假设taget num是44,矩阵中的位置是第3行第3列,因此返回的是[3,3]。那么这个查找过程是怎样的呢?首先想法是暴力查找,每一个遍历,时间复杂度为O(n2)O(n^2)O(n2),没有利用好有序数组这一特性。但是我们观察规律,比如找到元素33时候,33...原创 2022-06-07 21:00:00 · 294 阅读 · 0 评论 -
数据结构基础介绍
数据结构程序=算法+数据结构,所以,掌握数据结构的关键是充分理解:每一种数据结构利用的是数据结构中怎样的关系;在不同操作上的优势劣势;以及常见的使用场景。常见的数据结构有数组、链表、栈、队列、树、图等:数组、链表、栈和队列都在描述数据的线性结构,而树和图分别描述数据的树形结构和图形结构。数据结构的逻辑结构 指的是数据元素之间的前后关系,与计算机的存储位置无关。逻辑结构通常分为以下几类:集合:数据结构中的元素属于“同属于一个集合”的关系,除此之外没有其他关原创 2022-04-16 20:40:22 · 576 阅读 · 0 评论 -
算法:数组
数组的定义数组的存储学习视频https://tianchi.aliyun.com/course/932/14631数组问题,如果想快的话 要是排序数组,使用双指针,二分查找法,哈希表法等例题两数之和给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。暴力查找class S原创 2022-02-15 19:50:43 · 220 阅读 · 0 评论 -
算法:哈希表
哈希表简介哈希表:也叫做散列表。是根据关键字和值(Key-Value)直接进行访问的数据结构。也就是说,它通过关键字 key 和一个映射函数 Hash(key) 计算出对应的值 value,然后把键值对映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做哈希函数(散列函数),用于存放记录的数组叫做 哈希表(散列表)。哈希表的关键思想是使用哈希函数,将键 key 和值 value 映射到对应表的某个区块中。可以将算法思想分为两个部分:向哈希表中插入一个关键字:哈希函数决定该关键字的对应值应原创 2022-03-25 21:01:13 · 2731 阅读 · 0 评论 -
算法:分治
分治分治是一种将大问题分解成相同任务的小问题的方法,常见的分治思想之一就是归并排序(mergeSort)归并排序归并排序在之前的排序章节中有讲解过,这里再回顾一下:给定一个无序列表:从中间将其分为左右两个子列表,两个字列表之后再进行分开,直到都子列表只剩下一个元素时候,然后再进行合并排序;伪代码如下:MERGE-SORT(A, p, r)if p < r q = p + (r-p)/2 MERGE-SORT(A, q+1, r) MERGE-SORT(A, p, q) ME原创 2022-03-23 00:04:55 · 368 阅读 · 0 评论 -
算法:动态规划
动态规划区间调度问题无权区间调度问题上面是一个按照时间段发生的任务a,b,c,d,e,f,g,h,有的任务之间会有时间重叠。定义:任务j开始于时间sjs_jsj, 结束时间为fjf_jfj如果两个任务没有重叠的时间(一个任务的结束时间小于另外一个任务的开始时间),则两个任务互相兼容目标:对于每个任务的权重都看作一样的,都一样重要。此时从上述任务中找到最多能互相兼容的任务集合。从上面可以看到,兼容最多的任务集合是{b, e, h}解决办法: 贪心算法贪心算法总是每一步做出当前最优原创 2022-03-20 15:50:15 · 512 阅读 · 0 评论 -
算法: 排序
记录排序排序简介排序:就是将一组无序的记录序列按照某种逻辑顺序重新排序,调整为有序的记录序列的过程。简单的说,对于一组记录序列而言,就是根据记录的关键字递增顺序或者递减关系,将记录的次序进行重新排列,使得原来一组次序任意的记录序列转变为按其值有序排列的一组记录序列。排序算法分类由于待排序的记录数量不同,使得排序过程中涉及的存储器不同,可将排序算法分为两大类:内部排序算法:当参加排序的数据量不大时,在排序过程中将全部记录存放在内存中处理,这种算法称为内部排序算法。外部排序算法:当参加排序的数原创 2022-03-15 22:36:43 · 601 阅读 · 0 评论 -
算法:搜索
搜索搜索相关的问题,可以有两类任务,查找和遍历。查找无序查找顺序查找二叉搜索树有序查找二分搜索遍历深度优先遍历(栈的应用)广度优先遍历(队列的应用)查找顺序搜索(Sequential Search)在无序记录集R0,R1,...,Rn−1R_0, R_1, ..., R_{n-1}R0,R1,...,Rn−1中搜索关键词为key的记录RiR_iRi在记录集中的位置i(0 <= i <= n - 1).它的查找过程是:从第一个开原创 2022-03-09 23:41:13 · 243 阅读 · 0 评论 -
算法:双指针
双指针双指针是一种思想或一种技巧并不是特别具体的算法。具体就是用两个变量动态存储两个结点,来方便我们进行一些操作。通常用在线性的数据结构中。特别是链表类的题目,经常需要用到两个或多个指针配合来记忆链表上的节点,完成某些操作。常见的双指针方式同速指针:链表上两个指针,一个先出发,另一个后出发并以相同的速度跟随。求链表的逆:通过临时指针让双指针同步前行求链表倒数第k个元素:先让其中一个指针向前走k步,接着两个指针以同样的速度一起向前进,直到前面的指针走到尽头了,则后面的指针即为倒数第k个元原创 2022-03-05 18:32:46 · 6795 阅读 · 1 评论 -
算法:位运算
位运算知识点介绍1.原码、反码和补码二进制有三种不同的表示形式:原码、反码和补码,计算机内部使用补码来表示。原码:就是其二进制表示(注意,有一位是符号位)00 00 00 11 -> 310 00 00 11 -> -3反码:正数的反码就是原码,负数的反码是符号位不变,其余位取反(对应正数按位取反)00 00 00 11 -> 3的反码11 11 11 00 -> -3的反码补码:正数的补码就是原码,负数的补码是反码+100 00 00原创 2022-03-04 00:10:37 · 1459 阅读 · 0 评论 -
算法:树结构
树树的定义与相关概念从链表与图开始讲起链表在之前的内容中我们学习了链表的这一基础数据结构,单链表是其中的一种,结构形式如下所示:# Definition for the singly-linked list.Class ListNod: def __init__(self, val=0, next=None): self.val = val self.next = next树结构其实跟单链表差不多,只不过其指针域有多个指针域单链表:一个数据域 + 一个指针域原创 2022-03-01 22:00:00 · 618 阅读 · 0 评论 -
算法:字符串
字符串字符串简介字符串:简称为串,是由零个或多个字符组成的有限序列。一般记为s=a1a2...ans=a_1a_2...a_ns=a1a2...an字符串名称:字符串定义中的s就是字符串的名称;字符串的值:a1a2...ana_1a_2...a_na1a2...an组成的字符串就是字符串的值,一般用双引号括起来;字符变量:字符串每一个位置上的元素都是一个字符变量。字符aia_iai可以是字母,数字或者其他字符。i是该字符在字符串中的位置;字符串的长度:字符串中字符的数目n成为字符原创 2022-02-27 12:08:15 · 991 阅读 · 0 评论 -
算法: 栈
栈(stack)简介简单来说,栈是一种 「后进先出(Last In First Out)」 的线性表,简称为 「LIFO 结构」。可以从两个方面来解释一下栈的定义:第一个方面是 「线性表」栈首先是一个线性表,栈中元素具有前驱后继的线性关系。栈中元素按照 a1a_1a1, a2a_2a2, … , ana_nan 的次序依次进栈。栈顶元素为ana_nan第二个方面是 「后进先出原则」根据堆栈的定义,每次删除的总是堆栈中当前的栈顶元素,即最后进入堆栈的元素。而在进栈时,最先进入堆栈的元原创 2022-02-20 00:27:57 · 2041 阅读 · 0 评论 -
算法:链表
例题解析原创 2022-02-17 19:42:10 · 811 阅读 · 0 评论 -
算法-列表-三数之和
问题Write a function that takes in a non-empty array of distinct integers and an integer representing a target sum. The function should find all triplets in the array that sum up to the target sum and return a two-dimensional array of all these triplets. T原创 2021-12-23 18:32:34 · 562 阅读 · 0 评论 -
算法-树-祖先树的公共父节点
问题You’re given three inputs, all of which are instances of a class that have an “ancestor” property pointing to their youngest ancestor. The first input is the top ancestor in an ancestral tree (i.e., the only instance that has no ancestor), and the othe原创 2021-12-20 21:58:59 · 982 阅读 · 0 评论 -
算法-树-反转二叉树
问题Write a function that takes in a Binary Tree and inverts it. In other words, the function should swap every left node in the tree for its corresponding (mirrored) right node. Each Binary Tree node has a value stored in a property called “value” and two原创 2021-12-17 19:09:38 · 1269 阅读 · 0 评论 -
算法-二叉搜索树的判断
问题给定一个二叉树,一个由二叉树节点组成的二叉树数据结构。每个二叉树节点都有一个整型值存储在名为“value”的属性中,两个子节点分别存储在名为“left”和“right”的属性中。子节点可以是二叉树节点本身,也可以是None(null)值。**编写一个函数,返回一个表示二叉树是否为有效BST的布尔值。**当且仅当一个节点满足BST属性时,才称其为BST节点:其值严格大于其左侧每个节点的值;其值小于或等于其右侧每个节点的值;它的两个子节点要么是BST节点本身,要么是None(null)值;原创 2021-11-15 18:55:14 · 1478 阅读 · 0 评论 -
算法-递归算法
递归算法递归函数是直接或间接地调用了自身的函数核心思想是分而治之,利用递归算法可以将一个规模较大的问题转化为规模较小的同类问题来求解注意同类问题n!例如:数学上常见的一个问题-计算一个非负整数n!计算n!,只要计算出(n-1)!,则n!=n.(n-1)!计算(n-1)!,只要计算出(n-2)!,则(n-1)!=(n-1)*(n-2)!计算(n-2)!,只要计算出(n-3)!,则(n-2)!=(n-2)*(n-3)!…计算3!,只要计算出2!,则3!=3*(2!)计算2!,只要计原创 2021-10-24 23:32:41 · 357 阅读 · 0 评论 -
算法-选择排序
选择排序给定一个无序数组,起始的时候将第一个元素看作是有序的,剩余右边部分看成是无需的。如果按照从小到大的顺序排序,则每个元素都去找元素之后元素中是否存在比它更小的元素,如果存在,交换二者位置。步骤如下:选定元素A(i)后,比较后续元素和A(i+1), A(i+2), … A(N-1)从中找到比A(i)元素更小的元素A(j), 如果存在这一的元素,则交换二者;对剩下的N-1个元素,按同样规则找后续最小的值,并交换位置,如法炮制,经过N-1趟的“选择处理”,每趟进行N-i次的比较,全部数列有序。原创 2021-10-17 16:49:10 · 98 阅读 · 0 评论 -
算法-冒泡排序
冒泡排序给定一个无序数组,通过两两比较大小互换位置完成排序的过程。步骤如下:两两比较相邻元素A(I)和A(I+1)(I=1,2,…N-1),如果A(I)>A(I+1),则交换A(I)和A(I+1)的位置;对剩下的N-1个元素,再两两进行比较,按同样规则交换它们的位置,经过N-2次比较,将次最大值交换到A(N-1)的位置;如法炮制,经过N-1趟的“冒泡处理”,每趟进行N-i次的比较,全部数列有序。假设给定的序列是[9, 8, 5, 4, 2, 0]将9换到左右边的示意图:算原创 2021-10-14 23:58:21 · 111 阅读 · 0 评论 -
算法-二叉树中俩节点的最近公共祖先
问题给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”样例例如给定上述二叉树结构, root = [6,2,8,0,4,7,9,null,null,3,5]节点 2 和节点 8 的最近公共祖先是 6思路对于树的结构问题一般考虑递归的方式去解决,本题也不例外。首先根节点肯定是二者的父节点,题目是去原创 2021-07-09 18:30:09 · 2323 阅读 · 0 评论 -
算法-构建二叉搜索树bst
构建二叉搜索树bstbinaryt search tree constructioninsertsearchdelete二叉查找树,根节点比所有左节点大,比右节点小构建一颗二叉搜索树,实现二叉搜索树的插入,搜索,删除操作insert假设是上面的那个树,要插入的元素是12根节点10比12小,因此根节点及左边部分不用修改,专注于右子树由于12比15小,因此专注于15节点的左子树,一直往下走,成为13节点的左节点。此时完成整个插入操作;search二叉查找树找元素,根据二叉查找树的原创 2021-06-10 19:11:11 · 974 阅读 · 0 评论 -
算法-二叉搜索树中找最接近的节点
问题:You are given a BST data structure consisting of BST nodes.Each BST node has an integer value stored in a property called "value" and two children nodes stored in properties called "left" and "right," respectively. A node is said to be a BST node i原创 2021-05-19 13:16:07 · 1049 阅读 · 0 评论 -
算法-二叉树BranchSums
二叉树路径和 branchSum问题:Write a function that takes in a Binary Tree and returns a list of its branch sums (ordered from leftmost branch sum to rightmost branch sum). A branch sum is the sum of all values in a Binary Tree branch. A Binary Tree branch is a pat原创 2021-04-28 19:09:53 · 183 阅读 · 0 评论 -
算法-斐波那契数列Fibonacci
斐波那契数列 Fibonacci斐波那契数列是这样的数列:0、1、1、2、3、5, 8、13、21、34 ……下一项是上两项的和。2 是上两项的和(1+1)3 是上两项的和(1+2)、5 是(2+3)、依此类推!更多有意思的介绍可以见参考链接;算法1. 直接递归初步想法就是采用递归的方式去实现 fib(n) = fib(n-1) + fib(n-2)def fib(n): if n == 1: return 0 if n == 2: return 1 return原创 2021-03-19 12:33:30 · 4079 阅读 · 0 评论 -
算法-二分查找binary search
二分查找要求是排好序的列表顺序算法流程先找到头跟尾端L 与 R, 再找到中间点,用中间点的值与查找进行比较:如果中间点值等于查找值,返回结果中间值下标位置;如果中间值大于查找值,向左移动右端点;如果中间值小于查找值,向右移动左端点;下面是上图的查找过程,查找值为33第一次:M表示中间 m = L + (R-L)//2 = 0 + 9//2 = 4M指示的值是45, 45比33大, 让R=M-1=3第二次M表示中间 m = L + (R-L)//2 =原创 2021-03-16 13:05:38 · 177 阅读 · 0 评论