LeetCode 448. 找到所有数组中消失的数字 | 算法-从菜鸟开始

简介: 算法,从承认自己是一个菜鸟开始!话不多说,让我们继续我们的算法之旅。

LeetCode 448. 找到所有数组中消失的数字


题目介绍:


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


示例:


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


方案一:利用数组的includes方法


遍历1-n之间的所有数,判断当前数是否已经在数组nums中了,不存在的放在数组中返回即可~


小课堂:


includes()方法可以判断元素是否在数组中,如果在返回true,否则返回false

Up Code ~ 上码~


/**
 * @method findDisappearedNumbers1
 * @description: 利用数组的includes方法
 * @param {number} nums
 * @return {*}
 */
function findDisappearedNumbers1(nums: number[]): number[] {
  // 获取数组长度
  const n = nums.length;
  // 定义存放结果的数组
  const res: number[] = [];
  // 遍历1-n之间的每一个元素
  for (let i = 1; i <= n; i++) {
    // 如果nums中不存在i,直接放入结果中
    if (!nums.includes(i)) {
      res.push(i);
    }
  }
  // 返回结果
  return res;
}


算法复杂度:


  • 空间复杂度:定义的res存放结果,最大O(n)O(n)O(n)


  • 时间复杂度:外层是for循环 O(n)O(n)O(n),内部有includes方法

O(n)O(n)O(n),整体时间复杂度是O(n2)O(n^2)O(n2)


时间复杂度是O(n2)O(n^2)O(n2)肯定不是我们想要的~


方案二:两次循环,特殊标记


我们可以生成一个指定nums.length长度的数组arr,在遍历nums元素时,如果某个i值出现了,则在arr中相应的索引位置打标记为true,最后我们筛选arr中标记不为true的值即可。


/**
 * @method findDisappearedNumbers2
 * @description: 两次循环,特殊标记
 * @param {number} nums
 * @return {*}
 */
function findDisappearedNumbers2(nums: number[]): number[] {
  // 1. 生成指定长度的索引
  const arr = new Array(nums.length);
  // 2. 遍历nums中的每一个值
  for (let i = 0; i < nums.length; i++) {
    // 对应arr中的索引是从0开始的,所以这个位置的索引位置 - 1
    arr[nums[i] - 1] = true;
  }
  // 定义存放结果的数组
  let res = [];
  // 3. 遍历arr中所有的元素
  for (let i = 0; i < arr.length; i++) {
    // 如果当前项不是true,表示没有存在过
    if (arr[i] !== true) {
      // 注意这里的索引i,是从0开始的,所以对应位置要+1
      res.push(i + 1);
    }
  }
  // 返回结果
  return res;
}


算法复杂度:


  • 空间复杂度:定义的res存放结果,最大O(n)O(n)O(n)


  • 时间复杂度:两次循环,量级是O(n)O(n)O(n)


性能对比


用事实说话,那种方案更好一些~


const nums: number[] = [4, 3, 2, 7, 8, 2, 3, 1];
console.time('findDisappearedNumbers1');
for (let i = 0; i < 200 * 10000; i++) {
  findDisappearedNumbers1(nums);
}
console.timeEnd('findDisappearedNumbers1');
console.time('findDisappearedNumbers2');
for (let i = 0; i < 200 * 10000; i++) {
  findDisappearedNumbers2(nums);
}
console.timeEnd('findDisappearedNumbers2');


网络异常,图片无法展示
|


二者对比,方案二更优秀~


相关文章
|
2天前
|
搜索推荐 算法 Java
滚雪球学Java(29):数组长度和排序算法:让你的程序更高效
【5月更文挑战第4天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
11 0
滚雪球学Java(29):数组长度和排序算法:让你的程序更高效
|
2天前
|
存储 算法 Java
数据结构与算法 数组和链表
数据结构与算法 数组和链表
11 0
|
2天前
|
算法
leetcode代码记录(寻找两个正序数组的中位数
leetcode代码记录(寻找两个正序数组的中位数
12 2
|
2天前
|
索引
leetcode代码记录(最长重复子数组
leetcode代码记录(最长重复子数组
11 0
|
2天前
leetcode代码记录(两个数组的交集
leetcode代码记录(两个数组的交集
9 1
|
2天前
leetcode代码记录(最大子数组和
leetcode代码记录(最大子数组和
11 2
|
2天前
|
存储 算法
Leetcode 30天高效刷数据结构和算法 Day1 两数之和 —— 无序数组
给定一个无序整数数组和目标值,找出数组中和为目标值的两个数的下标。要求不重复且可按任意顺序返回。示例:输入nums = [2,7,11,15], target = 9,输出[0,1]。暴力解法时间复杂度O(n²),优化解法利用哈希表实现,时间复杂度O(n)。
22 0
|
2天前
|
索引
Leetcode 给定一个数组,给定一个数字。返回数组中可以相加得到指定数字的两个索引
Leetcode 给定一个数组,给定一个数字。返回数组中可以相加得到指定数字的两个索引
|
2天前
|
算法 C++
【刷题】Leetcode 1609.奇偶树
这道题是我目前做过最难的题,虽然没有一遍做出来,但是参考大佬的代码,慢慢啃的感觉的真的很好。刷题继续!!!!!!
9 0
|
2天前
|
算法 索引
【刷题】滑动窗口精通 — Leetcode 30. 串联所有单词的子串 | Leetcode 76. 最小覆盖子串
经过这两道题目的书写,相信大家一定深刻认识到了滑动窗口的使用方法!!! 下面请大家继续刷题吧!!!
12 0