这是悦乐书的第365次更新,第393篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第227题(顺位题号是961)。在大小为2N的数组A中,存在N+1个唯一元素,并且这些元素中的一个重复N次。

返回重复N次的元素。例如:

输入:[1,2,3,3]
输出:3

输入:[2,1,2,5,3,2]
输出:2

输入:[5,1,5,2,5,3,5,4]
输出:5

注意

  • 4 <= A.length <= 10000

  • 0 <= A [i] <10000

  • A.length是偶数

02 第一种解法

题目的意思是找数组A中出现了N/2次的数,其中N为数组A的长度。使用HashMapkey为数组元素,value为其出现次数,先将A中的元素初始化进HashMap中,然后遍历HashMap,找到value等于N/2key返回即可。

public int repeatedNTimes(int[] A) {Map<Integer, Integer> map = new HashMap<Integer, Integer>();for (int n : A) {map.put(n, map.getOrDefault(n, 0)+1);}int half = A.length/2;for (Integer key : map.keySet()) {if (map.get(key) == half) {return key;}}return -1;
}

03 第二种解法

同样是先记数再查找的思路,将第一种解法的HashMap换成int数组,长度为10001,新数组count的索引为A中的元素,值为A中元素的出现次数,然后遍历count数组,返回其中值等于N/2的索引,N为数组A的长度。

public int repeatedNTimes2(int[] A) {int[] count = new int[10001];for (int n : A) {count[n]++;}int half = A.length/2;for (int i=0; i<count.length; i++) {if (count[i] == half) {return i;}}return -1;
}

04 第三种解法

换一种角度来看,把数组中的重复元素找到就行,而去重首选HashSet,遍历A中的元素,如果HashSet中已经存在当前元素,即此元素就是要找的多次出现的元素。

public int repeatedNTimes3(int[] A) {Set<Integer> set = new HashSet<Integer>();for (int n : A) {if (set.contains(n)) {return n;} else {set.add(n);}}return -1;
}

05 第四种解法

和第三种解法的思路相同,只是将HashSet换成了int数组。

public int repeatedNTimes4(int[] A) {int[] count = new int[10001];for (int n : A) {if(++count[n] >= 2) {return n;}}return -1;
}

06 第五种解法

在第四种解法的基础上,做进一步简化,使用字符串代替。新建一个字符串str,如果当前元素没有出现过在str中,就拼接到str上,反之就是str中已经存在了该元素,返回该元素即可。

public int repeatedNTimes5(int[] A) {String str = "";for (int n : A) {if (str.indexOf(n+"") < 0) {str += n;} else {return n;}}return -1;
}

07 第六种解法

直接使用两层循环,匹配相等的元素。

public int repeatedNTimes6(int[] A) {int n = A.length;for (int i=0; i<n; i++) {for (int j=i+1; j<n; j++) {if (A[i] == A[j]) {return A[i];}}}return -1;
}

08 第七种解法

此解法来自LeetCode给的参答,这个思路很奇妙,算是在第六种解法基础上的进一步简化。
同样使用两层循环,但是不像第六种解法那样每次都是比较相邻的元素,而是分3次跳着比较,第一次是比较相邻元素,第二次是比较间隔1位的元素,第三次是比较间隔2位的元素,将A切分成4个长度为一组的子数组,将其中的元素与其距离1、2、3的元素做比较,至少会存在一个重复元素在其中。

public int repeatedNTimes7(int[] A) {int n = A.length;for (int i=1; i<=3; i++) {for (int j=0; j<n-i; j++) {if (A[j] == A[j+i]) {return A[i];}}}return -1;
}

09 小结

算法专题目前已连续日更超过七个月,算法题文章233+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

转载于:https://www.cnblogs.com/xiaochuan94/p/11094905.html

