找到数组里消失的数字(鸽笼原理)
概念
鸽笼原理 (抽屉原理) “如果有五个鸽子笼,养鸽人养了6只鸽子,那么当鸽子飞回笼中后,至少有一个笼子中装有2只或2只以上鸽子。”这个简单的事实就是著名的鸽笼原理,在我们国家更多地称为抽屉原理。
问题分析:看到这道题,常规做法就是创建一个的哈希数组来存储1~n的数,然后遍历查重找到缺少的数字。
下面介绍一个很巧妙的解法,也能帮助你更好的理解鸽箱原理。
数组里面数的范围是1~n,那么对应的索引范围就是0~n-1。
我们以示例一解释 [4,3,2,7,8,2,3,1] 解题思路:我们可以利用索引和n的关系,第一个数字是4,我们就将数组的第四个同时也是下标为3的数据改成负数,遍历过程中如果遇到重复的元素,我们可以用abs()方法来保证一直为负数,最后剩下为正数的下标+1就是我们要找的数组。[4,3,2,7,8,2,3,1] 初始数据[4,3,2,-7,8,2,3,1] 第一个数据 4 出现,将下标 3 的数据改为负数。[4,3,-2,-7,8,2,3,1] 第二个数据 3 出现,将下标 2 的数据改为负数。[4,-3,-2,-7,8,2,3,1][4,-3,-2,-7,8,2,-3,1][4,-3,-2,-7,8,2,-3,-1][4,-3,-2,-7,8,2,-3,-1][4,-3,-2,-7,8,2,-3,-1][-4,-3,-2,-7,8,2,-3,-1]
遍历完毕,第五,第六个数依然为正数说明5,6没有出现。class Solution {public List<Integer> findDisappearedNumbers(int[] nums) {List<Integer> results = new ArrayList<>();for (int i = 0; i < nums.length; i++) {if (nums[Math.abs(nums[i]) - 1] > 0) {nums[Math.abs(nums[i]) - 1] = - nums[Math.abs(nums[i]) - 1];}}for (int i = 0; i < nums.length; i++) {if (nums[i] > 0) {results.add(i + 1);}}return results;}
}
找到数组里消失的数字(鸽笼原理)相关推荐
- leetcode(3)——697. 数组的度(C++版本注释)(map容器),448. 找到所有数组中消失的数字(取余操作,C++中的auto类型)
文章目录 前言 697 程序 思路 收获 map容器 448 程序 收获 取模操作的思考 auto 前言 大佬的程序,边刷边总结边学语言. 题目697 697 程序 class Solution {p ...
- 《LeetCode力扣练习》第448题 找到所有数组中消失的数字 Java
<LeetCode力扣练习>第448题 找到所有数组中消失的数字 Java 一.资源 题目: 给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内.请你 ...
- 找到所有数组中消失的数字_【一点资讯】千万程序员的呼声:面试如何拿到大厂Offer?这份阅读量超过11W+的算法刷题宝典请你原地查收 www.yidianzixun.com...
如何才能通过面试拿到大厂Offer? "刷leetcode!" 这是我听到最多的回答! 现在越来越多的人应聘工作时都得先刷个几十百来道题,不刷题感觉都过不了面试. 无论是面测试.算 ...
- 2021-12-19:找到所有数组中消失的数字。 给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums
2021-12-19:找到所有数组中消失的数字. 给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内.请你找出所有在 [1, n] 范围内但没有出现在 nums ...
- 算法题 如何找到数组中重复的数字
面试题3 数组中重复的数字 题 目 :找出数组中重复的数字. 在一个长度为n的数组里的所有数字都在0 ~ n-1的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次. ...
- 努力前端【LeetCode-10】448. 找到所有数组中消失的数字 442. 数组中重复的数据(中等) 41. 缺失的第一个正数(困难) [鸽笼原理,数组,Map,类似No.645]
文章目录 题目描述-448 一.哈希Map 二.空间复杂度的优化--鸽笼原理 三.总结 题目描述-442 一.还是hashMap 二.继续鸽笼原理 题目描述-41 一.基础方案 二.数组模拟Map 题 ...
- Leetcode--448. 找到所有数组中消失的数字
给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次. 找到所有在 [1, n] 范围之间没有出现在数组中的数字. 您能在不 ...
- ★LeetCode(448)——找到所有数组中消失的数字(JavaScript)
给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次. 找到所有在 [1, n] 范围之间没有出现在数组中的数字. 您能在不使 ...
- bat从数组中找出相同数字并删除_找到所有数组中消失的数字
题目描述 给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次. 找到所有在 [1, n] 范围之间没有出现在数组中的数字. ...
最新文章
- Android UI开发第十四篇——可以移动的悬浮框
- 什么是分布式事务以及有哪些解决方案?
- springIllegalArgumentException Can not set field to $Proxy 在spring中使用事物或AOP遇到的错误
- Python基础知识-优雅的with as语句
- ITK:与矢量型图像应用GradientRecursiveGaussianImageFilter
- jni加载第三方so_Linux的so文件到底是干嘛的?浅析Linux的动态链接库
- oracle group by ,having ,order by
- 【API进阶之路】API带来的微创新,打动投资人鼓励我创业
- python字符串lower,upper,capwordds方法,translate(使用替换后),maketrans(创建表)的使用(不知道怎么回事这个变乱了?后期再整理)
- 战斗民族的Yandex开始首次雪地无人车路测 | 视频
- JAVA b2b2c多用户商城系统源码-服务发现服务端EurekaServer微服务
- 修改mysql数据库默认字符集_MySQL数据库之修改mysql默认字符集的两种方法详细解析...
- 【KDD20】主题模型在图模型中的应用专题
- HOLOLENS的DEVICE POTAL连接和安装
- html表格中加入斜线,html中给表格添加斜线
- 去哪儿CEO庄辰超:傍百度战携程与巨头共舞
- 三个灭点来衡量一个立方体
- 响铃:抖音微视撕逼,但音乐短视频只有“神曲”逻辑吗?
- linux系列(七):shell编程、shell概念、ssh协议概念、执行shell文件的三种方式
- Renice INC:葡萄酒常用的保鲜方法