|
…
|
||
|---|---|---|
| .. | ||
| README.md | ||
| README_EN.md | ||
| Solution.cpp | ||
| Solution.go | ||
| Solution.java | ||
| Solution.py | ||
| Solution.ts | ||
| Solution2.cpp | ||
| Solution2.go | ||
| Solution2.java | ||
| Solution2.py | ||
| Solution2.ts | ||
README_EN.md
| comments | difficulty | edit_url | rating | source | tags | |||
|---|---|---|---|---|---|---|---|---|
| true | Easy | https://github.com/doocs/leetcode/edit/main/solution/1000-1099/1051.Height%20Checker/README_EN.md | 1303 | Weekly Contest 138 Q1 |
|
1051. Height Checker
Description
A school is trying to take an annual photo of all the students. The students are asked to stand in a single file line in non-decreasing order by height. Let this ordering be represented by the integer array expected where expected[i] is the expected height of the ith student in line.
You are given an integer array heights representing the current order that the students are standing in. Each heights[i] is the height of the ith student in line (0-indexed).
Return the number of indices where heights[i] != expected[i].
Example 1:
Input: heights = [1,1,4,2,1,3] Output: 3 Explanation: heights: [1,1,4,2,1,3] expected: [1,1,1,2,3,4] Indices 2, 4, and 5 do not match.
Example 2:
Input: heights = [5,1,2,3,4] Output: 5 Explanation: heights: [5,1,2,3,4] expected: [1,2,3,4,5] All indices do not match.
Example 3:
Input: heights = [1,2,3,4,5] Output: 0 Explanation: heights: [1,2,3,4,5] expected: [1,2,3,4,5] All indices match.
Constraints:
1 <= heights.length <= 1001 <= heights[i] <= 100
Solutions
Solution 1: Sorting
We can first sort the heights of the students, then compare the sorted heights with the original heights, and count the positions that are different.
The time complexity is O(n \times \log n), and the space complexity is O(n). Where n is the number of students.
Python3
class Solution:
def heightChecker(self, heights: List[int]) -> int:
expected = sorted(heights)
return sum(a != b for a, b in zip(heights, expected))
Java
class Solution {
public int heightChecker(int[] heights) {
int[] expected = heights.clone();
Arrays.sort(expected);
int ans = 0;
for (int i = 0; i < heights.length; ++i) {
if (heights[i] != expected[i]) {
++ans;
}
}
return ans;
}
}
C++
class Solution {
public:
int heightChecker(vector<int>& heights) {
vector<int> expected = heights;
sort(expected.begin(), expected.end());
int ans = 0;
for (int i = 0; i < heights.size(); ++i) {
ans += heights[i] != expected[i];
}
return ans;
}
};
Go
func heightChecker(heights []int) (ans int) {
expected := slices.Clone(heights)
sort.Ints(expected)
for i, v := range heights {
if v != expected[i] {
ans++
}
}
return
}
TypeScript
function heightChecker(heights: number[]): number {
const expected = [...heights].sort((a, b) => a - b);
return heights.reduce((acc, cur, i) => acc + (cur !== expected[i] ? 1 : 0), 0);
}
Solution 2: Counting Sort
Since the height of the students in the problem does not exceed 100, we can use counting sort. Here we use an array cnt of length 101 to count the number of times each height h_i appears.
The time complexity is O(n + M), and the space complexity is O(M). Where n is the number of students, and M is the maximum height of the students. In this problem, M = 101.
Python3
class Solution:
def heightChecker(self, heights: List[int]) -> int:
cnt = [0] * 101
for h in heights:
cnt[h] += 1
ans = i = 0
for j in range(1, 101):
while cnt[j]:
cnt[j] -= 1
if heights[i] != j:
ans += 1
i += 1
return ans
Java
class Solution {
public int heightChecker(int[] heights) {
int[] cnt = new int[101];
for (int h : heights) {
++cnt[h];
}
int ans = 0;
for (int i = 0, j = 0; i < 101; ++i) {
while (cnt[i] > 0) {
--cnt[i];
if (heights[j++] != i) {
++ans;
}
}
}
return ans;
}
}
C++
class Solution {
public:
int heightChecker(vector<int>& heights) {
vector<int> cnt(101);
for (int& h : heights) ++cnt[h];
int ans = 0;
for (int i = 0, j = 0; i < 101; ++i) {
while (cnt[i]) {
--cnt[i];
if (heights[j++] != i) ++ans;
}
}
return ans;
}
};
Go
func heightChecker(heights []int) int {
cnt := make([]int, 101)
for _, h := range heights {
cnt[h]++
}
ans := 0
for i, j := 0, 0; i < 101; i++ {
for cnt[i] > 0 {
cnt[i]--
if heights[j] != i {
ans++
}
j++
}
}
return ans
}
TypeScript
function heightChecker(heights: number[]): number {
const cnt = Array(101).fill(0);
for (const i of heights) {
cnt[i]++;
}
let ans = 0;
for (let j = 1, i = 0; j < 101; j++) {
while (cnt[j]--) {
if (heights[i++] !== j) {
ans++;
}
}
}
return ans;
}