@Author:Runsen @Date:2020/7/3
人生最重要的不是所站的位置,而是内心所朝的方向。只要我在每篇博文中写得自己体会,修炼身心;在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰难,奋勇前行,不忘初心,砥砺前行,人生定会有所收获,不留遗憾 (作者:Runsen )
作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件。导致翘课严重,专业排名中下。.在大学60%的时间,都在。决定今天比昨天要更加努力。 前面文章,点击下面链接
我的Python教程,不断整理,反复学习
今日,我决定继续更新Python教程,今天就开始了七十四、Python | Leetcode数字系列(下篇)。
这一部分也是比较简单的,就当作Python编写代码的练习题。
这个题目的话,使用二分查找,left是1,high是数字x。就是一个二分查找,不懂二分查找的自己去搜索。每次去计算mid*mid与数字x的大小,如果比x大,那么就令high去等于mid-1;比x小,就令low等于mid+1;等于x,那么直接返回mid;
class Solution: def mySqrt(self, x: int) -> int: low = 0 high = int(x/2 + 1) while low <= high : mid = (low + high) // 2 if mid ** 2 == x : return mid elif mid ** 2 > x : high = mid - 1 elif mid ** 2 < x : low = mid + 1 return high还有一种方法是牛顿法, 利用一阶线性近似快速寻找最优点.。
X k + 1 = X k − Y k f ′ ( X k ) = 1 2 ( X k + a X k ) X_{k+1}=\frac{X_k-Y_k}{{f}'(X_k)}=\frac{1}{2}(X_k+\frac{a}{X_k}) Xk+1=f′(Xk)Xk−Yk=21(Xk+Xka)
class Solution: def mySqrt(self, x: int) -> int: if x < 2: return x r0 = x r1 = (r0 + x / r0) / 2 while abs(r0 - r1) >= 1: r0 = r1 r1 = (r1 + x / r1) / 2 return int(r1)利用集合的计数功能找到出现最多的元素并记录下来
import collections class Solution(object): def majorityElement(self, nums): k=collections.Counter(nums) [(i,j)]=k.most_common(1) return i # return sorted(nums)[len(nums)//2] #哈希表 class Solution(object): def majorityElement(self, nums): """ :type nums: List[int] :rtype: int """ d = {} for i in nums: d[i] = d.get(i,0) + 1 if d[i] >len(nums)/2: return i这是26进制转换为10进制问题,有两点:
就是进制转换的时候,最高位代表的是26的几次方以及其他的位谁乘这个26的几次方,这个通过A-B算出该为的数值。 class Solution: def titleToNumber(self, s: str) -> int: dct = {"A": 1, "B": 2, "C": 3, "D": 4, "E": 5, "F": 6, "G": 7, "H": 8, "I": 9, "J": 10, "K": 11, "L": 12, "M": 13, "N": 14, "O": 15, "P": 16, "Q": 17, "R": 18, "S": 19, "T": 20, "U": 21, "V": 22, "W": 23, "X": 24, "Y": 25, "Z": 26} return sum([26**i*dct[j] for i, j in enumerate(s[::-1])])将大写字母转成数字(差64),再按位置乘以26的次方(26个字母),累加。(相当于26进制数转十进制)也是一种做法。。
class Solution: def titleToNumber(self, s: str) -> int: # return ord("A") # A = 65 return sum( [(ord(s[i])-64) * 26 ** (len(s)-1-i) for i in range(len(s))])若 n = 2 x n = 2^x n=2x,,且 x x x为自然数(即 n为 2 的幂),则一定满足以下条件: 恒有 n&(n - 1) == 0,这是因为:n 二进制最高位为 1,其余所有位为 0;n - 1 二进制最高位为 0,其余所有位为 1;一定满足 n > 0。因此,通过n > 0且 n & (n - 1) == 0即可判定是否满足 n = 2 x n = 2^x n=2x
2^xnn - 1n & (n - 1) 2 0 2^0 2000010000(0001) & (0000) == 0 2 1 2^1 2100100001(0010) & (0001) == 0 2 2 2^2 2201000011(0100) & (0011) == 0 2 3 2^3 2310000111(1000) & (0111) == 0 class Solution: def isPowerOfTwo(self, n: int) -> bool: return n > 0 and n & (n - 1) == 0下面是动态规划的做法:
动态规划:因为要求完全平方数个数最少,设i的最少完全平方数为dp[i],用j表示完全平方数。那么dp[i]=dp[i-j]+1,因此可以使用动态规划。 问题的关键是n是由哪几个完全平方数组成最小,比如12:可以是dp[8]+dp[4],也可以是dp[3]+dp[9],用square构建完全平方数列表,用j在里面循环输出dp[i]最小值。 代码
状态DP:dp[i]:组成和为i的完全平方数的最少个数。 状态转移:dp[i] = min(dp[i],dp[i-j*j]+1) 初始化:最坏的结果是:i=1+1+…+1,故初始化为:[i for i in range(n+1)]
动态规划代码简洁, 但时间长
def numSquares(self, n: int) -> int: #动态规划 dp = [i for i in range(n+1)] for i in range(2,n+1): for j in range(int(i**0.5)+1): dp[i] = min(dp[i], dp[i-j*j]+1) return dp[n]]还有一种方法是广度优先搜索,就是BFS 算法。这个算法在以后再说。
刘润森! 认证博客专家 Python Java 前端 17年就读于东莞XX学院化学工程与工艺专业,GitChat作者。Runsen的微信公众号是"Python之王",因为Python入了IT的坑,从此不能自拔。公众号内容涉及Python,Java计算机、杂谈。干货与情怀同在。喜欢的微信搜索:「Python之王」。个人微信号:RunsenLiu。不关注我公号一律拉黑!!!