# 在一个二维数组array中(每个一维数组的长度相同), # 每一行都按照从左到右递增的顺序排序, # 每一列都按照从上到下递增的顺序排序。 # 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 # 数据范围:矩阵的长宽满足 0≤n,m≤500 , 矩阵中的值满足0≤val≤10^9 # 进阶:空间复杂度 O(1) ,时间复杂度 O(n+m) import numpy as np def find(num, nums): # 遍历法:O(n*m)的时间复杂度 if len(nums) == 0: return False for i in range(nums.shape[0]): for j in range(nums.shape[1]): if num == nums[i][j]: return True return False def find1(num, nums): # 二分法:从矩阵右上角开始查找,O(n+m)的时间复杂度 if len(nums) == 0: return False i = 0 j = nums.shape[1] - 1 while i < nums.shape[0] and j >= 0: if nums[i][j] == num: return True elif nums[i][j] > num: j -= 1 else: i += 1 return False def find2(num, nums): # 也可用常规二分法:O(m*log(n))的时间复杂度(若m<n) if len(nums) == 0: return False m = nums.shape[0] n = nums.shape[1] if m > n: for j in range(n): left = 0 right = m - 1 while left <= right: mid = int((left+right)/2) if nums[mid][j] == num: return True elif nums[mid][j] < num: left = mid + 1 else: right = mid - 1 return False else: for i in range(m): left = 0 right = n - 1 while left <= right: mid = int((left + right) / 2) if nums[i][mid] == num: return True elif nums[i][mid] < num: left = mid + 1 else: right = mid - 1 return False if __name__ == '__main__': nums = np.array([[1, 2, 3, 4, 5], [2, 3, 4, 5, 6], [3, 4, 5, 6, 7]]) num1 = 6 num2 = 8 print("find: ") print(find(num1, nums)) print(find(num2, nums)) print("find1: ") print(find1(num1, nums)) print(find1(num2, nums)) print("find2: ") print(find2(num1, nums)) print(find2(num2, nums))
笔试题(二):二维数组中的目标查找
于 2023-02-02 15:36:59 首次发布