【算法】1051. 高度检查器(多语言实现)

90 阅读2分钟

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


1051. 高度检查器:

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

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

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

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

样例 1:

输入:
	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

分析

  • 面对这道算法题目,二当家的陷入了沉思。
  • 翻译一下题意就是按照非递减顺序排序后,有多少个位置上的高度和排序前不一样。
  • 直接拷贝一份高度数据,然后排序,接着遍历比较计数即可,这是最容易想到的方式。
  • 事实上,我们也可以对高度计数,知道每个高度有几个人之后,我们自然知道顺序。

题解

rust

impl Solution {
    pub fn height_checker(heights: Vec<i32>) -> i32 {
        let mut cpy = heights.clone();
        cpy.sort();

        (0..heights.len()).filter(|&i| {
            heights[i] != cpy[i]
        }).count() as i32
    }
}

go

func heightChecker(heights []int) int {
    cpy := append([]int{}, heights...)
    sort.Ints(cpy)

    ans := 0
    for i, h := range heights {
        if h != cpy[i] {
            ans++
        }
    }

    return ans
}

typescript

function heightChecker(heights: number[]): number {
    const cpy = heights.slice().sort((a, b) => a - b);
	return heights.filter((h, i) => h != cpy[i]).length;
};

python

class Solution:
    def heightChecker(self, heights: List[int]) -> int:
        cpy = sorted(heights)
        ans = 0
        for i, h in enumerate(heights):
            if h != cpy[i]:
                ans += 1
        return ans


c

static inline cmp(const void *a, const void *b) {
    return *(int *) a - *(int *) b;
}

int heightChecker(int* heights, int heightsSize){
    int *cpy = (int *) malloc(sizeof(int) * heightsSize);
    memcpy(cpy, heights, sizeof(int) * heightsSize);
    qsort(cpy, heightsSize, sizeof(int), cmp);
    int ans = 0;
    for (int i = 0; i < heightsSize; ++i) {
        if (heights[i] != cpy[i]) {
            ++ans;
        }
    }
    return ans;
}

c++

class Solution {
public:
    int heightChecker(vector<int>& heights) {
        vector<int> cpy(heights);
        sort(cpy.begin(), cpy.end());
        int ans = 0;
        for (int i = 0; i < heights.size(); ++i) {
            if (heights[i] != cpy[i]) {
                ++ans;
            }
        }
        return ans;
    }
};

java

class Solution {
    public int heightChecker(int[] heights) {
        int[] cpy = Arrays.copyOf(heights, heights.length);
        Arrays.sort(cpy);
        int ans = 0;
        for (int i = 0; i < heights.length; ++i) {
            if (heights[i] != cpy[i]) {
                ++ans;
            }
        }
        return ans;
    }
}
class Solution {
    public int heightChecker(int[] heights) {
        // 对高度计数
        int[] cnt = new int[101];
        for (int h : heights) {
            ++cnt[h];
        }

        int idx = 0, ans = 0;
        for (int h = 1; h <= 100; ++h) {// 按顺序遍历高度
            for (int i = 0; i < cnt[h]; ++i) {// 高度的数量
                if (heights[idx] != h) {
                    ++ans;
                }
                // 移动位置
                ++idx;
            }
        }
        return ans;
    }
}

原题传送门:https://leetcode.cn/problems/height-checker/


非常感谢你阅读本文~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文由 二当家的白帽子:https://juejin.cn/user/2771185768884824/posts 博客原创~