LeetCode 使数组连续的最少操作数

地址:. - 力扣(LeetCode)
难度:困难
题目描述:给你一个整数数组 nums 。每一次操作中,你可以将 nums 中 任意 一个元素替换成 **任意 **整数。
如果 nums 满足以下条件,那么它是 连续的

  • nums 中所有元素都是 互不相同 的。
  • nums 中 最大 元素与 最小 元素的差等于 nums.length - 1 。

比方说,nums = [4, 2, 5, 3] 是 连续的 ,但是 nums = [1, 2, 3, 5, 6] 不是连续的
请你返回使 nums 连续最少 操作次数。

提示:

  • 1 <= nums.length <= 105
  • 1 <= nums[i] <= 109

题解过程

条件1:互不相同,

  • 所以得把相同的数替换掉,并且替换的数不能是数组中存在的数

条件2:最大的元素与最小的元素差 === nums.length(n) - 1

  • 如何确定最大值最小值?
  • 假设最小值为 left最大值 ,那么最大值 right = left+n−1。

问:假设最大最小值确定,那么相同需要替换的数字需要替换成什么?替换的数字可能因为存在数组中又导致重复吗?

答:这种情况是肯定不会存在的,因为 最大值-最小值 === n - 1
也就是说
最大值和最小值直接就差值了n-1
,假设数组紧密排列,两项之间只差值1,得到的数组会是[1,2,3……n],刚好满足最大值 - 最小值 === n-1

反向考虑,假设最后连续的数组的最小值为 left,则最大值 right=left+n−1。
原数组 nums 中,如果有位于 [left,right]中的,如果只出现一次,我们可以对其进行保留;
多次出现时,我们则需要对其进行操作;
不在这个区间的数字,我们也需要对其进行操作,将它们变成其他数字来对这个区间进行补足。
因此,我们需要统计原数组 nums中,位于区间 [left,right]内不同的数字个数 k,而 n−k就是我们需要进行的操作数。

接下来就是需要确定 left,我们可以将原数组 nums所有不同的数字作为 left的候选值,分别计算出 n−k,然后求出最小值。

这样的话,我们可以先将原数组进行去重后排序,然后利用滑动窗口。
滑动窗口左端点的值作为 left,然后向右扩展右端点,窗口的长度即为 k,求出所有可能性下最小的 n−k即可。

例子:[4,2,2,5,3]

例子:[1,10,100,1000]

/**
 * @param {number[]} nums
 * @return {number}
 */
var minOperations = function(nums) {
     const n = nums.length;
     // 去重
     const sortedUniqueNums = [...new Set(nums)];
     // 排序
     sortedUniqueNums.sort((a, b) => a - b);

    let res = n;
    let j = 0;
    for (let i = 0; i < sortedUniqueNums.length; i++) {
        const left = sortedUniqueNums[i]; // 最小值
        const right = left + n - 1; // 最大值
        
        while (j < sortedUniqueNums.length && sortedUniqueNums[j] <= right) {
            // 因为排序过 所以后面的都是不符合要求的 
            //为什么去重不影响结果? 因为n是没去重的结果,减去的是符合要求的数,所以最终结果是对的
            // (i-1)是小于left的值  所以符合要求的结果是j-(i-1) = j-i+1
          res = Math.min(res, n - (j - i + 1));
            j++;
        }
    }
    return res;


};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/529516.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java 错误:Illegal key size

前言 jdk 1.8 错误&#xff1a;Illegal key size Illegal key size分析 这个是由于jdk限制策略&#xff0c;导致只能128位key进行加解密&#xff0c;而256位加解密则抛出异常。 解决办法 下载jar&#xff1a;jar 下载地址 解压 替换%JAVA_HOME%/\jre\lib\security目录下…

专题十二、字符串

字符串 1. 字符串字面量1.1 字符串字面量中的转义序列1.2 延续字符串字面量1.3 如何存储字符串字面量1.4 字符串字面量的操作1.5 字符串字面量与字符常量 2. 字符串变量2.1 初始化字符串变量2.2 字符数组与字符指针 3. 字符串的读和写3.1 用 printf 函数和 puts 函数写字符串3.…

猫头虎分享已解决Error: 成功解决“No module named ‘sklearn‘ (ModuleNotFoundError)“

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 文章目录 猫头虎分享已解决Error: 成功解决"No module named sklearn (ModuleNotFoundError)" &#x1f431;&#x1f989;&#x1f527;摘要正文内容 介绍错误原因分析…

R-Tree的简单介绍

一、R-Tree简介 R-Tree&#xff0c;全称是“Real Tree”&#xff0c;是一种专门为处理多维空间数据&#xff08;尤其是二维空间数据&#xff0c;如地理坐标&#xff09;设计的树形数据结构。 简单来说&#xff0c;它就像是一个特殊的目录&#xff0c;将空间数据按照它们的位置…

【C语言】扫雷小游戏

文章目录 前言一、游戏玩法二、创建文件test.c文件menu()——打印菜单game()——调用功能函数&#xff0c;游戏的实现main()主函数 game.c文件初始化棋盘打印棋盘随机布置雷的位置统计周围雷的个数展开周围一片没有雷的区域计算已排查位置的个数排查雷(包括检测输赢): game.h文…

RK3568---4G模块驱动实验

