0%

『LeetCode』1051 高度检查器

题目

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

标签

数组, 计数排序, 排序


题解

【高度检查器】简单排序&模拟

排序&模拟

将数组排序再逐一比较即可

1
2
3
4
# Code language: Python
class Solution:
def heightChecker(self, heights: List[int]) -> int:
return sum(i != j for i, j in zip(heights, sorted(heights)))
1
2
3
4
5
6
7
8
9
10
11
12
// Code language: Java
class Solution {
public int heightChecker(int[] heights) {
int[] expected = heights.clone();
Arrays.sort(expected);
int cnt = 0;
for (int i = 0, n = heights.length; i < n; ++i) {
if (heights[i] != expected[i]) ++cnt;
}
return cnt;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
// Code language: C++
class Solution {
public:
int heightChecker(vector<int>& heights) {
vector<int> expected(heights.begin(), heights.end());
sort(expected.begin(), expected.end());
int cnt = 0;
for (int i = 0, n = heights.size(); i < n; ++i) {
if (heights[i] != expected[i]) ++cnt;
}
return cnt;
}
};
  • 时间复杂度: \(O(n \log n)\)
  • 空间复杂度: \(O(1)\)

计数排序&模拟

注意到数据范围只有 100,使用计数排序会快些。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Code language: Python
class Solution:
def heightChecker(self, heights: List[int]) -> int:
expected = [0 for _ in range(107)]
for h in heights:
expected[h] += 1
cnt, p = 0, 1
for h in heights:
while expected[p] == 0:
p += 1
if h != p:
cnt += 1
expected[p] -= 1
return cnt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Code language: Java
class Solution {
public int heightChecker(int[] heights) {
int[] expected = new int[107];
for (int h: heights) expected[h]++;
int cnt = 0;
for (int i = 0, p = 0, n = heights.length; i < n; ++i) {
while(expected[p] == 0) ++p;
if (heights[i] != p) ++cnt;
expected[p]--;
}
return cnt;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Code language: C++
class Solution {
public:
int heightChecker(vector<int>& heights) {
int expected[107];
memset(expected, 0, sizeof(expected));
for (int h: heights) expected[h]++;
int cnt = 0;
for (int i = 0, p = 0, n = heights.size(); i < n; ++i) {
while(expected[p] == 0) ++p;
if (heights[i] != p) ++cnt;
expected[p]--;
}
return cnt;
}
};
  • 时间复杂度: \(O(n + C)\), \(C\) 为常数 \(100\)
  • 空间复杂度: \(O(C)\)

如果对你有帮助的话,请给我点个赞吧~

欢迎前往 我的博客Algorithm - Github 查看更多题解

--- ♥ end ♥ ---

欢迎关注我呀~