首页 > 其他分享 >LeetCode 448.找到所有数组中消失的数字(简单)

LeetCode 448.找到所有数组中消失的数字(简单)

时间:2022-11-25 13:34:43浏览次数:41  
标签:448 nums 元素 list 索引 遍历 数组 LeetCode

题目描述:

给你一个含 ​​n​​​ 个整数的数组 ​​nums​​​ ,其中 ​​nums[i]​​​ 在区间 ​​[1, n]​​​ 内。请你找出所有在 ​​[1, n]​​​ 范围内但没有出现在 ​​nums​​ 中的数字,并以数组的形式返回结果。

示例 1:

输入:nums = [4,3,2,7,8,2,3,1]
输出:[5,6]

示例 2:

输入:nums = [1,1]
输出:[2]

提示:

  • ​n == nums.length​
  • 1 <= n <=
  • ​1 <= nums[i] <= n​

进阶:

你能在不使用额外空间且时间复杂度为 ​​O(n)​​ 的情况下解决这个问题吗? 你可以假定返回的数组不算在额外空间内。

题目分析:

这道题可以运用数组巧妙的对其求解。利用原有的数组,把所有重复出现的元素转换为索引值,并对此索引值上的元素进行标记,然后再遍历一遍数组,没有标记过的元素其索引值的某种形式就是没有出现过的数字。关键点就是我们要如何对原数组进行标记?这里可行的方案就是把重复出现的数字在原数组出现的位置设为负数,最后仍然为正数的位置即为没有出现过的数。简单点讲,就是遍历数组,把当前出现的元素取绝对值再减去一,因为出现的元素范围是 ​​1​​​ 到 ​​n​​​ 而索引范围是 ​​0​​​ 到 ​​n - 1​​​ ,所以在这里我们要对其进行减一处理。然后通过计算得到的值,找出此值作为索引在数组中的元素,把其变为负数,以示其索引值加一在数组中出现过,最后只需遍历此数组,每个正数元素的索引值加一就是没有在此数组中出现的元素。下面的图给出了 ​​示例 1​​ 标记的过程,可能会更加方便理解上述的过程。

LeetCode 448.找到所有数组中消失的数字(简单)_数组

题解:

执行用时: 5 ms

内存消耗: 47.2 MB

class Solution {
public List<Integer> findDisappearedNumbers(int[] nums) {
// 创建结果 list
List<Integer> list = new ArrayList<>();
// 循环遍历数组
for (int num : nums) {
// 获取当前位置上的绝对值 - 1
// 减一是为了把其转换为索引值看待
// 这里使用绝对值是因为我们接下来会把存在当前值 - 1 的索引上元素变为负数
// 负数标记说明其索引 + 1 的元素在数组中出现过
int index = Math.abs(num) - 1;
// 如果索引上的值大于 0
// 则把其变为负数
if (nums[index] > 0) {
nums[index] = - nums[index];
}
}
// 循环遍历更改后的数组
for (int i = 0; i < nums.length; ++i) {
// 如果某个索引上的值大于 0
if (nums[i] > 0) {
// 则证明索引 + 1 的值未在数组中出现过
// 添加到 list 中
list.add(i + 1);
}
}
// 返回结果 list
return list;
}
}

题目来源:力扣(LeetCode)



标签:448,nums,元素,list,索引,遍历,数组,LeetCode
From: https://blog.51cto.com/u_15891283/5886570

相关文章

  • LeetCode 48.旋转图像(中等)
    题目描述:给定一个​​n × n​​​的二维矩阵 ​​matrix​​​表示一个图像。请你将图像顺时针旋转​​90​​度。你必须在原地旋转图像,这意味着你需要直接修改......
  • LeetCode 260.只出现一次的数字III(中等)
    题目描述:给定一个整数数组​​nums​​,其中恰好有两个元素只出现一次,其余所有元素均出现两次。找出只出现一次的那两个元素。你可以按任意顺序返回答案。进阶:你的算法......
  • LeetCode 476.数字的补数(简单)
    题目描述:给你一个正整数​​num​​,输出它的补数。补数是对该数的二进制表示取反。示例1:输入:num=5输出:2解释:5的二进制表示为101(没有前导零位),其补数为010。所以......
  • LeetCode 693.交替位二进制数(简单)
    题目描述:给定一个正整数,检查它的二进制表示是否总是0、1交替出现:换句话说,就是二进制表示中相邻两位的数字永不相同。示例1:输入:n=5输出:true解释:5的二进制表示是:101示......
  • LeetCode 268.丢失的数字(简单)
    题目描述:给定一个包含​​[0,n]​​​中​​n​​​个数的数组​​nums​​​,找出​​[0,n]​​这个范围内没有出现在数组中的那个数。进阶:你能否实现线性时间......
  • LeetCode 338.比特位计数(简单)
    题目描述:给你一个整数​​n​​​,对于​​0<=i<=n​​​中的每个​​i​​​,计算其二进制表示中​​1​​​的个数,返回一个长度为​​n+1​​​的数组​......
  • PHP 数组占用内存分析
    下面的做法会占用多大的内存?list($appid,$openid)=["testcontent","test"];测试:$m0=memory_get_usage();$k=range(1,200000);$m1=memory_get_usage();echoround((......
  • LeetCode 540.有序数组中的单一元素
    LeetCode540.有序数组中的单一元素题目链接:​​https://leetcode-cn.com/problems/single-element-in-a-sorted-array/​​题目描述:给定一个只包含整数的有序数组,每个元......
  • matlab纵向一维数组(向量)维数不一样尾部延展合成
    matlab纵向一维数据维数不一致合成两个语音波形数据简单合成一个试听播放sound(w,18000)sound(波形数据,采样频率)%两个维度不一样的纵向数组波形文件合成一个音轨%codeby......
  • LeetCode 154.寻找旋转排序数组中的最小值II
    LeetCode154.寻找旋转排序数组中的最小值II题目链接:​​https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array-ii/​​题目描述:已知一个长度为 n ......