题目
学校在拍年度纪念照时,一般要求学生按照 非递减 的高度顺序排列。
请你返回至少有多少个学生没有站在正确位置数量。该人数指的是:能让所有学生以 非递减 高度排列的必要移动人数。
示例:
输入:[1,1,4,2,1,3]
输出:3
解释:
高度为 4、3 和最后一个 1 的学生,没有站在正确的位置。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/height-checker
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我的代码
class Solution {
public int heightChecker(int[] heights) {
if (heights == null || heights.length == 0) {
return 0;
}
int[] old_heights = new int[heights.length];
for (int i=0; i<heights.length; i++) {
old_heights[i] = heights[i];
}
Arrays.sort(heights);
int count =0;
for (int i=0; i<heights.length; i++) {
if (heights[i] != old_heights[i]) {
count++;
}
}
return count;
}
}
小结
首先我必须承认我这个思路很low,但仍旧是那句话,黑猫白猫抓到耗子就是好猫,我知道它low,但也知道他一定能对。更何况从结果来看也不是那么low。
这个血淋淋的故事充分证明了时空复杂度之间相互制约此消彼长的关系(我就这么一说,别那么较真,大概这个意思)。
然后还是说一下语言上的不适应,首先是Array.sort是一个没有返回值的函数,我却下意识按照python的习惯new了一个新数组准备去接住他的返回值。
再一个是赋值问题,一开始我偷懒打算直接old_heights=heights,但完全忘了这个赋值方法会使得这两个变量共用内存,导致一个改变之后另一个也随之改变。当然,通过提交的代码可以看出来,我站在做题的角度没有允许自己去查过多的资料,只允许自己把脑子里的思路用仅有的知识实现。提交通过后和预料之中的一样,并不是非常的理想。
下面看一下答案区低时间复杂度大佬的方法。
官方更优解
class Solution {
public int heightChecker(int[] heights) {
int res = 0;
int[] h2 = heights.clone();
Arrays.sort(heights);
for(int i = 0; i < heights.length; i++) {
if(heights[i] != h2[i]) {
res++;
}
}
return res;
}
}
果然,和我才想的差不多,差距就体现在知不知道clone()函数上面。果然还是要多写,多用,才能熟练使用这些优秀的方法。
今早醒来觉得不对,时间消耗有没有可能与输入的安全性检测有关呢?测试了一下,确实如此。
(去掉输入合法性检测后用时减少1ms,再改为clone函数后用时再次减少1ms)