题目:

写一个函数判断一个int类型的数组是否是有效的。 
所谓有效是指:假设数组大小为n,那么这个int数组里的值为0~n-1之间的数,并且每个数只能出现一次,否则就是无效数组。 
例如[5,3,1,4,2,0]是有效的,[5,3,5,1,2,0]是无效的,[5,3,6,1,2,0]是无效的。

解法思路一:置换的思想

用一个temp来存储被置换出来的值,例如数组a:

5    3    1   4   2   0

首先,初始化时取第一个数5,将5放在数组的第5号位置,将原来的位置改为-1,5号被置换出来的值放在 temp。即,

-1   3   1   4   2   5       temp=0

下一步,将temp中的值放在a[temp]中:

0   3   1   4   2   5

接着,置换3:

0   -1   1   3   2   5  temp=4

0   -1   1   3   4   5  temp=2

0   -1   2   3   4   5   temp=1

0   1   2   3   4   5

排序成功,然后直接遍历一遍,后面的元素前前面的元素,值为0,则有重复。

优点:

只申请了一个元素的空间

缺点:

1. 结束条件比较复杂;

(1)用一个Index进行初始化temp操作,

置换过程中,如果temp置换的是-1,则取出index所指的元素赋给temp,并index++;

如果temp置换的不是-1,则取出temp要置换的内容赋给temp;

(2)可以用一个count进行计数,最多置换N次,作为结束条件。

2. 对使用条件比较苛刻,数组必须是存储的刚好[0, n-1]

解决思路二:置反的思想

不用移动的方法 
          5   3   1   4   2   0  
  ==》0) 5   3   1   4   2  -0      i=0; 取出j=|a[i]|=5; 令a[j]=-a[5]=-0 
     1)  5   3   1  -4   2   0      i=1; 取出j=|a[i]|=3; 令a[j]=-a[3]=-4   
     2)  5  -3   1  -4   2   0      i=2;     j=|a[i]|=1; 令a[1]=-a[1]=-3 
     3)  5  -3   1  -4  -2   0      i=3;     j=|a[i]|=4; 令a[4]=-a[4]=-2 
     4)  5  -3  -1  -4  -2   0      i=4;     j=|a[i]|=2; 令a[2]=-a[2]=-1 
     5) -5  -3  -1  -4  -2   0      i=5;     j=|a[5]|=0; 令a[0]=-a[0]=-5 
所有数为非正整数,且0只有一个,成功。同时执行一遍循环把负数弄回去,复杂度0(2N) 
  
在遍历的过程中,如果发现要取反的值为负的,说明数组中曾经存在过一个i值,使a[i]变为负数,则可知道有重复

优点:

1. 不需要申请空间;

缺点:

使用条件苛刻:连续[0, n-1]的值

解决思路三:数组map的思想

要求空间复杂度为O(1),那么可以申请常数大小的空间,由于int最大表示范围为65536,我们可以直接申请65536大小的数组b。

将原数组中的a[i],通过b[a[i]]++,来进行计数,如果值超过1,则表明有重复。

缺点:

申请空间比较大

优点:

使用条件宽松,可以用于连续整数,也可以用于非连续整数的排序。

该思想很重要,需要掌握!!!

