剑指offer--Leetcode版
Posted deeplearning-man
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer--Leetcode版相关的知识,希望对你有一定的参考价值。
面试题03. 数组中重复的数字
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
思路:1. 利用字典,时间复杂度O(n),空间复杂度O(n)
class Solution: def findRepeatNumber(self, nums: List[int]) -> int: dic={} for i in nums: if i not in dic: dic[i]=1 else: return i return False
思路:2. 数组哈希法,遍历数组,把序列[2,3,1,0,2,5,3]修改成一个下标和下标对应值是相同的数组[0,1,2,3,2,5,3] (nums[nums[i]] = nums[i]),寻找当前位(i, 4)的值(nums[i], 2)和当前位的值(nums[i], 2)作为下标的值(nums[nums[i]], 2)相等,时间复杂度O(n),空间复杂度O(1)
class Solution: def findRepeatNumber(self, nums: List[int]) -> int: n = len(nums) for i in range(n): while nums[i] != i: if nums[i] == nums[nums[i]]: return nums[i] nums[nums[i]], nums[i] = nums[i], nums[nums[i]] return False
面试题04. 二维数组中的查找
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思路:利用二分查找,左下角的元素是这一行中最小的元素,同时又是这一列中最大的元素,比较左下角元素和目标。
时间复杂度O(n),空间复杂度O(1)
class Solution: def findNumberIn2DArray(self, matrix: List[List[int]], target: int) -> bool: x = len(matrix) if x == 0: return False y = len(matrix[0]) if y == 0: return False i = x-1 j = 0 while i >= 0 and j < y: if matrix[i][j] == target: return True elif matrix[i][j] < target: j += 1 else: i -= 1 return False
以上是关于剑指offer--Leetcode版的主要内容,如果未能解决你的问题,请参考以下文章
AcWing 30. 正则表达式匹配 (剑指OFFER leetcode 10)
剑指 Offer(第 2 版)完整题解笔记 & C++代码实现(LeetCode版)