开启我的LeetCode刷题日记:1051. 高度检查器

56 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第28天,点击查看活动详情

编程世界总是离不了算法

最近在看框架源码时,会有很多算法的实现逻辑,有时候会感到吃力

于是决定蹭着假期,加强算法和数据结构相关的知识

那怎么提升呢?

其实我知道算法这东西没有捷径,多写多练才能提升,于是我开启我的LeetCode刷题之旅

第一阶段目标是:200道,每天12

为了不乱,本系列文章目录分为三部分:

  1. 今日题目:xxx
  2. 我的思路
  3. 代码实现

1051. 高度检查器

学校打算为全体学生拍一张年度纪念照。根据要求,学生需要按照 非递减 的高度顺序排成一行。

排序后的高度情况用整数数组 expected 表示,其中 expected[i] 是预计排在这一行中第 i 位的学生的高度(下标从 0 开始)。

给你一个整数数组 heights ,表示 当前学生站位 的高度情况。heights[i] 是这一行中第 i 位学生的高度(下标从 0 开始)。

返回满足 heights[i] != expected[i] 的 下标数量 。

 

示例:

输入:heights = [1,1,4,2,1,3] 输出:3 解释: 高度:[1,1,4,2,1,3] 预期:[1,1,1,2,3,4] 下标 2 、4 、5 处的学生高度不匹配。

示例 2:

输入:heights = [5,1,2,3,4] 输出:5 解释: 高度:[5,1,2,3,4] 预期:[1,2,3,4,5] 所有下标的对应学生高度都不匹配。

示例 3:

输入:heights = [1,2,3,4,5] 输出:0 解释: 高度:[1,2,3,4,5] 预期:[1,2,3,4,5] 所有下标的对应学生高度都匹配。  

提示:

1 <= heights.length <= 100 1 <= heights[i] <= 100

来源:力扣(LeetCode) 链接:leetcode.cn/problems/he… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

我的思路

分析题意:按照非递减(递增且可以相等) 的高度排序,expected[i]和heights[i]都表示这一行中第i位学生的高度,需要返回heights[i] != expected[i]不相等的下标数量。

最直观的做法,第一反应就是使用排序函数sort,将expected排序后和heights中的每一位进行比较,如果遇到不相等的就++,最终返回不相等的数量即可。

再深入的想想,如果存在多个1,但是他们在不同的位置,那么当你排序后,其会回到正确的位置上,那么不管是哪个1在前还是在后都是一样的(因为我们不关心其应该回到哪个位置上,我们只关心有哪些是不在自己的位置上的),因此:本题并不在意排序好后每个元素所在的正确位置,而是在意一共有多少个不同的下标数量,因此可以将思路转到如何求不同的下标数量上。

代码实现

/**
 * @param {number[]} heights
 * @return {number}
 */
var heightChecker = function(heights) {
  // 计数排序:因为并不要求我们真正的进行排序,因为不需要确确实实的知道每个位置上排列的是谁,只需要统计下每个数的个数,然后依次判断就可以了
  // O(n)的时间复杂度
  let num = new Array(101).fill(0), n = heights.length, m = num.length;
  heights.forEach(value => num[value]++);
  // console.log(num)
  let count = 0;
  for(let i = 1, j = 0; i < m; i++) {
    while(num[i]-- > 0) {
      if(heights[j++] != i) count++;
    }
  }
  return count;
};


总结

实现方式其实有很多,这里仅供参考~

由于刚开始刷题,也不知道从哪里刷好,如果前辈们有好的建议,希望不吝赐教,感谢🌹