剑指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版)

剑指 Offer(第 2 版)完整题解笔记 & C++代码实现(LeetCode版)

剑指Offer算法类题目[Python版]

剑指Offer算法类题目[Python版]

剑指offer第二版和专项突击版有啥区别