剑指offer
1. 全排列
题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
示例1
输入
[3,32,321]
返回值
"321323"
# -*- coding:utf-8 -*-
"""
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,
打印能拼接出的所有数字中最小的一个
"""
import itertools #使用模块产生可迭代对象
class Solution(object):
def PrintMinNumber(self, numbers):
# write code here
assert len(numbers)>0 #
lis = []
for l in list(itertools.permutations(numbers)):#全排列迭代成元组
str0 = [str(i) for i in l] #l为元组类型转换成字符列表str0
l = ''.join(str0) #将字符数字连接成整体字符串
lis.append(int(l))#将字符l转换成整型存入到lis列表中
return min(lis)#返回lis列表中的最小值
# -*- coding:utf-8 -*-
import itertools
class Solution:
def PrintMinNumber(self, numbers):
if len(numbers)==0:
return ""
if len(numbers)==1:
return numbers[0]
res=[]
for i in numbers:
res.append(str(i))
temp = list(set(map("".join, itertools.permutations(res))))
return str(min(temp))
join()
:连接字符串数组。将字符串、元组、列表中的元素以指定的字符(分隔符)连接生成一个新的字符串
map(function, iterable, ...)
会根据提供的函数对指定序列做映射。第一个参数 function
以参数序列中的每一个元素调用 function 函数,返回包含每次 function
函数返回值的新列表。
2. 斐波那契数列
斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)
0、1、2、3、5、8、
#1、递归方法,python调试过程中速度太慢没有通过
class Solution:
def Fibonacci(self,n):
if n<=1:
return n
else:
return self.Fibonacci(n-1)+self.Fibonacci(n-2)
#2、利用for循环语句与数列的方法进行运算,将数列加入列表中,并对最后一个元素进行返回。
class Solution:
def Fibonacci(self, n):
num = []
for i in range(n+1): #最后1个数字不包含
if i == 0:
num.append(0)
elif i == 1:
num.append(1)
else:
num.append(num[-1]+num[-2])
return num[-1] #list[-1]表示最后一个元素,list[-2]表示倒数第二个元素
3. 最大连续子序列
输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为 O(n).
示例1
输入:
[1,-2,3,10,-4,7,2,-5]
复制
返回值:
18
输入的数组为{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2},因此输出为该子数组的和 18。
设dp[i]为以下标i元素结尾的最大和
递推式:dp[i]=max(dp[i-1]+array[i],array[i])
初始状态 dp[0]=array[0]
思路就是:如果该元素之前的最大和加上当前元素值 小于 当前元素,那就从当前元素重新开始计算,否则按两者加和作为此处的最大和。
最后得到的dp数组中最大的那一个,就是答案。
class Solution:
def FindGreatestSumOfSubArray(self, array):
# write code here
dp = [0]*len(array)
dp[0] = array[0]
#或直接拷贝一份:dp = array[:],修改dp不会修改array
for i in range(1,len(array)): #因为有i-1,所以要从1开始循环
dp[i] = max(dp[i-1] + array[i], array[i])
return max(dp)
4. 跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
f(0)=0,f(1) = 1, f(2) = 2, f(3) = 3, f(4) = 5… 可以总结出f(n) =f(n-1) +f(n-2)的规律
class Solution:
def jumpFloor(self, number):
# write code here
num = []
for i in range(number+1): #最后1个数字不包含
if i == 0:
num.append(0)
elif i == 1:
num.append(1)
elif i == 2:
num.append(2)
else:
num.append(num[-1]+num[-2])
return num[-1] #list[-1]表示最后一个元素,list[-2]表示倒数第二个元素
5. 二维数组遍历
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
[
[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]
]
给定 target = 7,返回 true。
给定 target = 3,返回 false。
class Solution: