【剑指offer】09-数组中重复的数字

题目:

在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。



思路:

1、因为所有数字都在0-n-1范围内,将所有数排好序,若前一个数等于后一个数,就返回true

class Solution:
    # 这里要特别注意~找到任意重复的一个值并赋值到duplication[0]
    # 函数返回True/False
    def duplicate(self, numbers, duplication):
        # 首先当然是特殊情况!
        n = len(numbers)
        if numbers == [] or n <= 1:
            # 找重复数字,n=1也返回False
            return False
        numbers.sort()  # 排序
        for i in range(0, n-1):
            if numbers[i] == numbers[i+1]:
                # 前一个和后一个相等
                duplication[0] = numbers[i]
                return True
            elif numbers[i] < 0 or numbers[i] >= n:
                # 因为所有数字都在0到n-1的范围内,所以数字不能小于0或大于n
                return False
        return False

2、可以使用哈希表。先从头到尾扫描数组,比对数组中的值是否在哈希表中存在,若不存在 -> 将该数加入到哈希表中;若存在 -> 该数字就是一个重复的数字

【哈希表】我理解的是,一个数组,每个元素按照一定的哈希函数,对应到哈希表当中的某个地址中。-> 如果A元素在按照哈希函数对应到地址的过程中,与B元素有冲突,那就要采用冲突处理方法。

     *哈希表学习视频:https://www.bilibili.com/video/av17500428?from=search&seid=6236687532128480649

     *python中哈希表的例子:dict、set:https://www.cnblogs.com/kumata/p/9157875.html

class Solution:
    # 这里要特别注意~找到任意重复的一个值并赋值到duplication[0]
    # 函数返回True/False
    def duplicate(self, numbers, duplication):
        # 首先当然是特殊情况!
        n = len(numbers)
        if numbers == [] or n <= 1:
            # 找重复数字,n=1也返回False
            return False
        # python中set有用到哈希表,但是集合中只存储key,不存储value
        usedHash = set()
        for i in range(0, n):  #到n
            if numbers[i] < 0 or numbers[i] >= n:
                return False
            if numbers[i] not in usedHash:
                usedHash.add(numbers[i])
            else:
                duplication[0] = numbers[i]
                return True
        return False

用例:

  1. 有一个或多个重复数字的数组
  2. 没有重复数字的数组
  3. 空数组

原文地址:https://www.cnblogs.com/RebeccaG/p/11960857.html

时间: 2024-10-11 03:44:47

【剑指offer】09-数组中重复的数字的相关文章

【剑指offer】数组中重复的数字

题目链接:数组中重复的数字 题意:在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2. 题解:丢进set,统计,查找,输出.STL大法好! 代码: 1 class Solution { 2 public: 3 // Parameters: 4 // numbers: an array

《剑指offer》数组中重复的数字

[ 声明:版权所有,转载请标明出处,请勿用于商业用途.  联系信箱:[email protected]] 题目链接:http://www.nowcoder.com/practice/623a5ac0ea5b4e5f95552655361ae0a8?rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道

[剑指Offer] 50.数组中重复的数字

题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3. [思路1]需要一个容器来存储暂时没有重复的数字,在向后遍历的过程中如果在容器中找到相同数字则返回. 1 class Solution { 2 public: 3 // Parameters: 4 // numbers: a

剑指offer:数组中重复的数字

题目描述:在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2. # -*- coding: utf-8 -*- # @Time : 2019-04-15 17:31 # @Author : Jayce Wong # @ProjectName : job # @FileName : du

【剑指 offer】数组中重复的数字 -- PHP 实现

题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2.题目链接 <?php function duplicate($numbers, &$duplication) { // write code here //这里要特别注意~找到任意重复的一个值并赋值到duplicatio

剑指offer-数组——数组中重复的数字

题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2. 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M 思路: 嵌套循环遍历数组 public class Solution { // Parameters: // numbers: an

【剑指offer】数组中只出现一次的数字(1)

转载请注明出处:http://blog.csdn.net/ns_code/article/details/27649027 题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 输入: 每个测试案例包括两行: 第一行包含一个整数n,表示数组大小.2<=n <= 10^6. 第二行包含n个整数,表示数组元素,元素均为int. 输出: 对应每个测试案例,输出数组中只出现一次的两个数.输出的数字从小到大的顺序. 样例输入: 8 2 4 3 6 3

剑指OFFER之数组中出现次数超过一半的数字(九度OJ1370)

题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. 输入: 每个测试案例包括2行: 第一行输入一个整数n(1<=n<=100000),表示数组中元素的个数. 第二行输入n个整数,表示数组中的每个元素,这n个整数的范围是[1,1000000000]. 输出: 对应每个测试案例,输出出现的次数超过数组长度的一半的数,如果没有输出-1. 样例输入:

剑指offer (29) 数组中出现次数超过一半或1/3或1/N的数字

题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字 方法一:如果把这个数字排序,那么排序之后位于数组中间的数字一定就是出现次数超过数组长度一半的数字 这个数字就是统计学中的中位数,即长度为n的数组中第n/2大的数字 在数组中得到任意第k大数字,这一问题有O(n)解,注:这里第kth个元素,kth从1开始计数,并且重复元素不去重 (1) 直接sort排序,然后定位到索引为kth-1的元素 int FindKth1(std::vector<int>& num, int kt

剑指offer (36) 数组中的逆序对

题目:在数组中的两个数字如果前面一个数字大于后面一个数字,则这两个数字组成一个逆序对 题解分析: 首先应该想到很简单的一种解法,顺序遍历数组,对每个数,逐个比较该数字和其以后的数字,T(n) = O(n^2) (1)总体的意思就是将数组分成两段,首先求段内的逆序对数量,比如下面两段代码就是求左右两端数组段内的逆序对数量 count += Merge(data, temp, first, mid);//找左半段的逆序对数目 count += Merge(data, temp, mid + 1, e