剑指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; 
}

本篇完!

相关推荐
kisshyshy19 小时前
🍦 雪糕、食堂、火车厢:三幅漫画吃透栈、队列与链表
javascript·算法
猿人谷1 天前
不只是 CPU 阈值:STAR 如何用 GAT + Transformer 做容器级自动扩缩容?
人工智能·算法
复杂网络1 天前
Stable Diffusion 视觉大模型微调技术深度调研
算法
复杂网络1 天前
基于 Stable Diffusion 架构的视觉大模型代表性工作与原理深度解析
算法
MrZhao4001 天前
Agent Loop 如何用 Hook 扩展:权限、日志与工具拦截
算法
MrZhao4001 天前
Agent 为什么需要 Skills:别把所有知识都塞进 system prompt
算法
JieE2123 天前
LeetCode 101. 对称二叉树|JS 递归 + 迭代双解法,彻底搞懂镜像判断
javascript·算法
JieE2124 天前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
Jack204 天前
HarmonyOS开发中错误处理策略:网络异常统一处理
算法
小小杨树4 天前
读懂色彩:拍照调色不再难
算法·计算机视觉·配色