![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
文章平均质量分 74
天涯小才
这个作者很懒,什么都没留下…
展开
-
leetcode刷题(单调栈)
通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了,时间复杂度为O(n)。每日温度给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指在第 i 天之后,才会有更高的温度。如果气温在这之后都不会升高,请在该位置用 0 来代替。示例 1:输入: temperatures = [73,74,75,71,69,72,76,73]输出: [1,1,4,2,1,1,0,0]原创 2022-04-08 17:54:10 · 292 阅读 · 0 评论 -
leetcode刷题(贪心算法)
贪心的本质是选择每一阶段的局部最优,从而达到全局最优。例如,有一堆钞票,你可以拿走十张,指定每次拿最大的,最终结果就是拿走最大数额的钱。每次拿最大的就是局部最优,最后拿走最大数额的钱就是推出全局最优。反例:有一堆盒子,如何把体积为n的背包尽可能装满,如果还每次选最大的盒子,就不行了。这时候就需要动态规划。想清楚局部最优,想清楚全局最优,感觉局部最优是可以推出全局最优,并想不出反例,就先试一试贪心。分发饼干假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。原创 2022-03-28 13:03:45 · 817 阅读 · 0 评论 -
leetcode刷题(回溯算法)
组合给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案。示例 1:输入:n = 4, k = 2输出: [ [2,4], [3,4], [2,3], [1,2], [1,3],[1,4], ]# pythonclass Solution: def combine(self, n: int, k: int) -> List[List[int]]: res = [] .原创 2022-02-06 11:22:52 · 930 阅读 · 0 评论 -
leetcode刷题(二叉树)
二叉树的前序遍历# python# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None):# self.val = val# self.left = left# self.right = right原创 2021-12-25 10:04:06 · 139 阅读 · 0 评论 -
leetcode刷题(栈与队列)
用栈实现队列请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现 MyQueue 类:void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek()返回队列开头的元素boolean empty() 如果队列为空,返回 true ;否则,返回 false说明:你只能使用标准的栈操作 —— 也就是只有 push to top, peek/pop from to.原创 2021-11-16 09:23:57 · 215 阅读 · 0 评论 -
leetcode刷题(双指针法)
双指针法的题目大部分在前面数组和链表部分都做过了,这里只放对应的leetcode链接,打开就能看到自己前面写过的代码,当作复习。移除元素删除有序数组中的重复项移动零比较含退格的字符串有序数组的平方长度最小的子数组水果成篮最小覆盖子串反转字符串替换空格翻转字符串里的单词反转链表删除链表的倒数第N个结点链表相交环形链表II三数之和给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为原创 2021-11-05 15:42:07 · 88 阅读 · 0 评论 -
leetcode刷题(字符串)
反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。示例 1:输入:s = [“h”,“e”,“l”,“l”,“o”]输出:[“o”,“l”,“l”,“e”,“h”]示例 2:输入:s = [“H”,“a”,“n”,“n”,“a”,“h”]输出:[“h”,“a”,“n”,“n”,“a”,“H”]# pythonclass Solution:.原创 2021-11-04 23:26:48 · 542 阅读 · 0 评论 -
leetcode刷题(哈希表)
当我们遇到要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。如果题目遇到需要判断一个元素是否出现过的场景应该第一时间想到哈希法。有效的字母异位词给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。示例 1:输入: s = “anagram”, t = “nagaram”输出: true示例 2:输入: s = “rat”, t = “car”输出: false原创 2021-10-27 18:49:59 · 166 阅读 · 0 评论 -
leetcode刷题 (链表)
移除链表元素给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == 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输出:[]# python# Definition for singly-linked.原创 2021-10-23 22:35:11 · 150 阅读 · 0 评论 -
leetcode刷题 (数组——双指针)
移除元素移除元素给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。示例 1:输入:nums = [3,2,2,3], val = 3 输出:2, nums = [2,2]解释:函数应该返回新的长度 2, 并且nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如原创 2021-10-08 21:13:24 · 317 阅读 · 0 评论 -
leetcode刷题 (数组——二分查找)
二分查找二分查找给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。示例 1:输入: nums = [-1,0,3,5,9,12], target = 9 输出: 4解释: 9 出现在 nums 中并且下标为 4示例 2:输入: nums = [-1,0,3,5,9,12], target = 2 输出: -1解释: 2 不存在 nums 中因此返回 -1#原创 2021-09-18 15:12:03 · 481 阅读 · 0 评论 -
算法进阶 笔记2 (动态规划)
从斐波那契数列看动态规划斐波那契数列:0、1、1、2、3、5、8、13、21、34、……# 子问题的重复计算def fibnacci(n): if n == 1 or n == 2: return 1 else: return fibnacci(n-1) + fibnacci(n-2)# 动态规划(DP)的思想 = 最优子结构(递推式)+ 重复子问题def fibnacci_no_recurision(n): f = [0,1,1] if n > 2: for i i原创 2021-08-10 16:12:41 · 83 阅读 · 0 评论 -
算法进阶 笔记1 (贪心算法)
贪心算法贪心,顾名思义就是只考虑当前的利益,关注的是局部最优解。1、找零问题要找零376,贪心算法先从最大面额的100开始找,找不开再接着50,以此类推。t = [100, 50, 20, 5, 1]def change(t, n): m = [0 for _ in range(len(t))] for i, money in enumerate(t): m[i] = n // money n = n % money return m, nprint(change(t, 3原创 2021-07-01 11:33:11 · 129 阅读 · 0 评论 -
数据结构 学习笔记4(AVL树)
二叉搜索树的效率AVL树所谓平衡的意思就是左右子树的高度相差不能超过1,我们引入平衡因子的概念,定义平衡因子数值为左边的高度减去右边的高度,所以平衡因子都为-1,0,1的树就是平衡的。...原创 2021-06-30 10:14:36 · 111 阅读 · 1 评论 -
数据结构 学习笔记3(树、二叉树、二叉搜索树)
树与二叉树在算法的堆排序那里讲过树相关的一些概念,这里再回顾一下。节点的度为其孩子节点的个数,即节点分了几个杈。一棵树中,最大的节点的度称为树的度。树的实例——模拟文件系统class Node: def __init__(self,name,type='dir'): self.name = name self.type = type # "dir" or "file" self.children = [] self.parent = None # 链式存储 def __原创 2021-06-10 16:22:41 · 126 阅读 · 0 评论 -
数据结构 学习笔记2(链表、哈希表)
链表创建列表头插法创建新的节点,指向head节点,head指针重新指向插入的节点。尾插法不仅要考虑头节点,也要考虑尾节点,尾节点的next指针指向新插入的节点,尾节点的指针指向插入的节点。链表的遍历先判断链表lk是否为空,输出lk.item,然后指向下一个节点,以此遍历链表。# linklist.pyclass Node: def __init__(self, item): self.item=item self.next=Nonedef create_linklis原创 2021-06-09 16:26:07 · 189 阅读 · 0 评论 -
栈和队列的应用(迷宫问题)
栈和队列的应用(迷宫问题)栈——深度优先搜索一条路走到黑,假设我们规定判断的方向为上,右,下,左。从起点开始,判断能走的方向,一直走到没有路可以走了,这时,将走过的路径上所有点的坐标存放进一个栈里面,执行一次出栈操作,判断后退一步后的位置是否有路可走,没有则继续出栈。如果栈空,则说明没有可以抵达终点的路径。否则一直走到达终点,栈内的元素组成了能走出迷宫的路线。但是使用栈实现的迷宫问题有一个缺点,它的路线不一定是最短的。代码实现:maze = [ [1, 1, 1, 1, 1, 1, 1原创 2021-06-05 17:21:33 · 2495 阅读 · 0 评论 -
数据结构 学习笔记1(列表、栈、队列)
数据结构数据结构的分类数据结构有逻辑结构和物理结构,物理结构就是在计算机中如何表示的,这里我们只关注逻辑结构。树结构只能从父节点指向孩子结点,如果将孩子结点指向上级的结点就构成了图结构,图结构是多对多的关系。...原创 2021-06-04 21:14:57 · 97 阅读 · 1 评论 -
查找排序部分习题
查找排序相关面试题先将字符串转成列表,默认一个字母为一个元素,对s和t进行排序,判断排序后的列表是否相等。class Solution(object): def isAnagram(self, s, t): """ :type s: str :type t: str :rtype: bool """ ss = list(s) tt = list(t) ss.sort(原创 2021-05-30 11:08:26 · 82 阅读 · 0 评论 -
算法学习笔记4 计数排序、桶排序、基数排序
计数排序计数排序不是一个比较排序算法,该算法于1954年由 Harold H. Seward提出,通过计数将时间复杂度降到了O(N)。找出原数组中元素值最大的,记为max。创建一个新数组count,其长度是max加1,其元素默认值都为0。遍历原数组中的元素,以原数组中的元素作为count数组的索引,以原数组中的元素出现次数作为count数组的元素值。最后将count数组的索引值按个数append到result数组中,即可得到有序数组。计数排序代码实现:def count_sort(li, max原创 2021-05-16 23:25:40 · 141 阅读 · 0 评论 -
算法学习笔记3 希尔排序
希尔排序分组过程:总共有9个元素,d=9/2=4,把数据分成d=4组,每组相邻元素距离为4,如0-4-8。然后对每一组进行插入排序,排序完后放回原来位置,改变间隔d=2,再重新分组。插入排序完后再放回去,再将间隔改为d=1,直接插入排序得到最终有序的数据。排序过程演示:由此可知,每经过一趟,整体的数据越来越接近有序。代码实现:def insert_sort_gap(li,gap): for i in range(gap, len(li)): #i 表示摸到的牌的下标原创 2021-05-11 09:24:13 · 80 阅读 · 0 评论 -
算法学习笔记2 堆排序(topk问题)、归并排序、排序算法总结
堆排序——topk问题用内置的sort()函数排序,时间复杂度为O(nlogn),实际上还需加上切片的步骤k,但由于k<n,可以省略。将列表前5个元素取出来,建立一个小根堆,堆顶的1目前是第5大的数。接着取后面的元素0,0比1小故忽略,继续取元素7,7比1大,用7替换堆顶元素1,并且对堆进行向下调整。继续取剩下的4和5,替换堆顶元素并调整,最终倒序弹出堆顶就得到topk的值。topk问题代码实现:def sift(li, low, high): # 向下调整为小根堆,改变一下i原创 2021-05-07 18:01:10 · 289 阅读 · 0 评论 -
算法学习笔记1 递归、查找(顺序,二分)、排序(冒泡,选择,插入,快速,堆排序)
如何简单快速地判断算法复杂度:递归def func1(x): print(x) func1(x-1)def func2(x): if x>0: print(x) func2(x+1)虽然上面两个函数都调用了自身,但由于没有结束条件,故不是标准地递归。def func3(x): if x>0: print(x) func3(x-1)def func4(x): if x>0: func4(x-1) print(x)func3(3)输出原创 2021-05-07 15:49:04 · 248 阅读 · 0 评论