【回眸】剑指offer(三)解题思路

 题解 | #数字在升序数组中出现的次数#

JZ3数字在升序数组中出现的次数

描述

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

数据范围:0≤n≤10000 

进阶:时间复杂度O(n) ,空间复杂度O(n) 

输入:

[2,3,1,0,2,5,3]

复制

返回值:

2

说明:

2或3都是对的    

 做题思路

找到数组中第一个重复出现的数字,并返回该数字。它通过哈希表记录每个数字出现的次数,然后遍历数组查找重复数字。

C语言代码 

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param numbers int整型一维数组
 * @param numbersLen int numbers数组长度
 * @return int整型
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
#include 
#include 
int duplicate(int* numbers, int numbersLen ) {
    // 输入数组和数组长度
    int hash[numbersLen];//创建一个哈希表 hash,用来记录每个数字出现的次数。哈希表的大小与数组长度相同
    for (int i = 0; i < numbersLen; i++) hash[i] = 0;
    for (int i = 0; i < numbersLen; i++) {
        if (++hash[numbers[i]] > 1) return numbers[i];//将当前数字作为哈希表的索引,将对应位置的值加1。
       //如果加1后的值大于1,说明当前数字已经重复出现过,直接返回该数字。
    }
    return -1;//如果整个数组遍历完毕后没有找到重复数字,返回-1,表示数组中没有重复的数字。
}

你可能感兴趣的:(剑指offer做题笔记,算法,数据结构,c语言,剑指offer)