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

一.题目描述

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


算法1.排序,然后遍历,时间复杂度O(nlogn),空间O(logn)

c 复制代码
int Cmp_int(const void* vp1, const void* vp2)
{
    return *(int*)vp1 - *(int*)vp2;
}
int findRepeatNumber1(int* nums, int numsSize)
{
    qsort(nums,numsSize,sizeof(int),Cmp_int);//调用排序算法,需要引用stdlib.h
    for (int i = 0; i+1 < numsSize; i++)
    {
        if (nums[i] == nums[i + 1])
            return nums[i];
    }
    return -1;
}

算法2:利用哈希表,时间O(n),空间O(n)

cpp 复制代码
int findRepeatNumber(int* nums, int numsSize)
{
    int* arr = (int*)malloc(numsSize * sizeof(int));
    int i;
    int m;
    for (i = 0; i < numsSize; i++)
        arr[i] = -1;//-1表示无效值
    for (i = 0; i < numsSize; i++)
    {
        m = nums[i];
        if (arr[m] != -1)//找到了
        {
            free(arr);
            return m;
        }
        arr[m] = m;
    }
    free(arr);
    return -1;//没有重复的
}

算法3.数据归位(把m存放到numsm位置)

cpp 复制代码
int findRepeatNumber3(int* nums, int numsSize) //O(n),O(1)

{
    int m; 
    for (int i = 0; i < numsSize; i++) 
    {
        while (nums[i] != i)//当前位置,存放的不是当前数据,交换 
        {
            m = nums[i]; 
            if (m == nums[m])//找到了 
                return m; 
            nums[i] = nums[m]; 
            nums[m] = m; 
        }
    }
    return -1; 
}

int main() 
{
    int nums[] = { 2, 3, 1, 0, 2, 5, 3 }; 
    printf("%d\n", findRepeatNumber(nums,sizeof(nums)/sizeof(nums[0])));


    return  0; 
}

本篇完!

相关推荐
不穿鞋的懒羊羊几秒前
dfs深度优先搜索
算法
OYYHXPJR22 分钟前
【算法】区间重叠模板和矩形重叠模板
算法
shehuiyuelaiyuehao24 分钟前
算法46,分治快排,排序数组
java·算法·排序算法·排序
圣保罗的大教堂31 分钟前
leetcode 3483. 不同三位偶数的数目 简单
leetcode
careathers35 分钟前
【数据结构】栈
java·数据结构
远航计算机40 分钟前
GEO 选题从哪来?用一份 Query 词库把一年内容排出来
大数据·人工智能·算法·aigc
宣宣猪的小花园.41 分钟前
【机器学习】神经网络与表征:为什么深度学习能自动提取特征
人工智能·嵌入式硬件·算法·机器学习
mmmmath_31 小时前
LeetCode.018.四数之和
数据结构·算法·leetcode
AIGCmagic社区1 小时前
腾讯混元 AuK 技术报告拆读:1.5B 统一语音生成与编辑,蒸馏后 4 步无 CFG 提速 4.5 倍
人工智能·算法·aigc·ai多模态
大熊背1 小时前
基于照明色度表征的颜色恒常性的白平衡算法实现
算法·白平衡·色温·色度坐标·普朗克曲线