数据结构与算法
文章平均质量分 64
现实、狠残酷
数据分析,供应链计划。
展开
-
动态规划详解Python
它通常用于优化问题,其中问题可以被分解成一系列重叠子问题,通过存储并重复使用已经解决过的子问题的解,可以避免重复计算,从而提高算法的效率。问题:有一个数组,求其中两个数x,y,满足x的索引小于y的索引,使得 x-y 最大。例如 arr = [3,7,2,6,4,1,9,8,5], 最大回撤是6,对应的x=7,y=1。例如:arr = [1,5,-10,2,5,-3,2,6,-3,1]. 输出为:12。动态规划算法通常具有较高的时间复杂度,但通过存储已解决的子问题的解,可以大大减少重复计算,提高算法效率。原创 2023-06-28 23:44:16 · 4844 阅读 · 0 评论 -
经典算法-两数之和、三数之和
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i!= k ,同时还满足 nums[i] + nums[j] + nums[k] == 0。给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。思路2:利用哈希表,存储{val:index},遍历列表判断,判断哈希表中是否有“target-nums[i]”的key。你可以按任意顺序返回答案。原创 2023-06-28 23:19:00 · 120 阅读 · 0 评论 -
贪心算法详解
在贪心算法中,我们从问题的初始状态开始,通过每一步的选择来逐步构建解决方案,直到达到最终目标。贪心算法的关键在于如何定义局部最优解,并证明通过每一步选择局部最优解最终可以达到全局最优解。如果可以确保通过贪心选择得到的解决方案是全局最优的,那么贪心算法通常是一种高效的求解方法,因为其简单性和高效性。然而,贪心算法并不适用于所有问题,因为在某些情况下,贪心选择可能导致局部最优解无法达到全局最优解。因此,在使用贪心算法解决问题时,需要仔细分析问题的特性,并验证贪心选择是否能够得到正确的解。原创 2023-06-26 08:57:51 · 2129 阅读 · 0 评论 -
查找算法-Python代码
二分查找要求数据集是有序的。它通过重复将数据集分成两半,并根据目标元素与中间元素的大小关系来确定目标元素在哪一半中。二分查找的时间复杂度为O(log n),其中n是数据集的大小。查找算法是计算机科学中的一种常见算法,用于在数据集合中查找指定的元素或确定元素是否存在。它们的目标是通过有效地比较元素来最小化查找的时间复杂度。线性查找是最简单的查找算法之一。它从数据集的起始位置开始逐个比较元素,直到找到目标元素或遍历完整个数据集。线性查找的时间复杂度为O(n),其中n是数据集的大小。原创 2023-06-24 22:12:04 · 621 阅读 · 0 评论 -
冒泡排序、选择排序、插入排序
排序过程没有不相邻的元素对位交换。排序过程不是相邻的两位交换。排序过程都是相邻的两位交换。原创 2023-06-24 17:16:12 · 368 阅读 · 0 评论 -
归并排序详解-附Python代码
合并前:# 定义合并函数,将两个有序序列合并为一个有序序列 def merge(lst , left , mid , right) : """思路:定义一个列表merged,循环比较两个有序序列的首元素大小,并放入临时空列表。原创 2023-06-24 15:36:10 · 415 阅读 · 0 评论 -
快速排序-详解附Python代码
定义归位函数,每次将首元素归位并返回对应的序号 def partition(lst , left , right) : """思路:定义left、right指针,首先将left指针的值传给temp,至此left指针”空缺“。while(左右指针没有相遇):(1)从right指针开始移动寻找比temp小的值,放到left所指的”空缺“。完成后right”空缺“(2)从left指针开始移动寻找比temp大的值,放到right所指的”空缺“。完成后left”空缺“原创 2023-06-23 22:24:01 · 905 阅读 · 0 评论 -
递归算法(三)- 回溯法Backtracking
回溯法回溯法Backtracking(找所有的可能)递归:类似枚举,一层一层向下递归,尝试搜索答案。找到答案: => 返回答案,并尝试别的可能未找到答案: => 返回上一层递归,尝试别的可能实战给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。注意:在设计算法时,要谨记我们之前所说的递归四要素:接收的参数返回值终止条件递归拆解:如何递归下一层class Sol原创 2021-07-09 09:48:06 · 207 阅读 · 0 评论 -
递归算法(二)-分治法
分治法分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。即一种分目标完成程序算法,简单问题可用二分法完成。分治法解题的一般步骤:分解,将要解决的问题划分成若干规模较小的同类问题;求解,当子问题划分得足够小时,用较简单的方法解决;合并,按原问题的要求,将子问题的解逐层合并构成原问题的解。实现方法:分治法一般是通过递归调用实现的。例如排序算法(快速排序,归并排序),傅里叶变换(快速傅里叶变换)等。分治法原创 2021-07-08 10:57:25 · 1825 阅读 · 0 评论 -
递归算法(一)递归概念与思路
递归的概念程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。我会写先介绍递归的基本思想,然后再以后的文章中介绍一下递归的衍生算法,比如:回溯算法、分治法、DFS等。设计递归的思路通常我们一提到递归就立马想到了递归的两个重要部分:原创 2021-07-07 11:53:16 · 2386 阅读 · 0 评论 -
数据结构-堆(heap)最大堆、最小堆的相关操作和实战
堆(heap)堆的概念:是完全二叉树;每个节点 >= 或 <= 孩子节点。条件二中分别对应:最大堆和最小堆。最大堆:最大值为堆顶元素,每个节点 >= 孩子节点。最小堆:最小值为堆顶元素,每个节点 <= 孩子节点。python中的堆python中只能直接创建最小堆。如果想要创建最大堆可以先将所有元素乘负一(取反),然后最小堆化,取元素的时候再取反,这样相当于得到最大堆。应用:top – K、第K个最大值,每次可以取出最大(最小元素)堆化:把一组无序的原创 2021-07-02 11:50:41 · 1027 阅读 · 0 评论 -
二叉树的遍历—广度优先(BFS)和深度优先(DFS)python实现
二叉树二叉树(Binary tree)是树形结构的一个重要类型。对于二叉树的基础知识这里不做过多介绍,下面我们直接介绍二叉树的遍历方式和如何用python代码去实现二叉树的遍历。二叉树的遍历(重点)“前”、“中”、“后“是相对根节点来说的深度优先DFS(递归实现)先序遍历:根节点——左子树——右子树中序遍历:左子树——根节点——右子树 后序遍历:左子树——右子树——根节点广度优先BFS(配合队列一起实现)层序遍历(广度优先):代码实现注意:在层序遍历的时候我用的队列是引入了coll原创 2021-07-01 11:15:18 · 504 阅读 · 0 评论 -
滑动窗口最大值-leetcode 239题
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/sliding-window-maximum解法一:暴力法:解题思路:移动窗口计算每一个窗口的最大值将步骤1得到的值加入要返回的列表中class Solution: def maxSlidingWi原创 2021-06-29 11:51:14 · 102 阅读 · 0 评论 -
python实现辗转相除法求最大公约数和最小公倍数
辗转相除法数学原理辗转相除法也称欧几里得算法,是用来求两个正整数的最大公约数的算法。接下来我们用实例来解释一下。假如我们需要求12和21的最大公约数,用辗转相除法是这样实现的:21 / 12 = 1 (余 9)12 / 9 = 1(余 3)9 / 3 = 3 (余 0)至此,得到21与12的最大公约数为3(注意:这里的3是第二个式子取余得到的3,而非最后一个式子相除得到的),然后把两个数相乘再除以最大公约数就可以得到最小公倍数:(21*12)/ 3 = 84python代码实现接下来我们用原创 2021-05-14 15:58:51 · 5454 阅读 · 0 评论 -
下一个更大元素 leetcode-496
给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。请你找出 nums1 中每个元素在 nums2 中的下一个比其大的值。nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1 。示例:方法一:双栈解题思路:定义两个stack, stack1存num2, stack2作为temp存stack1 pop出来的值默认max=-1 top= stack1.pop(原创 2021-06-30 14:37:19 · 99 阅读 · 0 评论