剑指 Offer 04. 二维数组中的查找
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
迭代法:
def findNumberIn2DArray(self, matrix: List[List[int]], target: int) -> bool:
if matrix == []: return False
row = len(matrix)
col = len(matrix[0])
for i in range(row):
for j in range(col):
if matrix[i][j] == target:
return True
elif target < matrix[i][j]:
break
return False
指针:
def findNumberIn2DArray(self, matrix: List[List[int]], target: int) -> bool:
if matrix == []: return False
row = len(matrix)
col = len(matrix[0])
i, j = 0, 0
while i < row:
while (j < col) and (matrix[i][j] < target):
j += 1
if (j < col) and (matrix[i][j] == target):
return True
i += 1
j = 0
return False
Up主香辣鸡排蛋包饭的解法:
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
剑指 Offer 11. 旋转数组的最小数字
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的最小值为1。
暴力法:
def minArray(self, numbers: List[int]) -> int:
temp = numbers[0]
for i in numbers:
if i >= temp:
temp = i
else:
return i
return numbers[0]
二分查找:
def minArray(self, numbers: List[int]) -> int:
left, right = 0, len(numbers) - 1
while left < right:
mid = (left + right) // 2
if numbers[mid] < numbers[right]:
right = mid
elif numbers[mid] > numbers[right]:
left = mid + 1
else:
right -= 1
return numbers[left]
剑指 Offer 50. 第一个只出现一次的字符
在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。
哈希:
def firstUniqChar(self, s: str) -> str:
dic = {}
for i in s:
if i in dic.keys():
dic[i] += 1
else:
dic[i] = 1
for i in s:
if dic[i] == 1:
return i
return ' '
队列+哈希
def firstUniqChar(self, s: str) -> str:
position = dict()
q = collections.deque()
n = len(s)
for i, ch in enumerate(s):
if ch not in position:
position[ch] = i
q.append((s[i], i))
else:
position[ch] = -1
while q and position[q[0][0]] == -1 :
q.popleft()
return ' ' if not q else q[0][0]