zoukankan      html  css  js  c++  java
  • 【LeetCode】剑指 Offer 03. 数组中重复的数字

    题目

    找出数组中重复的数字。


    在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

    示例 1:

    输入:
    [2, 3, 1, 0, 2, 5, 3]
    输出:2 或 3
     

    限制:

    2 <= n <= 100000

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


    解答

     1 class Solution(object):
     2     def findRepeatNumber(self, nums):
     3         """
     4         :type nums: List[int]
     5         :rtype: int
     6         """
     7         for _idx in range(0, len(nums)):
     8             while nums[_idx] != _idx:
     9 
    10                 if nums[nums[_idx]] == nums[_idx]:
    11                     return nums[_idx]
    12 
    13                 temp = nums[_idx]
    14                 nums[_idx] = nums[temp]
    15                 nums[temp] = temp
    View Code

    题目的解法有多种:

    1、先排序后计数;

    2、用hash计数,额外空间O(N),时间O(N)

    3、鸽巢原理,额外空间O(1),时间O(N)


    拓展

    思考如果要找到所有重复数字:

    (还有个小问题,未处理同样值多输出)

     1 # coding:utf-8
     2 """
     3 题目:
     4     现有整数数组a大小为n,每个元素 0 <= ai < n,其中每个值可能出现一次货两次,求出现值两次的元素
     5 Demo:
     6     输入:
     7         2 3 4 1 3
     8     输出:
     9         3
    10 """
    11 
    12 
    13 class Solution(object):
    14     def findRepeatNumber(self, nums):
    15         """
    16         :type nums: List[int]
    17         :rtype: int
    18         """
    19         for _idx in range(0, len(nums)):
    20             while nums[_idx] != _idx:
    21                 # temp = nums[_idx]
    22                 # print(_idx, nums[_idx], nums[temp])
    23                 if nums[nums[_idx]] == nums[_idx]:
    24                     print(nums[_idx])
    25                     break
    26 
    27                 temp = nums[_idx]
    28                 nums[_idx] = nums[temp]
    29                 nums[temp] = temp
    30 
    31 
    32 if __name__ == "__main__":
    33     Solution().findRepeatNumber([1,2,3,4,1,3,2])
    34     # Solution().findRepeatNumber([1,3,2,4,1,0,3])
    35     # Solution().findRepeatNumber([2,3,4,3,2])
    View Code

    稍微难一点的变种

  • 相关阅读:
    Elasticsearch 客户端TransportClient vs RestClient
    MySQL(三)——MySQL45题
    MySQL(二)——其他基础功能
    MySQL(一)——CRUD语句
    JVM(十)——类的加载与加载器
    JVM(九)——字节码指令集
    每日总结
    《构建之法》读后感(三)
    《构建之法》读后感(二)
    《构建之法》读后感(一)
  • 原文地址:https://www.cnblogs.com/GO-NO-1/p/13881186.html
Copyright © 2011-2022 走看看