剑指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存放到nums[m]位置)

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

本篇完!

相关推荐
ChoSeitaku20 分钟前
链表循环及差集相关算法题|判断循环双链表是否对称|两循环单链表合并成循环链表|使双向循环链表有序|单循环链表改双向循环链表|两链表的差集(C)
c语言·算法·链表
DdddJMs__13525 分钟前
C语言 | Leetcode C语言题解之第557题反转字符串中的单词III
c语言·leetcode·题解
Fuxiao___29 分钟前
不使用递归的决策树生成算法
算法
我爱工作&工作love我34 分钟前
1435:【例题3】曲线 一本通 代替三分
c++·算法
白-胖-子1 小时前
【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-统计数字
开发语言·c++·算法·蓝桥杯·等考·13级
workflower1 小时前
数据结构练习题和答案
数据结构·算法·链表·线性回归
好睡凯1 小时前
c++写一个死锁并且自己解锁
开发语言·c++·算法
Sunyanhui11 小时前
力扣 二叉树的直径-543
算法·leetcode·职场和发展
一个不喜欢and不会代码的码农1 小时前
力扣105:从先序和中序序列构造二叉树
数据结构·算法·leetcode
前端郭德纲2 小时前
浏览器是加载ES6模块的?
javascript·算法