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);
    }
}
  • 总结:题目不是特别难,主要是理解三种情况。其实第一种是两个情况的组合,是最大值在左边和在右边的时候,所以这里需要注意下。
相关推荐
海绵宝宝转agent12 小时前
Leetcode二叉树算法个人理解
笔记·学习·算法·leetcode·深度优先
Rain的Java大神之路12 小时前
面试被LeetCode 27(移除元素)问懵?别再用两层 for 循环了:一道“简单题”吃透双指针原地删除,附面试加分话术 + 11 个避坑清单
后端·leetcode·面试
悟天特斯12 小时前
安防一体化:从“各管各的“到“全局联动“
java·大数据·网络·人工智能·物联网
pjj1985413 小时前
YOLO 目标检测算法系列梳理:从 V1 到 V5 的原理演进
算法·yolo·目标检测
70后写java的老码农13 小时前
Spring Boot 3.x + ShardingSphere 5.x + MyBatis-Plus 3.x:订单分库分表实战(含两个踩坑记录)
java
霸道流氓气质13 小时前
AI 翻译插件:翻译记忆级联复用、术语混合检索与结构化质量门禁的 Vue3 + Spring AI 生产级实战
java·人工智能·spring
斯维赤13 小时前
OCR到底是接入第三方API 还是自己封装?
java·ocr
二十七日秋13 小时前
算法刷题笔记「Day 1|四道 OJ 入门题里的深坑」
c语言·汇编·数据结构·c++·笔记·python·算法
码智社13 小时前
Redis 哨兵模式详解:从原理到生产实践
java·redis
晚风叙码13 小时前
Linux 进程概念(下):程序地址空间与虚拟内存
linux·服务器·算法