如何判断一个整数数组中是否有重复元素?要求时间复杂度O(n),空间复杂度O(1)相关推荐

  1. 如何判断一个整数数组中是否有重复元素?要求时间复杂度O(n),空间复杂度O(1)...

    题目: 写一个函数判断一个int类型的数组是否是有效的.  所谓有效是指:假设数组大小为n,那么这个int数组里的值为0~n-1之间的数,并且每个数只能出现一次,否则就是无效数组.  例如[5,3,1 ...

  2. 返回数组个数Java_用java实现返回一个整数数组中最大数组的和

    今天研究了一下如何返回一个整数数组中最大数组的和,具体要求如下: 分析: 对于这个问题可以设定一个整型max,让他来充当子数组的和的最大值,之后就需要让他和所有的子数组进行比较,这里可以用两个for循 ...

  3. 返回一个整数数组中最大子数组的和---环形数组

    一.题目要求 题目:返回一个整数数组中最大子数组的和. 要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 如果数组A[0]--A[j- ...

  4. Java黑皮书课后题第7章:7.10(找出最小元素的下标)使用下面的方法头编写一个方法,求出一个整数数组中的最小元素下标。编写测试程序,提示用户输入10个数字,调用这个方法返回最小值的下标(多个则最小

    7.10(找出最小元素的下标)使用下面的方法头编写一个方法,求出一个整数数组中的最小元素下标.编写测试程序,提示用户输入10个数字,调用这个方法返回最小值的下标(多个则返回最小的下标) 题目 题目描述 ...

  5. Java黑皮书课后题第7章:7.9(找出最小元素)使用下面的方法头编写一个方法,求出一个整数数组中的最小元素。编写测试程序,提示用户输入10个数字,调用这个方法返回最小值,并显示这个最小值

    7.9(找出最小元素)使用下面的方法头编写一个方法,求出一个整数数组中的最小元素.编写测试程序,提示用户输入10个数字,调用这个方法返回最小值,并显示这个最小值 题目 题目描述与运行示例 破题 代码 ...

  6. 判断一个int数组中的元素是否存在重复

    package com.hbut.test2; import java.util.ArrayList; import java.util.HashSet; import java.util.List; ...

  7. c语言经典算法——查找一个整数数组中第二大数

    https://www.cnblogs.com/dootoo/p/4473958.html 题目: 实现一个函数,查找一个整数数组中第二大数. 算法思想: 设置两个变量max1和max2,用来保存最大 ...

  8. 结对开发——返回一个整数数组中最大子数组的和 (首尾相接版)

    一.题目及题目要求 题目:返回一个整数数组中最大子数组的和. 要求: (1)输入一个整形数组,数组里有正数也有负数. (2)数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. (3)如果 ...

  9. 软件工程结对开发——返回一个整数数组中最大子数组的和(JAVA)

    题目:返回一个整数数组中最大子数组的和. 要求: 输入一个整型数组,数组里有正数也有负数: 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和: 求所有子数组的和的最大值.要求时间复杂度为 ...

最新文章

  1. 互联网公司「敏捷开发」,打造高效执行能力
  2. 在原神里钓鱼,有人竟然用上了深度强化学习,还把它开源了
  3. PyCharm设置字体大小(亲测)
  4. 长安大学计算机科学与技术(交通信息工程)课程专业课,长安大学硕士专业交通信息工程及控制介绍...
  5. 图像处理之添加文字水印
  6. c语言程序设计对称字符串,C语言程序设计(字符串)
  7. Bash脚本教程之数组
  8. JAVA导出excel如何设置表头跨行或者跨列,跪求各位大神了
  9. bzoj 3156: 防御准备
  10. 还有不会用 SQL 的程序员吗?
  11. 内卷严重?给程序员的几条建议
  12. 不错的Unity教程
  13. 破解校园网“一人一号” 高校学子必备秘籍
  14. 官方代码 Deeplab v3+ resnet101 做backbone
  15. OEM 13c 监控RAC部署
  16. C语言error2005,关于ERROR LNK 2005错误
  17. PHP从入门到精通 第二版pdf
  18. 桌面计算机找不到硬盘,bios找不到硬盘完美解决方法 选择STATConfigur
  19. 狂神学习系列18:Redis
  20. 阿里P6+Java研发工程师,到底牛在哪儿?真了

热门文章

  1. Struts2中的拦截器与过滤器学习
  2. 【转】基本概念:过拟合、修剪、假正、假负
  3. oracle数据库函数和存储过程的包
  4. lucene.net 某些类的介绍
  5. python是用什么语言开发的-专为人工智能和数据科学而生的Go语言,或将取代Python...
  6. python软件下载安装要钱吗-PyCharm下载和安装详细步骤
  7. python官网下载步骤除了windows-python安装教程详解|python下载安装教程步骤
  8. 关于python中requests模块导入问题-Python中requests模块的核心使用(1)
  9. python手机版idle-Python入门 | IDLE的介绍和使用方法
  10. python生成excel表格-Python实现将数据库一键导出为Excel表格的实例