• 【算法leetcode】1051. 高度检查器(rust和go)




    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 处的学生高度不匹配。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    样例 2:

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

    样例 3:

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

    提示:

    • 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
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    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
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    typescript

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

    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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    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;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

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


    非常感谢你阅读本文~
    欢迎【点赞】【收藏】【评论】~
    放弃不难,但坚持一定很酷~
    希望我们大家都能每天进步一点点~
    本文由 二当家的白帽子:https://le-yi.blog.csdn.net/ 博客原创~


  • 相关阅读:
    【智能制造-17】路径规划算法-2
    C4D坐标与渲染
    十一、2023.10.5.计算机网络(end).11
    Arthas应用诊断
    C#脚本CSharpScript
    又又又反转啦!OpenAI吵架吃瓜复盘(1);天才Ilya的精神世界;谷歌帝国的辉煌与腐朽;微软中文提示词教程;Agent是什么 | ShowMeAI日报
    添加、编辑和删除 前后端联调
    Linux 安装Nginx详细图解教程
    docker部署Prometheus+Cadvisor+Grafana实现服务器监控
    八大排序代码——总结
  • 原文地址:https://blog.csdn.net/leyi520/article/details/125779484