通过万岁!!!
- 题目:给你一个数组,然后把数组中的最大值和最小值给删掉。这里你可以理解为是一个双端队列进行移除,然后问你最少需要移除掉多少个元素。
- 思路:第一步就是要先找到最大值的下标(maxIdx)和最小值的下标(minIdx),然后我们开始移除就好了。移除的方式有三种,一种是左边移除一部分,右边移除一部分;第二种是都从左边进行移除;第三种是都从右边进行移除。最终结果就是三种方式的最小值就好了。分别进行举例:
- 第一种两边进行移除,直接来一个升序或者降序的数组就好了,那么结果就是从两边各移除一个元素,结果是2。这里需要注意因为我们知道了maxIdx和minIdx,所以在求结果的时候可以用length-abs(maxIdx-minIdx)+1。这里的绝对值是为了找到中间不需要删除的部分。这个+1,因为两边的元素都要移除,所以要+1,如果还是不理解,就找个demo试一下。
- 第二种从左边进行移动,假设nums = {1, 10, 2, 3, 4, 5},那么结果就是max(maxIdx, minIdx)+1,这里+1是因为我们的下标是从0开始的。
- 第三种从右边移动,假设nums = {2, 3, 4, 5, 1, 10},那么结果就是length-min(maxIdx, minIdx),这里不需要+1也是因为下标从0开始。
- 技巧:数组遍历
java代码
java
class Solution {
public int minimumDeletions(int[] nums) {
int max = nums[0], maxIdx = 0, min = nums[0], minIdx = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] > max) {
max = nums[i];
maxIdx = i;
}
if (nums[i] < min) {
min = nums[i];
minIdx = i;
}
}
int lr = nums.length - Math.abs(maxIdx - minIdx) + 1;
int ll = Math.max(maxIdx, minIdx) + 1;
int rr = nums.length - Math.min(maxIdx, minIdx);
return Math.min(Math.min(lr, ll), rr);
}
}
- 总结:题目不是特别难,主要是理解三种情况。其实第一种是两个情况的组合,是最大值在左边和在右边的时候,所以这里需要注意下。