广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >关于C++数组中重复的数字
  • 373
分享到

关于C++数组中重复的数字

2024-04-02 19:04:59 373人浏览 八月长安
摘要

目录1、题目描述1.1 方法一:排序1.2 方法二:哈希表1.3 方法三:数组位置交换2、题目升级2.1 方法一:哈希表2.2 方法二:辅助数组2.3 方法三:二分查找1、题目描述

1、题目描述

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

请找出数组中任意一个重复的数字。

题目示例:

  • 输入:[2, 3, 1, 0, 2, 5, 3]
  • 输出:2 或 3

1.1 方法一:排序

先对数组进行排序
此时从头到尾扫一遍数组就可以了
时间复杂度 O ( l o g 2 n ) O(log_2n) O(log2​n)

代码示例:


int repeatNum(vector<int>& v){
    if(v.empty()) return -1;
    int len = v.size();
    sort(v.begin(), v.end());
    for(int i = 1; i < len; i++){
        if(v[i] == v[i-1]){
            return v[i];
        }
    }
    return -1;
}

1.2 方法二:哈希表

  • 从头到尾扫一遍数组
  • 每扫到一个数字,判断哈希表里是否包含了该数字
  • 如果还没有,就把它加入哈希表中
  • 如果已经存在该数字,就找到了一个重复的数字。

时间复杂度 O ( n ) O(n) O(n) 、空间复杂度 O ( n ) O(n) O(n) ,提高时间效率是以创建一个 O ( n ) O(n) O(n) 的哈希表为代价的。

代码示例:


int repeatNum(vector<int>& v){
    if(v.empty()) return -1;
    map<int, int> m;
    for(int i = 0; i < v.size(); i++){
        if(m[v[i]]) return v[i];
        else m[v[i]]++;
    }
    return -1;
}

1.3 方法三:数组位置交换

  • 从头到尾扫描数组
  • 当扫描的数组下标为 i 时,判断i这个位置的数字 (m) 是否等于 i 本身
  • 若是则扫描下一个数字
  • 若不是则判断 m 和 下标为 m 的数字是否相同 (v[i] == v[v[i]])
  • 若相同则返回,循环结束
  • 若不同则把第 i 个数字 (m) 和 第 m 个数字交换
  • 然后重复这个过程,直至循环结束

时间复杂度为 O ( n ) O(n) O(n) ,空间复杂度为 O ( 1 ) O(1) O(1)

代码示例:


int repeatNum(vector<int>& v){
    if(v.empty()) return -1;
    for(int i = 0; i < v.size(); ++i){
        if(v[i] < 0 || v[i] > v.size()-1) // 数字必须在 0 ~ n-1 之间
            return -1;
    }
    
    for(int i = 0; i < v.size(); ++i){
        while(v[i] != i){
            if(v[i] == v[v[i]]) return v[i];
            swap(v[i], v[v[i]]);
        }
    }
    return false;
}

2、题目升级

长度为 n+1 的数组,所有的数都在 1 ~ n 的范围内,因此数组中至少有一个数字是重复的。找出数组中 任意一个 重复的数字,但 不能修改输入的数组。

题目示例:

  • 输入:[2, 3, 5, 4, 3, 2, 6, 7]
  • 输出:2 或 3

2.1 方法一:哈希表

方法同上:


int repeatNum(vector<int>& v){
    if(v.empty()) return -1;
    map<int, int> m;
    for(int i = 0; i < v.size(); i++){
        if(m[v[i]]) return v[i];
        else m[v[i]]++;
    }
    return -1;
}

2.2 方法二:辅助数组

  • 创建一个长度为 n+1 的辅助数组,然后逐一的把原数组的每个数字复制到辅助数组中
  • 若原数组中 被复制的数字 是 m,则把它复制到辅助数组中下标为 m 的位置

时间复杂度为 O ( n ) O(n) O(n) ,空间复杂度为 O ( n ) O(n) O(n)

代码示例:


int repeatNum(vector<int>& v){
    int len = v.size();
    vector<int> v1(len);
    for(int i = 0; i < len; ++i){
        if(v1[v[i]]) return v1[v[i]];
        else v1[v[i]] = v[i];
    }
    return -1;
}

2.3 方法三:二分查找

