LeetCode——2091. 从数组中移除最大值和最小值

通过万岁!!!

  • 题目:给你一个数组,然后把数组中的最大值和最小值给删掉。这里你可以理解为是一个双端队列进行移除,然后问你最少需要移除掉多少个元素。
  • 思路:第一步就是要先找到最大值的下标(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);
    }
}
  • 总结:题目不是特别难,主要是理解三种情况。其实第一种是两个情况的组合,是最大值在左边和在右边的时候,所以这里需要注意下。
相关推荐
Rain的Java大神之路14 分钟前
如何保证接口幂等
java·经验分享·后端·面试·架构
吴声子夜歌15 分钟前
Java——数组和集合(一)
java·开发语言
Jesse_EC17 分钟前
一个看不见的字符——CRLF 如何让我的 Docker 初始化脚本"静默失踪"
java·后端
深念Y18 分钟前
Nuxt 项目 Docker 构建:从 pnpm+node 迁移到全 bun
java·前端·docker
学长毕业设计22 分钟前
基于SpringBoot的社区鲜奶订购系统的设计与实现(源码+文档+讲解视频)
java·spring boot·后端
如何取名24 分钟前
结合实际业务进行LRU淘汰算法优化设计(数据库开发日志)
数据库·算法
呆呆敲代码的小Y27 分钟前
【游戏开发】C# 中的迭代器
java·开发语言·c#·迭代器
TinyMemory28 分钟前
Java 面向对象核心入门(六):this 关键字完全解析
java·笔记·面向对象·java新手·this关键字
aichitang202428 分钟前
快乐泛函每一天:希尔伯特空间中的最佳逼近与正交投影定理
人工智能·考研·算法·ai·面试·泛函分析