classSolution: deffib(self,n:int)->int: if(n>1): return self.fib(n-1)+self.fib(n-2) else: return n
爬楼梯问题(70)
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
例如:输入:2
输出:2 有两种方法:一阶一阶上,或者跨两阶直接上
输入:3
输出:3 有三种方法:一阶一阶上、先跨两阶后一阶、先一阶后两阶
1 2 3 4 5 6 7 8 9
classSolution: defclimbStairs(self, n: int) -> int: dp = [1, 1 ,2] if n <=2: return dp[n] for i in range(3,n+1): dp.append(dp[i-1] + dp[i-2]) return dp[n]
变形1:爬楼梯的方法
每次你可以爬 1 或 3个台阶。你有多少种不同的方法可以爬到楼顶呢?
1 2 3 4 5 6 7 8 9
classSolution: defclimbStairs(self, n: int) -> int: dp = [1, 1 ,2] if n <=2: return dp[n] for i in range(3,n+1): dp.append(dp[i-1] + dp[i-3]) return dp[n]
变形2:不能去指定层数或者指定倍数的层数
不能经过指定的楼层数,或者指定倍数(比如5的倍数的层数或者7的倍数的层数)
在楼层前加if,符合条件则置空
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
classSolution: defclimbStairs(self, n: int) -> int: dp = [1, 1 ,2] if n <=2: return dp[n] for i in range(3,n+1): ##假设指定层数为4 if i == 4: dp.append(0) ##假设指定不能经过5的倍数 elif i % 5 == 0: dp.append(0) else dp.append(dp[i-1] + dp[i-2]) return dp[n]
classSolution: defisPowerOfFour(self,n:int)->bool: if n == 0: returnFalse if n == 1: returnTrue if n % 4 == 0: return self.isPowerOfFour(n/4); returnFalse
classSolution: defgenerate(self, numRows: int) -> List[List[int]]: result = [] for i in range(numRows): now = [1]*(i+1) if i >= 2: for n in range(1,i): now[n] = pre[n-1]+pre[n] result += [now] pre = now return result
杨辉三角2(119)
给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。
例:输入:3
输出:[1,3,3,1]
1 2 3 4 5 6 7 8 9
classSolution: defgetRow(self, rowIndex: int) -> List[int]: res = [1] for i in range(1, rowIndex // 2 + 1): res.append(res[-1] * (rowIndex + 1 - i) // i) if rowIndex % 2: return res + res[::-1] else: return res[:-1] + res[::-1]
classSolution: defnumDupDigitsAtMostN(self, N: int) -> int: L = list(map(int, str(N + 1))) res, n = 0, len(L) defA(m, n): return1if n == 0else A(m, n - 1) * (m - n + 1)
for i in range(1, n): res += 9 * A(9, i - 1) s = set() for i, x in enumerate(L): for y in range(0if i else1, x): if y notin s: res += A(9 - i, n - i - 1) if x in s: break s.add(x) return N - res
classSolution: defatMostNGivenDigitSet(self, digits: List[str], n: int) -> int: N = str(n) n = len(N) res = sum(len(digits) ** i for i in range(1, n)) i = 0 while i < n: res += sum(c < N[i] for c in digits) * (len(digits) ** (n - i - 1)) if N[i] notin digits: break i += 1 return res + (i == n)
旋转数字(788)
我们称一个数 X 为好数, 如果它的每位数字逐个地被旋转 180 度后,我们仍可以得到一个有效的,且和 X 不同的数。要求每位数字都要被旋转。
classSolution: defrotatedDigits(self, N: int) -> int: res=0 for i in range(1,N+1): s=str(i) if'3'in s or'4'in s or'7'in s :continue if'2'in s or'5'in s or'6'in s or'9'in s:res+=1 return res
classSolution: defnumberOfArithmeticSlices(self, nums: List[int]) -> int: n=len(nums) dp=[0]*n for i in range(2,n): if nums[i]-nums[i-1]==nums[i-1]-nums[i-2]: dp[i]=dp[i-1]+1 return sum(dp)
classSolution: defgenerate(self, numRows: int) -> List[List[int]]: nums = [ [0] * (i+1) for i in range(numRows)] for i in range(len(nums)): for j in range(len(nums[i])): if j == 0or j == i: nums[i][j] = 1 else: nums[i][j] = nums[i-1][j-1]+nums[i-1][j] return nums
给定非负索引k,返回杨辉三角第k行
1 2 3 4 5 6 7
classSolution: defgetRow(self, rowIndex: int) -> List[int]: row = [1for _ in range(rowIndex+1)] # 先生成一个目标行元素的列表 for i in range(2,rowIndex+1): # 从第3行开始dp for j in range(i-1,0,-1): # 从后往前,保证O(n)空间 row[j] = row[j-1]+row[j] return row
a = len(s) i = 0 count = 1 while i <= (a/2) if s[i]== s[a-i-1]: count = 1 i += 1 else: count = 0 break if count == 1 print('是回文序列') else print('不是回文序列')
//函数 s = input() a = reversed(list(s)) if list(a)=list(s) print('是回文序列') else print('不是回文序列')
classSolution(object) defrestoreIpAddress(self,s): defdfs(s,segment,res,ip): if segment = 4: if s == '': res.append(ip[1:]) return for i in range(1,4): if i <= len(s): if (ints[:i]) <= 255: dfs(s[i:],segment+1,res,ip+'.'+s[:i]) if s[0] == '0': break res = [] dfs(s,0,res,'') return res if _name_ == '_main_': S = Solution() s = '25525511135' S.restoreIpAddress(s)
有效括号(20)
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效括号的原则:
1.左括号必须由相同类型的右括号闭合
2.右括号必须以正确的顺序闭合左括号
比如
输入:s=”()”
输出:true
输入:s=”{[}]”
输出:false
大神做法(思路巧妙,复杂度较复杂)
1 2 3 4 5 6 7
classSolution: defisValid(self,s): while'{}'in s or'()'in s or'[]'in s s = s.replace('{}','') s = s.replece('()','') s = s.replace('[]','') return s == ''
复杂度较低的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
classSolution: defisValid(self, s: str) -> bool: stack = [] for item in s: if item == '(': stack.append(')') elif item == '[': stack.append(']') elif item == '{': stack.append('}') elifnot stack or stack[-1] != item: returnFalse else: stack.pop() returnTrueifnot stack elseFalse
classSolution: defgenerateParenthesis(self, n: int) -> List[str]: ans = [] deff(l, r, s): l == r == n and ans.append(s) l < n and f(l + 1, r, s + '(') r < l and f(l, r + 1, s + ')') f(0, 0, '') return ans
最长有效括号(32)
给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
输入:s=“(()”
输出:2,最长有效子串是()
输入:s=“)()())”
输出:4,最长有效子串是()()
使用栈或者动态规划解决
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
classSolution: deflongestValidParentheses(self, s: str) -> int: length = len(s) if length == 0: return0 dp = [0] * length for i in range(1,length): #当遇到右括号时,尝试向前匹配左括号 if s[i] == ')': pre = i - dp[i-1] -1; #如果是左括号,则更新匹配长度 if pre>=0and s[pre] == '(': dp[i] = dp[i-1] + 2 #处理独立的括号对的情形 类似()()、()(()) if pre>0: dp[i] += dp[pre-1] return max(dp);
classSolution: defstrStr(self, haystack: str, needle: str) -> int: if haystack == needle: return0 for i in range(0, len(haystack)+1): if needle in haystack[0:i]: return i - len(needle) return-1
比较版本号(165)
给你两个版本号version1和version2,比较。
返回信息:
如果version1>version2,返回1
如果version1<version2,返回-1
除此之外返回0
比较的方式:
比较版本号时,从左到右依次比较修订号,比较时忽略任何前导0,也就是修订号1和001相同
例:输入:version1=”1.01”,version2=”1.001”
输出:0,规则为忽略前导0,所以相同
输入:version1=”1.0.1”,version2=”1”
输出:1
1 2 3 4 5 6 7 8 9 10 11 12 13
classSolution: defcompareVersion(self,version1:str,version2:str)->int: v1 = version1.split(".") v2 = version2.split(".") while v1 or v2 x = int(v1.pop(0)) if v1 else0 y = int(v2.pop(0)) if v2 else0 if x > y return1 elif x < y return-1 return0
classSolution: defwordBreak(self,s:str,wordDict:list[str])->bool: ifnot s: returnTrue breakp = [0] for i in range(len(s)+1): for j in breakp: if s[j:i] in wordDict: breakp.append(i) break return breakp[-1] ==len(s)