将 1 ~ n 的数字从中间的数字 分成两部分,即分成 1 ~ m m+1 ~ n

  • 若 1 ~ m 的数字,在整个数组上的数目超过 m,即超过该区间的长度,那么这一半的区间里一定包含重复的数字
  • 否则,另一半 m+1 ~ n 区间里一定包含重复的数字

继续把包含重复数字的区间一分为二,直到找到一个重复的数字

时间复杂度为 O ( n l o g n ) O(nlog_n) O(nlogn​),空间复杂度为 O ( 1 ) O(1) O(1)

代码示例:


int countRange(vector<int>& v, int sz, int start, int end){
    if(v.empty()) return 0;

    int count = 0;
    for(int i = 0; i < sz; ++i){
        if(v[i] >= start && v[i] <= end){
            ++count;
        }
    }
    return count;
}

int getrepeat(vector<int>& v){
    if(v.empty()) return -1;
    
    int sz = v.size();
    int start = 1, end = sz-1;
    while(end >= start){
        int mid = start + ((end-start)>>1);
        int count = countRange(v, sz, start, mid);
        if(end == start){
            if(count > 1) return start;
            else break;
        }
        if(count > (mid - start + 1)) end = mid;
        else start = mid + 1;
    }
    return -1;
}

测试代码:


bool duplicate(vector<int>& v, int **res){
    if(v.empty()) return false;
    for(int i = 0; i < v.size(); ++i){
        if(v[i] < 0 || v[i] > v.size()-1) 
            return false;
    }
    
    for(int i = 0; i < v.size(); ++i){
        while(v[i] != i){
            if(v[i] == v[v[i]]) {
                *res = &v[i];
                return true;
            }
            swap(v[i], v[v[i]]);
        }
    }
    return false;
}

int main(){
    int arr[] = {2, 3, 5, 4, 3, 2, 6, 7};
    vector<int> v(arr, arr+8);  // 这种赋值方式不会导致vector自动扩展内部大小

    int* res = nullptr;
    if(duplicate(v, &res)) cout << *res << endl;
    else cout << '0' << endl;
    //cout << repeatNum(v) << endl;
    
    return 0;
}

到此这篇关于关于c++数组中重复的数字的文章就介绍到这了,更多相关C++数组中重复数字内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

注:文章转自微信公众号:Coder梁(ID:Coder_LT)

--结束END--

本文标题: 关于C++数组中重复的数字

