首页 > 其他分享 >剑指offer(1)数组中重复的数字

剑指offer(1)数组中重复的数字

时间:2023-09-26 23:02:58浏览次数:26  
标签:offer 重复 复杂度 元素 int numbers 数组

描述

在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组[2,3,1,0,2,5,3],那么对应的输出是2或者3。存在不合法的输入的话输出-1


数据范围:剑指offer(1)数组中重复的数字_空间复杂度

进阶:时间复杂度剑指offer(1)数组中重复的数字_时间复杂度_02,空间复杂度剑指offer(1)数组中重复的数字_时间复杂度_02

剑指offer(1)数组中重复的数字_数组_04

方法一:利用set集合
核心思想:
        引入set集合,遍历数组元素,检查元素是否在集合中,不在则将元素插入到集合里面;否则表明当前元素在数组中重复,返回当前元素。

核心代码:

int duplicate(vector<int>& numbers) {
    set<int> s;
    for(int i=0;i<numbers.size();i++){
        if(s.count(numbers[i])>0)
            return numbers[i];
        else
            s.insert(numbers[i]);
    }
    return -1;
}

复杂度分析:
        代码使用了循环,循环次数为数组大小,因此该方法的时间复杂度为O(N)。由于引入额外的集合空间,因此空间复杂度为O(N),最坏的情况是数组中的元素都不重复。

时间复杂度O(N)
空间复杂度O(N)

方法二:数据重排
核心思想:
        重头到尾扫描数组S中的每一个元素,当扫描到第i个元素的时候,比较第i个元素位置的值m是否等于i,如果相等,则说明该元素已经在排好序的位置,继续扫描其他元素;如果不相等,先判断m是否等于S[m],相等则说明不同位置上的元素值相等,即元素重复。直接返回元素;否则交换m和S[m]将他们放置到排好序的位置

int duplicate(vector<int>& numbers) {
    int i=0,n=numbers.size();
    while(i<n){
        if(numbers[i] == i){    //第i个位置的元素就是i
            i++;
            continue;
        }else{
            if(numbers[i] == numbers[numbers[i]])   //不同位置上出现了相同的元素,即元素重复
                return numbers[i];
            else
                swap(numbers[i],numbers[numbers[i]]);   //交换元素到对应的位置
        }
    }
    return -1;
}

复杂度分析:

        代码使用了循环,循环次数为数组大小,因此该方法的时间复杂度为O(N)。由于没有采用额外的数组空间,空间复杂度为O(1)

时间复杂度O(N)

空间复杂度O(1)

标签:offer,重复,复杂度,元素,int,numbers,数组
From: https://blog.51cto.com/heliotopekxy/7615313

相关文章

  • [剑指offer] 动态规划篇
    JZ42连续子数组的最大和/*贪心*/publicclassJZ42_1{publicstaticintFindGreatestSumOfSubArray(int[]array){intsum=0,res=Integer.MIN_VALUE;for(inti=0;i<array.length;i++){sum+=array[i];......
  • C语言双指针法解决-有序数组的平方
     力扣(LeetCode)官网-全球极客挚爱的技术成长平台/***Note:Thereturnedarraymustbemalloced,assumecallercallsfree().*/intcmp(constvoid*a,constvoid*b){return(*(int*)a)-(*(int*)b);}int*sortedSquares(int*nums,intnumsSize,......
  • EasyExcel实现excel文件重复多次写入和导出&下载文件
    一、EasyExcel实现excel文件的导出官方文档导入依赖<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>o......
  • 大龄程序员,S业109天,面试22家,收到4个offer,涨薪百分之十
    前言作为一名刚刚接触编程的初学者,被这个领域的神奇魅力所深深吸引。代码犹如魔法棒,能够改变世界,为我们的生活带来便捷和创新。然而,现实往往与理想相去甚远。随着时间的推移,逐渐发现当前的环境并不理想。在这个竞争激烈的行业中,工作机会显得愈发稀缺。即使拥有扎实的编程技能,也可能......
  • 【面试题】Js数组去重都有哪些方法?
    1.indexOf定义:indexOf()方法可返回某个指定的字符串值在字符串中首次出现的位置。如果没有找到匹配的字符串则返回-1。注意:iindexOf()方法区分大小写。语法:string.indexOf(searchvalue,start)//;searchvalue必需。searchvalue可选参数。返回值:Number//查找指定字符串第一次......
  • JavaScript 终于原生支持数组分组了!
    在日常开发中,很多时候需要对数组进行分组,每次都要手写一个分组函数,或者使用lodash的groupBy函数。好消息是,JavaScript现在正在引入全新的分组方法:Object.groupBy和Map.groupBy,以后再也不需要手写分组函数了,目前最新版本的Chrome(117)已经支持了这两个方法!以前的数组分组假设有一个......
  • 关于keil导出数组、数据全是0解决方法
    最近我在采集spwm的电压,想导出散点用matlab画一下图,就找一些keil导出数据的方法,我到用这种写函数的的方式,结果导出全是0,找了很多帖子都没有解释。后来仔细看看才发现是一个十分低级的错误,在别的帖子上转载的都是printf("%d\n",a[i]);打印的都是整形,而我的数组是float类型,所以......
  • 字符数组和字符串的输入:cin,,getchar,cin.get,cin.geiline
    1#include<iostream>2usingnamespacestd;3intmain()4{5//cin.get输入字符6////charc;7/*while((c=cin.get())!=EOF)8{9cout<<c;10}*/11/*while(cin.get(c))12{13......
  • 合并两个无序数组
    合并两个无序数组现在我有两个无序的数组(长度不相等),我现在想将两个数组合并#include<iostream>#include<vector>usingnamespacestd;vector<int>mergeArrays(vector<int>&arr1,vector<int>&arr2){vector<int>res;inti=0,j=0;//设置......
  • LeetCode54.螺旋数组
    本题关键在于模拟数组螺旋的步骤,使用 flag 二维数组标识矩阵某位置是否被访问过,使用 turn 变量指示当前寻找的方向, turn 为0时,代表向右查找, turn 为1时,代表向下查找, turn 为2时,代表向左查找, turn 为3时,代表向上查找,具体的代码如下:classSolution{publicList<......