码迷,mamicode.com
首页 > 其他好文 > 详细

剑指offer--Leetcode版

时间:2020-02-14 22:52:28      阅读:100      评论:0      收藏:0      [点我收藏+]

标签:哈希法   array   试题   思路   重复   matrix   ==   nbsp   二分查找   

面试题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版

标签:哈希法   array   试题   思路   重复   matrix   ==   nbsp   二分查找   

原文地址:https://www.cnblogs.com/deeplearning-man/p/12309523.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!