LeetCode刷题记录
1.数组中重复的数字
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
解:
时间优先:用字典
空间优先:原地交换
#原地交换
class Solution:
def findRepeatnum(nums):
i = 0
while i < len(nums):
if nums[i] == i:
i += 1
continue
if nums[nums[i]] == nums[i]:
return nums[i]
nums[nums[i]], nums[i] = nums[i], nums[nums[i]] #temp = nums[nums[i]],nums[nums[i]] = nums[i],nums[i] = temp
nums[nums[i]] = nums[i];
nums[i] = temp;
return -1
#字典
class Solution:
def findRepeatnum(nums):
dict = {}
for num in nums:
if num not in dict:
dict[num] = 1
else:
return num
2.二维数组中的查找
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
题解:
可以把它看成是二叉树的搜索
#二叉树法
class Solution:
def findNumberIn2DArray(self, matrix: List[List[int]], target: int) -> bool:
i, j = len(matrix) - 1, 0
while i >= 0 and j < len(matrix[0]):
if matrix[i][j] > target: i -= 1
elif matrix[i][j] < target: j += 1
else: return True
return False
class Solution:
def findNumberIn2DArray(self, matrix: List[List[int]], target: int) -> bool:
if len(matrix)==0 or len(matrix[0])==0:
return False
n = len(matrix)
m = len(matrix[0])
"""
从右上角开始判断,如果右上角的数字比targrt大,删去所在列;反之,删去所在行,逐步逼近左下角
也可以从左下角开始判断,逐步逼近右上角
"""
row = 0
column = m-1
while row<=n-1 and column>=0:
if matrix[row][column] == target:
return True
elif matrix[row][column]>target:
column-=1
else:
row+=1
return False
#暴力法
class Solution:
def findNumberIn2DArray(self, matrix: List[List[int]], target: int) -> bool:
for i in range(len(matrix)):
for j in range(len(matrix[0])):
if matrix[i][j] == target:
return True
return False
注意:可能会报错 unconsistent tab… 意思就是不要把tab与空格混用,要一致。