作者简介&#xff1a; 一个平凡而乐于分享的小比特&#xff0c;中南民族大学通信工程专业研究生在读&#xff0c;研究方向无线联邦学习 擅长领域&#xff1a;驱动开发&#xff0c;嵌入式软件开发&#xff0c;BSP开发 作者主页&#xff1a;一个平凡而乐于分享的小比特的个人主页…

什么是电子邮件组,为什么要使用它们?

在当今时代&#xff0c;电子邮件无处不在&#xff0c;尤其是对于商业活动而言。电子邮件的重要性不容忽视&#xff0c;因为它在沟通中极为高效。然而&#xff0c;电子邮件也存在降低工作效率和阻碍流程的风险。在这种情况下&#xff0c;电子邮件群组就是最佳的解决方案。什么是…

蓝桥杯刷题-15-异或和之和-拆位+贡献法⭐⭐(⊙o⊙)

蓝桥杯2023年第十四届省赛真题-异或和之和 题目描述 给定一个数组 Ai&#xff0c;分别求其每个子段的异或和&#xff0c;并求出它们的和。或者说&#xff0c;对于每组满足 1 ≤ L ≤ R ≤ n 的 L, R &#xff0c;求出数组中第 L 至第 R 个元素的异或和。然后输出每组 L, R 得到…

C++初阶:stack和queue使用及模拟实现

stack的介绍和使用 stack的介绍 堆栈 - C 参考 (cplusplus.com) 翻译 : 1. stack 是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行元素的插入与提取操作。 2. stack 是作为容器适配器被实现的&#xff0c;容器…

基于单片机和ICL7135多档位数字电压表设计

**单片机设计介绍&#xff0c;基于单片机和ICL7135多档位数字电压表设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机和ICL7135的多档位数字电压表设计是一个结合了硬件与软件技术的综合性项目。这种设计旨在实现一…

数据库的基本使用

一、数据库的简介 RDBMS简介&#xff1a; Relational Database Management System,通过表来表示关系类型。当前主要使用两种类型的数据库:关系型数据库和非关系型数据库。所谓的关系型数据库RDBMS是建立在关系模型基础上的数据库&#xff0c;借助于集合代数等数学概念和方法来…

使用手动连接,将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中,在自定义的槽函数中调用关闭函数

使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;密码是否为…

Spingboot落地国际化需求,Springboot按照请求的地区返回信息

文章目录 一、国际化1、概述2、Spring国际化 二、springboot简单使用国际化1、定义MessageSource2、定义message配置文件3、测试 三、根据请求的地区获取信息1、定义message配置文件2、定义配置类3、基础模板工具4、消息模板定义枚举5、测试一下6、总结 一、国际化 1、概述 国…

设计模式-结构型-装饰器模式-decorator

发票基本类 public class Invoice {public void printInvoice() {System.out.println("打印发票正文");} } 发票正文类 public class Decorator extends Invoice {protected Invoice ticket;public Decorator(Invoice ticket) {this.ticket ticket;}Overridepubl…

Java配置自定义校验

1、自定义注解State message、groups、payload package com.zhang.anno;import com.zhang.validartion.StateValidation; import jakarta.validation.Constraint; import jakarta.validation.Payload;import java.lang.annotation.*;import static java.lang.annotation.Eleme…

javaScript中原型链

一、原型链 js 的对象分为普通对象和函数对象。每个对象都有__proto__ 但是只有函数对象 (非箭头函数) 才有 prototype 属性。 new的过程&#xff1a; 1、创建一个空的简单 javaScript对象 2、将空对象的 __proto__连接到该函数的 prototype 3、将函数的this指向新创建的对象…

鲁棒线性模型估计(Robust linear model estimation)

鲁棒线性模型估计 1.RANSAC算法1.1 算法的基本原理1.2 迭代次数N的计算1.3 参考代码 参考文献 当数据中出现较多异常点时&#xff0c;常用的线性回归OLS会因为这些异常点的存在无法正确估计线性模型的参数&#xff1a; W ( X T X ) − 1 X T Y \qquad \qquad W(X^TX)^{-1}X^T…

【docker】Docker 简介

Docker 简介 什么是虚拟化、容器化?为什么要虚拟化、容器化&#xff1f;虚拟化实现方式应用程序执行环境分层虚拟化常见类别虚拟机容器JVM 之类的虚拟机 常见虚拟化实现主机虚拟化(虚拟机)实现容器虚拟化实现容器虚拟化实现原理容器虚拟化基础之 NameSpace 什么是虚拟化、容器…

人体跟随小车(旭日x3派、yolov5、目标检测)

人体跟随小车&#xff08;yolov5、目标检测&#xff09; 前言最终结果接线实现注意 前言 上板运行的后处理使用cython封装了&#xff0c;由于每个版本的yolo输出的形状不一样&#xff0c;这里只能用yolov5-6.2这个版本。 ①训练自己的模型并部署于旭日x3派参考&#xff1a; ht…

RuntimeError: Library cublas64_12.dll is not found or cannot be loaded

运行guillaumekln/faster-whisper-large-v2模型进行语音识别的时候报错了 RuntimeError: Library cublas64_12.dll is not found or cannot be loaded 代码&#xff1a; from faster_whisper import WhisperModelmodel WhisperModel("H:\\model\\guillaumekln\\faster…