LeetCode.961-2N数组中N次重复的元素(N-Repeated Element in Size 2N Array)相关推荐

  1. es6去除重复项_javascript在ES6中从数组中筛选出重复项并仅返回唯一值

    这是从数组中筛选出重复项并仅返回唯一值的三种方法.我最喜欢的是使用Set,因为它是最短和最简单的. 1.使用Set 首先让我解释一下Set:Set是ES6中引入的新数据对象.因为Set仅允许您存储唯一 ...

  2. 【宫水三叶的刷题日记】961. 在长度 2N 的数组中找出重复 N 次的元素

    题目描述 这是 LeetCode 上的 961. 在长度 2N 的数组中找出重复 N 次的元素 ,难度为 简单. Tag : 「模拟」.「计数」.「构造」.「哈希表」 给你一个整数数组 nums ,该 ...

  3. LeetCode删除排序数组中的重复项(Java实现)

    原题: 给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件 ...

  4. Leetcode刷题100天(阿里云周赛)—查找数组中的所有重复项(哈希)—day42

    前言: 作者:神的孩子在歌唱 大家好,我叫运智 描述 给定一个整数数组,1 ≤ a[i] ≤ n(n = 数组的大小),一些元素出现两次,其他元素出现一次. 找到在此数组中出现两次的所有元素. 示例 ...

  5. LeetCode 961 N-Repeated Element in Size 2N Array --python,java解法

    题目地址:N-Repeated Element in Size 2N Array - LeetCode Acceptance:73.3% Difficulty:Easy In a array A of ...

  6. Java面试题:在一个递增的数组里面,找出任意两个数的和等于100,编写程序输出这些数对,可以假设数组中不存在重复元素

    本文使用两种算法来实现,分别是二分查找法和插值查找法,发现插值查找法更好,更快地找到需要的数据. 代码如下: package com.moson.search;import java.util.Arr ...

  7. 每天一道LeetCode-----有序数组循环右移n位后,寻找最小值,数组中可能包含重复元素

    Find Minimum in Rotated Sorted Array II 原题链接Find Minimum in Rotated Sorted Array II 一个有序数组循环右移n位,找到右 ...

  8. LeetCode 1707. 与数组中元素的最大异或值(Trie树)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个由非负整数组成的数组 nums .另有一个查询数组 queries ,其中 queries[i] = [xi, mi] . 第 i 个查询的答案是 ...

  9. LeetCode 1095. 山脉数组中查找目标值(二分查找)

    1. 题目 给你一个 山脉数组 mountainArr,请你返回能够使得 mountainArr.get(index) 等于 target 最小 的下标 index 值. 如果不存在这样的下标 ind ...

最新文章

  1. linux驱动:i2c驱动(三)流程图之注册设备
  2. 【Linux】一步一步学Linux——visudo命令(104)
  3. android 属性动画伸缩,Android的属性动画(二)加载框圆点旋转收缩放大缩小效果的实现...
  4. [vue] 说说你觉得认为的vue开发规范有哪些?
  5. oracle中DECODE与CASE的用法区别
  6. 在计算机中dos代表什么意思,Boot是什么意思
  7. MySQL数据库知识点总结
  8. Python给指定文件打上数字签名
  9. python编程软件哪个好-Python开发工具哪个好?好用的Python开发工具排行榜推荐下载...
  10. linux中指令简约版
  11. openwrt下ipk生成过程及原理
  12. python爬虫利用requests和BeautifulSoup爬取美女图片
  13. hive hql 交差并集 练习
  14. win7系统怎么进行网络重置?
  15. 内存中的存储空间(栈空间、堆空间、数据段、代码段)
  16. 了解java中暴力反射
  17. 解决Linux“Device is busy”与磁盘只读
  18. Numbers 储存格换行、表格自动换列
  19. Java8--20道关于Stream流的题目练习
  20. echarts图表宽度为百分比出现的问题

热门文章

  1. [转]sqlserver2008锁表语句详解
  2. c++ 通过 myodbc连接到 远程linux 上的mysql server
  3. 各品牌笔记本BIOS设置硬盘为兼容模式(IDE)方法
  4. 获取init程序的调试信息和uevent的调试信息需要打开的两个宏
  5. 简单CSS3动画制作
  6. JavaScript核心参考手册.chm
  7. Android-实现切换Fragment页功能
  8. Oracle 11 密码永不过期
  9. 判断一个jquery对象是否为空jquery对象
  10. Python(2.7.6) 列表推导式