剑指offer3: 数组重复数字

本文介绍了在0~n-1范围内寻找数组中重复数字的两种高效算法:哈希表法和排序比较法。哈希表法通过记录每个数字出现的次数,在O(n)的时间复杂度内找出重复数字。排序比较法利用数字与下标的对应关系,通过一次扫描和交换操作,同样在O(n)的时间复杂度内找出重复数字。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:在一个长度为n的数组里的所有数字都在0~n-1之间。数组中某些数字时重复的,但不知道有几个重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。


思路一:哈希表法

使用一个长度为n的哈希s数组记录每个数字出现的次数。一边遍历数组一边查询哈希表,遍历一遍,时间复杂度为o(n),空间复杂度也为o(n).
class Solution {
public:
    // Parameters:
    //        numbers:     an array of integers
    //        length:      the length of array numbers
    //        duplication: (Output) the duplicated number in the array number
    // Return value:       true if the input is valid, and there are some duplications in the array number
    //                     otherwise false
    bool duplicate(int numbers[], int length, int* duplication) {
        if(length==0){
            return false;
        }
        if(length==1){
            return true;
        }
        vector<int> temp(length, -1);
        for(int i=0; i < length; i++){
            int value = numbers[i];
            if(temp[value]== -1){
                temp[value]++;}
            else{
                *duplication = value;
                return true;}
        }
    return false;
    }
};

思路二:

由于数组数字都在0~n-1之间,如果没有重复数字,那么每个数字排序后应该和数组index相等。从头扫描数组,当扫描到下标为i的数字m时。比较数字m和i时候相等,是则扫描下一个;不是,则比较m和下标为m的数字,相等则为重复数字,不等则交换,重复。

class Solution {
public:
    bool duplicate(int numbers[], int length, int* duplication) {
        if(length==0){
            return false;
        }
        if(length==1){
            return true;
        }
        for(int i=0;i < length; i++){
            int m=numbers[i];
            if(m==i){
                continue;
            }
            else{
                int tmp = numbers[m];
                if(m==tmp){
                    *duplication = m;
                    return true;
                }
                else{
                    numbers[m]=m;
                    numbers[i]=tmp;
                }
            }
        }
    return false;
    }
};

若要找出所有重复数字,返回list;若要返回每个重复数字以及重复次数,返回map.

基于开源大模型的教学实训智能体软件,帮助教师生成课前备课设计、课后检测问答,提升效率与效果,提供学生全时在线练习与指导,实现教学相长。 智能教学辅助系统 这是一个智能教学辅助系统的前端项目,基于 Vue3+TypeScript 开发,使用 Ant Design Vue 作为 UI 组件库。 功能模块 用户模块 登录/注册功能,支持学生和教师角色 毛玻璃效果的登录界面 教师模块 备课与设计:根据课程大纲自动设计教学内容 考核内容生成:自动生成多样化考核题目及参考答案 学情数据分析:自动化检测学生答案,提供数据分析 学生模块 在线学习助手:结合教学内容解答问题 实时练习评测助手:生成随练题目并纠错 管理模块 用户管理:管理员/教师/学生等用户基本管理 课件资源管理:按学科列表管理教师备课资源 大屏概览:使用统计、效率指数、学习效果等 技术栈 Vue3 TypeScript Pinia 状态管理 Ant Design Vue 组件库 Axios 请求库 ByteMD 编辑器 ECharts 图表库 Monaco 编辑器 双主题支持(专业科技风/暗黑风) 开发指南 # 安装依赖 npm install # 启动开发服务器 npm run dev # 构建生产版本 npm run build 简介 本项目旨在开发一个基于开源大模型的教学实训智能体软件,帮助教师生成课前备课设计、课后检测问答,提升效率与效果,提供学生全时在线练习与指导,实现教学相长。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值