Python是一种高级编程语言,它在机器学习、数据分析、Web开发等领域都有广泛的应用。与其他编程语言一样,Python也支持各种算法。本文将介绍5种常见的Python算法,包括查找算法、排序算法、递归算法、动态规划算法、贪心算法,并提供代码实例。
https://leetcode-cn.com/problems/triangle/
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数。
这道题实际上和 Leetcode 【DP、BFS】322. Coin Change 很相似。我们将 <= n 的平方数因子当作硬币种类数,n 当作需要换的零钱,则可以使用相同的方法,即 DP 和 BFS 来求解。
假设给你不同面额的硬币和一个金额amount。编写一个函数来计算构成该金额amount所需的最少数量的硬币。如果这笔钱不能由任何硬币组合成,则返回-1。
读完题目后发现:把两个字符串中多余的字符删除后,最后留下的字符串是两个字符串的最长公共子序列。因此这道题可以像最长公共子序列一样,采用动态规划的思想解决:常考的经典算法--最长公共子序列(LCS)与最长公共子串(DP)。
动态规划是一种用于解决复杂问题的优化技术,它通过将问题分解为子问题,并存储子问题的解来避免重复计算,从而提高算法的效率。
背包系列,是动态规划里一类典型的问题,主要有:01背包,完全背包,多重背包,混合背包,二维费用背包,分组背包,有依赖背包和泛化物品等。也就是常说的背包九讲。
Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate the number of 1's in their binary representation and return them as an array.
根据官网介绍:docker-drag 是一个用于与 Docker Hub 交互的工具,并且不需 Docker 客户端本身支持。它主要是通过与 Docker Hub 的 HTTPS API 进行交互来实现相应功能。
背包问题是在给定的一组物品中选择物品放入背包,使得物品的总价值最大化,同时限制背包的容量。
一个字符串的一个子序列是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。(例如,"ACE" 是 "ABCDE" 的一个子序列,而 "AEC" 不是)
https://leetcode-cn.com/problems/house-robber/
如果执行环境只能存储得下 32 位有符号整数,那么其数值范围为 (最高位为符号位),翻转时如果溢出请返回 0。
中文链接:https://leetcode-cn.com/problems/predict-the-winner/ 英文链接:https://leetcode.com/problems/predict-the-winner/
https://leetcode-cn.com/problems/minimum-falling-path-sum/
因为要找最长连续 1 子数组的长度,所以我们只需要遍历一次,记录每段连续 1 的长度;如果遇到 0,就更新当前最大长度,然后当前长度清零,继续向后遍历。时间复杂度为 O(n)。
容易想到用动态规划求解,dp[i][j] 存储累加到位置 (i, j) 的最小路径和。
给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。
如果使用常规方法,需要找规律得到每个位置变换后的位置,比较繁琐。一种巧妙的方法是将图像旋转 90° 等价于先将图像转置,然后再将每一行数字反转。因此,需要遍历两次 matrix,先转置再反转每一行,时间复杂度为 O(n)。
区间dp,顾名思义,在区间上dp,大多数题目的状态都是由区间(类似于dp[l][r]这种形式)构成的,就是我们可以把大区间转化成小区间来处理,然后对小区间处理后再回溯的求出大区间的值,主要的方法有两种,记忆化搜索和递推。
颜色排序。给一个 012 数组,0、1、2 分别代表红色、白色和蓝色,将数组升序排序。要求只能遍历数组一次,并使用常量级的空间。
https://leetcode-cn.com/problems/non-overlapping-intervals/
Multiple solutions of Fibonacci(Python or Java) Violence law(Top-down) It can be solved directly according to the known conditions (f (0) = 0, f (1) = 1 F(N) = F(N - 1) + F(N - 2), for N > 1) Python Code class Solution: def fib(self, N: int) -> int: if N =
python动态规划算法的使用过程 📷 使用过程 1、获取相应信息 (商品数量、背包容积、各商品体积和价值) 2、结构的最佳值矩阵。 3、初始化的最佳值矩阵 (上方和左侧留有空白矩阵作为后续运算,但没有结果) 4、根据商品之间的最佳价值公式计算出相应的结果。 5、逆向推导矩阵得到某个商品,或者没有安装。 输出结果。 实例 print('请输入待装物品数量和背包体积(空格隔开):') n, v = map(int, input().split()) # 获取物品数量和背包体积 goods = [] # 初
今天翻看了关于时间复杂度、空间复杂度的文章和视频,对其认知加深了些,之后也要养成分析复杂度的习惯,顺手添加,大家如果看到我写错的还望予以纠正。
这题需要分类讨论一下,如果原数为正数,那么就要获得最大的插入,反之,如果原数为负数,那么就要进行最小的插入。
这一题归根结底就是一个排序问题,唯一的考察点在于比较函数的写作上需要按照题目要求定制,但是也不难,直接按照题目要求给出就行了。
这段时间我会把蓝桥杯官网上的所有非VIP题目都发布一遍,让大家方便去搜索,所有题目都会有几种语言的写法,帮助大家提供一个思路,当然,思路只是思路,千万别只看着答案就认为会了啊,这个方法基本上很难让你成长,成长是在思考的过程中找寻到自己的那个解题思路,并且首先肯定要依靠于题海战术来让自己的解题思维进行一定量的训练,如果没有这个量变到质变的过程你会发现对于相对需要思考的题目你解决的速度就会非常慢,这个思维过程甚至没有纸笔的绘制你根本无法在大脑中勾勒出来,所以我们前期学习的时候是学习别人的思路通过自己的方式转换思维变成自己的模式,说着听绕口,但是就是靠量来堆叠思维方式,刷题方案自主定义的话肯定就是从非常简单的开始,稍微对数据结构有一定的理解,暴力、二分法等等,一步步的成长,数据结构很多,一般也就几种啊,线性表、树、图、再就是其它了。顺序表与链表也就是线性表,当然栈,队列还有串都是属于线性表的,这个我就不在这里一一细分了,相对来说都要慢慢来一个个搞定的。蓝桥杯中对于大专来说相对是比较友好的,例如三分枚举、离散化,图,复杂数据结构还有统计都是不考的,我们找简单题刷个一两百,然后再进行中等题目的训练,当我们掌握深度搜索与广度搜索后再往动态规划上靠一靠,慢慢的就会掌握各种规律,有了规律就能大胆的长一些难度比较高的题目了,再次说明,刷题一定要循序渐进,千万别想着直接就能解决难题,那只是对自己进行劝退处理。加油,平常心,一步步前进。
这一题其实就是利用性质:a xor a xor b = b,因此,我们对整个数组进行逆推即可。
第一题倒是一贯的挺简单的,最简单的思路就是直接做个二层循环就是了,不过我在比赛的时候想岔了,想着那样的算法复杂度恐怕有点高,就想着先将它转换为集合来处理,虽然也没啥问题,但是后来想想,完全没有对时间复杂度有所优化。
A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below).
这一题就比较简单,直接考察一下每一个单词是否是以是以目标的前缀开头的,然后记录一下个数就行了。
http://blog.csdn.net/u012102306/article/details/53184446 http://blog.csdn.net/hrn1216/article/details/51534607
https://leetcode-cn.com/problems/minimum-falling-path-sum-ii/
链接: https://leetcode.cn/problems/unique-paths/一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
首先,我们先排除掉两种特殊情况,一种是当给的时间过短,导致任何速度都无法准时到达的情况,另一种是给的时间过短,哪怕速度为1都能够准点到达的情况,最后,我们使用二分法即可确定最终的答案。
You are given coins of different denominations and a total amount of money amount. Write a function to compute the fewest number of coins that you need to make up that amount. If that amount of money cannot be made up by any combination of the coins, return -1.
最大可除子集。给一个包含不同数字的数组,找一个最大的子集,对于子集中的每个元素对 (Si, Sj) 满足 Si % Sj = 0 或者 Sj % Si = 0,返回这个子集。
https://leetcode-cn.com/problems/min-cost-climbing-stairs/
https://leetcode-cn.com/problems/longest-increasing-subsequence/
动态规划。令 dp[n][6*n],其中 dp[i][j] 表示前 i 个骰子产生点数 j 的次数。则 dp[-1][1...6*n] 就是每一种点数的次数。点数的总次数为 6^n,然后再求概率即可。状态转移方程很好找:dp[i][j] += dp[i-1][j-k],其中 k 为点数 1~6。时间复杂度为 O(n*(6*n)*6),空间复杂度为 O(n*(6*n))。
时间复杂度为:插入为 O(logn),计算中位数为 O(1);空间复杂度:O(n)。
要说吧,4道题也都做出来了,耗时老实说也没有特别长,不算错误惩罚的话其实也就56分钟,不到1个小时,整体虽然没有挤进国内前100,好歹也有前4%(116/3682),世界排名也是311/9290,也属于前4%,照说应该是一次不错的发挥了。
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, …)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
LeetCode 算法题,更像是披着编程语法外衣的数学题,很多典型的问题都有较优的解题思路与方法。之前我都是先尽力硬磕,几个小时肝出个解法,然后匆匆写一篇题记,观摩分析下更优的解法。但这个过程缺乏对更优解法的练习,再次遇到类似题目,首先想到的还是之前自己成功的那个思路,很难应用到本该学到的新的更优的解法。就好比曾经高考的数学题,想快速解决,看到题目就得有对应的最优解题思路。
鸡蛋掉落问题算是一道经典的算法题目了,leetcode上面也有收录,是被我收藏了的少数几道题目之一,确实是挺有意思的一道题目,李永乐老师也做过视频讲过这个问题。
这一题的思路还是比较简单的,只要先记录一下字符串当中的所有字符,然后按照字典序大小倒序遍历一下字符,看一下第一个大小写同时存在于字符串中的结果即可。
https://leetcode-cn.com/problems/integer-break/
领取专属 10元无门槛券
手把手带您无忧上云