文章目录
一、爬楼梯
1,程序简介
-
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
-
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
- 输入: 2
- 输出: 2
- 解释: 有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶
示例 2:
- 输入: 3
- 输出: 3
- 解释: 有三种方法可以爬到楼顶。1. 1 阶 + 1 阶 + 1 阶2. 1 阶 + 2 阶3. 2 阶 + 1 阶
2,程序代码
# -*- coding: utf-8 -*-
"""
Created on Wed Dec 8 07:27:51 2021
Function:
@author: 小梁aixj
"""
class Solution(object):
def climbStairs(self, n):
if n <= 1:
return 1
dp = [1]*2
for i in range(2, n+1):
dp[1], dp[0] = dp[1]+dp[0], dp[1]
return dp[1]
#%%
s = Solution()
print(s.climbStairs(2))
3,运行结果
二、解码方法
1,程序简介
一条包含字母 A-Z 的消息通过以下映射进行了 编码 :
- ‘A’ -> 1’B’ -> 2…‘Z’ -> 26
- 要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,“11106” 可以映射为:
- “AAJF” ,将消息分组为 (1 1 10 6)
- “KJF” ,将消息分组为 (11 10 6)
- 注意,消息不能分组为 (1 11 06) ,因为 “06” 不能映射为 “F” ,这是由于 “6” 和 “06” 在映射中并不等价。
- 给你一个只含数字的 非空 字符串 s ,请计算并返回 解码 方法的 总数 。
- 题目数据保证答案肯定是一个 32 位 的整数。
示例 1:
- 输入:s = “12”
- 输出:2
- 解释:它可以解码为 “AB”(1 2)或者 “L”(12)。
示例 2:
- 输入:s = “226”
- 输出:3
- 解释:它可以解码为 “BZ” (2 26), “VF” (22 6), 或者 “BBF” (2 2 6) 。
示例 3:
- 输入:s = “0”
- 输出:0
- 解释:没有字符映射到以 0 开头的数字。含有 0 的有效映射是 ‘J’ -> “10” 和 ‘T’-> “20” 。由于没有字符,因此没有有效的方法对此进行解码,因为所有数字都需要映射。
示例 4:
- 输入:s = “06”
- 输出:0
- 解释:“06” 不能映射到 “F” ,因为字符串含有前导 0(“6” 和 “06” 在映射中并不等价)。
提示:
- 1 <= s.length <= 100
- s 只包含数字,并且可能包含前导零。
2,程序代码
# -*- coding: utf-8 -*-
"""
Created on Wed Dec 8 07:28:20 2021
Function:
@author: 小梁aixj
"""
class Solution(object):
def numDecodings(self, s):
ls = len(s)
if ls == 0:
return 0
dp = [0]*ls
for index in range(ls):
if index >= 1 and int(s[index-1:index+1]) < 27 and int(s[index-1:index+1]) >= 10:
if index == 1:
dp[index]=1
else:
dp[index] += dp[index-2]
if int(s[index]) != 0:
if index ==0:
dp[index]=1
else:
dp[index] += dp[index-1]
return dp[ls-1]
#%%
s = Solution()
print(s.numDecodings(s="12"))#2
3,运行结果
三、搜索旋转排序数组 ||
1,程序简介
- 已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同。
- 在传递给函数之前,nums 在预先未知的某个下k(0<=k<nums.length)上进行了 旋转 ,使数组变为[nums[k],nums[k+1], …, nums[n-1], nums[0], nums[1], …,nums[k-1]](下标 从 0 开始计数)。
- 例如,[0,1,2,4,4,4,5,6,6,7] 在下标 5处经旋转后可能变为[4,5,6,6,7,0,1,2,4,4] 。
- 给你 旋转后 的数组 nums 和一个整数 target ,请你编写一个函数来判断给定的目标值是否存在于数组中。如果 nums中存在这个目标值 target ,则返回 true ,否则返回 false 。
示例 1:
- 输入:nums = [2,5,6,0,0,1,2], target = 0
- 输出:true
示例 2:
- 输入:nums = [2,5,6,0,0,1,2], target = 3
- 输出:false
提示:
- 1 <= nums.length <= 5000
- -104 <= nums[i] <= 104
- 题目数据保证 nums 在预先未知的某个下标上进行了旋转
- -104 <= target <= 104
进阶:
- 这是 搜索旋转排序数组 的延伸题目,本题中的 nums 可能包含重复元素。
- 这会影响到程序的时间复杂度吗?会有怎样的影响,为什么?
2,程序代码
# -*- coding: utf-8 -*-
"""
Created on Wed Dec 8 07:28:31 2021
Function:
@author: 小梁aixj
"""
class Solution(object):
def search(self, nums, target):
def get(start, end):
if start > end:
return False
mid = (start + end)/2
mid = int(mid)
while mid < end and nums[mid+1] == nums[mid]:
mid += 1
while start < mid and nums[start+1] == nums[start]:
start += 1
if nums[mid] == target:
return True
elif mid ==end:
return get(start, mid-1)
elif start == mid:
return get(mid+1, end)
elif nums[mid] >= nums[start]:
if target >= nums[start] and target < nums[mid]:
return get(start, mid-1)
else:
return get(mid+1, end)
elif nums[mid] <= nums[end]:
if target > nums[mid] and target <= nums[end]:
return get(mid+1, end)
else:
return get(start, mid-1)
return get(0, len(nums)-1)
#%%
s=Solution()
print(s.search(nums=[2,5,6,0,0,1,2], target=0))#true
print(s.search(nums=[2,5,6,0,0,1,2], target=3))#false