1. 二维数组中的查找
在一个二维数组中(每个一维数组的长度雷同),每一行都依照从左到右递增的程序排序,每一列都依照从上到下递增的程序排序。请实现一个函数,输出这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思路
相似于二分查找,依据题目,如果拿数组中任意一个元素与指标数值进行比拟,如果该元素小于指标数值,那么指标数值肯定是在该元素的下方或右方,如果大于指标数值,那么指标数值肯定在该元素的上方或者左方。对于二分查找来说,每次比拟只能挪动一个指针,在二维数组的查找中,两个指针是一个高低方向挪动,一个是左右方向挪动。两个指针能够从同一个角登程。假如咱们从左上角登程,也就是 row=0 和 col=0,如果元素小于指标数值,咱们会将 row 往下移或着 col 往右移,这样,被屏蔽的区域可能会是指标元素所在的区域。比方 row+=1,那么第一行除左上角以外的元素就被忽略了,如果 col+=1,那么第一列出左上角以外的元素就被忽略了。因而这样是不可行的。所以本题从右上角登程寻找解题思路。
代码
# -*- coding:utf-8 -*-
class Solution:
# array 二维列表
def Find(self, target, array):
if array == []:
return False
m=len(array)-1
n=len(array[0])-1
i,j=0,n #本题的要点是想通这个终点,放在第一行最初一个数字
while i<=n and j>=0:
if array[i][j]>target:
j-=1
elif array[i][j]<target:
i+=1
else:
return True
return False
6. 旋转数组中的最小数字
一个递增排序的数组做了一次旋转,给你旋转后的数组,找到最小元素。输出 {3,4,5,1,2} 输入 1。
思路
两个办法:1. 遍历数组元素,如果前一个元素大于后一个元素,则找到了最小的元素。如果前一个始终小于后一个元素,阐明没有旋转,返回第一个元素。
2. 二分查找,如果两头元素位于递增元素,那么两头元素 > 最左边元素,最小元素在后半局部。否则,最小元素在前半部分。
class Solution:
def minNumberInRotateArray(self, rotateArray):
if not rotateArray:
return 0
minval=rotateArray[0]
for i in range(len(rotateArray)): # 不能间接 for i in len() 因为 int 类型须要加 range
if minval>rotateArray[i]:
minval=rotateArray[i]
return minval
6. 斐波那契数列
当初要求输出一个整数 n,请你输入斐波那契数列的第 n 项(从 0 开始,第 0 项为 0,第 1 项是 1)。
class Solution:
def Fibonacci(self, n):
if n<=0:
return 0
a=b=1
for i in range(2,n): # 因为前两个数曾经有了,就是 1,所以从第三个数开始须要 a +b
a,b=b,a+b # 这里不能写成 a=b b=a+b,如果写成这样,b 就不是前两位相加的值,而是曾经被 b 赋过值的 a 和 b 相加的值
return b
13. 调整数组程序使奇数位于偶数后面
输出一个整数数组,实现一个函数来调整该数组中数字的程序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半局部,并保障奇数和奇数,偶数和偶数之间的绝对地位不变。
# -*- coding:utf-8 -*-
class Solution:
def reOrderArray(self, array):
# write code here
if not array: return []
adv=[]
end=[]
for i in range(len(array)): # 也能够间接写成 for i in array: 则每个数字是 i
if array[i]%2==0:
end.append(array[i])
if array[i]%2==1:
adv.append(array[i])
return adv+end # 数组拼接,间接 +
19. 顺时针打印矩阵
输出一个矩阵,依照从内向里以顺时针的程序顺次打印出每一个数字,例如,如果输出如下 4 X 4 矩阵:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则顺次打印出数字 1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
# -*- coding:utf-8 -*-
class Solution:
# matrix 类型为二维列表,须要返回列表
def printMatrix(self, matrix):
# write code here
if not matrix: return []
result=[]
while(matrix):
result+=matrix.pop(0) # 把第一行取出来
if not matrix or not matrix[0]:
break
matrix=self.turn(matrix) # 把拿掉第一行当前残余还有数据的矩阵逆时针转 90 度
return result
def turn(self,matrix):
mid=[]
for i in range(len(matrix[0])):
midd=[]
for j in range(len(matrix)): # 外列外行,用来竖着革新这个矩阵
midd.append(matrix[j][i])
mid.append(midd)
mid.reverse() # 把列表外面的值从以后程序扭转为倒序
return mid