**【leetcode 刷题日记-数组-高度检查器】
学校在拍年度纪念照时,一般要求学生按照 非递减 的高度顺序排列。
请你返回能让所有学生以 非递减 高度排列的最小必要移动人数。
注意,当一组学生被选中时,他们之间可以以任何可能的方式重新排序,而未被选中的学生应该保持不动。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/height-checker
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我的解法:
int heightChecker(int* heights, int heightsSize){
int copy[heightsSize];
for(int i = 0; i < heightsSize; i++){
copy[i] = heights[i];
}
for(int i = 0; i < heightsSize; i++){
for(int j = i+1 ; j < heightsSize; j++){
if(heights[i] > heights[j]){
int temp = heights[i];
heights[i] = heights[j];
heights[j] = temp;
}
}
}
int count = 0;
for(int i = 0; i< heightsSize; i++){
if(copy[i] != heights[i]){
count ++;
}
}
return count;
}
**思路:**复制数组->排序->比较两数组的不同(两数组有几个位置上的数不一样,就输出几)
运行时间:4ms
占用内存:5.4MB
网上的优质解法:
// less sort
int cmp(const void*a, const void* b) {
return *(int*)a -* (int*)b;
}
int heightChecker(int* heights, int heightsSize){
if(heights==NULL|heightsSize==0) return 0;
int* tmp = (int*)malloc(sizeof(int)*heightsSize);
for(int i=0;i<heightsSize;i++) {
tmp[i] = heights[i];
}
// qsort
qsort(heights, heightsSize, sizeof(int), cmp);
int cnt =0;
for(int i=0;i<heightsSize;i++) {
if(tmp[i] != heights[i]) cnt++;
}
return cnt;
}
总结
网上这例时间上优于我的解法的原因在于它使用了一个qsort函数把数组直接按照从小到大排序,而我们原本的解法排序这块是用了两次循环,时间复杂度上肯定不理想。
附上qsort函数的用法:
[添加链接描述](https://blog.csdn.net/xyqqwer/article/details/80158267?
来自博主:&代码收割机