本文链接: https://www.lsjlt.com/news/156191.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 关于C++数组中重复的数字
    目录1、题目描述1.1 方法一:排序1.2 方法二:哈希表1.3 方法三:数组位置交换2、题目升级2.1 方法一:哈希表2.2 方法二:辅助数组2.3 方法三:二分查找1、题目描述 ...
    99+
    2022-11-12
  • c语言怎么找出数组中重复的数字
    可以使用两种方法来找出数组中重复的数字。 方法一:使用“哈希表” 创建一个哈希表,用于记录每个数字出现的次数。 遍历数组,将数组中...
    99+
    2023-10-26
    c语言
  • LeetCode中怎么输出数组中重复的数字
    LeetCode中怎么输出数组中重复的数字,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。题目:数组中重复的数字在一个长度为 n 的数组 n...
    99+
    2022-10-19
  • 关于C++的重载运算符和重载函数
    目录C++重载运算符和重载函数C++ 中的函数重载C++ 中的运算符重载可重载运算符/不可重载运算符C++重载运算符和重载函数 C++ 允许在同一作用域中的某个函数和运算符指定多个定...
    99+
    2023-05-19
    C++重载运算符 C++重载函数
  • java如何找出数组中的不重复数字
    找出数组中不重复的一个数字,题目大致是这样的:int[] a = { 1, 2, 3, 4, 3, 2, 1 };在线视频教程推荐:java在线学习解决办法是:public static int getNoRepeat() { int[]...
    99+
    2018-07-23
    java 数组 不重复 数字
  • C#中怎么删除数组重复项
    今天就跟大家聊聊有关C#中怎么删除数组重复项,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。C#删除数组重复项使用C#查找数据中重复数据,C#删除数组重复项的解决方法。个人感觉,如果在...
    99+
    2023-06-17
  • C/C++中关于字符串的常见函数操作大全
    目录wcsncpy_sswprintf_smemsetmemcmpmemcpywcslenLoadStringWGetModuleHandleWUuidFromStringWUuid...
    99+
    2023-03-22
    C++字符串常见函数 C++常见函数
  • C++指针和数组:字符和字符串、字符数组的关联和区别
    目录一、字符指针、字符数组字符指针字符数组二、字符串指针三、(字符串)指针数组四、总结字符串的本质就是字符数组,将字符串作为字符数组来处理。字符数组和字符串都可以作为存放字符的数组,...
    99+
    2022-12-23
    C++字符 C++字符串 C++字符数组
  • 关于C++中的static关键字的总结
    1.面向过程设计中的static1.1静态全局变量在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。我们先举一个静态全局变量的例子,如下: 复制代码 代码如下...
    99+
    2022-11-15
    c语言 static
  • php数组中怎么去除重复的字符串
    在PHP编程中,数组常常被用作存储和处理数据的工具。然而,当数组中包含重复的字符串,这可能会导致一些问题。幸运的是,PHP提供了一些内置函数和技巧,以便去除数组中的重复字符串。在本文中,我们将学习如何使用PHP编写一个去除数组中重复字符串的...
    99+
    2023-05-14
    php
  • php数组中如何去除重复的字符串
    今天小编给大家分享一下php数组中如何去除重复的字符串的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。使用array_uniq...
    99+
    2023-07-05
  • php 不重复的数组中
    如何在 PHP 中操作不重复的数组在开发 Web 应用程序过程中,数组是 PHP 最常用的数据结构之一。数组在 PHP 中被广泛使用,可以存储任何类型的数据,从字符串、数字到对象和数组本身。然而,有时候我们需要操作特定的数组,例如,我们需要...
    99+
    2023-05-19
  • 关于JavaScript数组对象去重的几种方法
    数组对象如下: let repeatData = [ { id: 1, name: 'sun', age: 18 }, { id: 1, name: ...
    99+
    2023-05-17
    JavaScript数组去重 js数组对象去重
  • C语言之关于二维数组在函数中的调用问题
    目录关于二维数组在函数中的调用问题函数调用二维数组 二维数组如何放到函数中使用下面以一个二维矩阵的转置为例关于二维数组在函数中的调用问题 之前在学习二维数组的时候感觉理解起...
    99+
    2022-11-13
  • 4个数字组成不重复的3位数python脚
    4个数字组成不重复的3位数python脚本: 注:1、range(1,5),1-4不包括52、if and判断3、变量中间用“,”隔开,输出时中间为空格 #!/usr/bin/python for i in range(1,5):for...
    99+
    2023-01-31
    位数 数字 python
  • Python面试不修改数组找出重复的数字
    目录数组中重复的数字不修改数组找出重复的数字思路思路一:哈希表思路二:二分法测试总结数组中重复的数字 在上一篇博客中剑指Offer之面试题3: 数组中重复的数字中,其实能发现这类题目...
    99+
    2022-11-11
  • Python不修改数组怎么找出重复的数字
    这篇“Python不修改数组怎么找出重复的数字”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python不修改数组怎么找出重...
    99+
    2023-06-30
  • php数组转换为字符串重复
    PHP是一种广泛应用于Web开发的编程语言。PHP中一个常见的操作就是将数组转换为字符串,以便在Web应用程序中传递或存储数据。然而,在对数组进行转换时,我们可能会遇到重复的字符串问题,本文将为您介绍如何解决这个问题。首先,我们来看一下PH...
    99+
    2023-05-19
  • javascript不重复数组中
    Javascript是一种常用的脚本语言,它被广泛应用于Web开发领域。在Javascript中,数组是一种非常重要的数据类型之一。在开发中,我们可能需要对数组进行去重操作,以便更有效地处理数据。本文将介绍Javascript如何去除一个数...
    99+
    2023-05-17
  • C语言中组成不重复的三位数问题
    目录C语言组成不重复的三位数(1)通用思路(2)排除思路打印1234组成的不重复三位数C语言组成不重复的三位数 对于这个问题,我有两种解决思路 第一种较为简单第二种较为复杂 (1)通...
    99+
    2022-11-16
    C语言不重复三位数 组成不重复三位数 不重复三位数C语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作