LeetCode 2009.使数组连续的最少操作数:去重排序 + 滑动窗口

news/2024/5/20 7:57:24 标签: leetcode, 算法, 排序, 题解, 滑动窗口

【LetMeFly】2009.使数组连续的最少操作数:去重排序 + 滑动窗口

力扣题目链接:https://leetcode.cn/problems/minimum-number-of-operations-to-make-array-continuous/

给你一个整数数组 nums 。每一次操作中,你可以将 nums 中 任意 一个元素替换成 任意 整数。

如果 nums 满足以下条件,那么它是 连续的 :

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

比方说,nums = [4, 2, 5, 3] 是 连续的 ,但是 nums = [1, 2, 3, 5, 6] 不是连续的 。

请你返回使 nums 连续 的 最少 操作次数。

 

示例 1:

输入:nums = [4,2,5,3]
输出:0
解释:nums 已经是连续的了。

示例 2:

输入:nums = [1,2,3,5,6]
输出:1
解释:一个可能的解是将最后一个元素变为 4 。
结果数组为 [1,2,3,5,4] ,是连续数组。

示例 3:

输入:nums = [1,10,100,1000]
输出:3
解释:一个可能的解是:
- 将第二个元素变为 2 。
- 将第三个元素变为 3 。
- 将第四个元素变为 4 。
结果数组为 [1,2,3,4] ,是连续数组。

 

提示:

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

解题方法:去重排序 + 滑动窗口

元素顺序与是否连续无关,相同的元素对于数组的连续是无意义的,因此我们可以直接对原始数组来个去重(可使用哈希表)加排序

接着使用变量l枚举左侧nums[l]作为“连续数组”的最小值,那么这个连续数组的数据范围就应该是nums[l]nums[l] + n - 1n为原始数组的长度)。

使用变量r枚举右侧nums[r]使得r为满足nums[r] <= nums[l] + n - 1的最大r

那么,对于这个lnums[l]nums[r]即为最终“连续数组”可以使用的元素,n减去“可直接使用元素”的个数即为nums[l]作为连续数组最小值时所需的最小操作数。

  • 时间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn)排序耗时 O ( n log ⁡ n ) O(n\log n) O(nlogn)滑动窗口总计耗时 O ( n ) O(n) O(n)
  • 空间复杂度 O ( n ) O(n) O(n)

AC代码

C++
class Solution {
public:
    int minOperations(vector<int>& originalNums) {
        int n = originalNums.size();
        unordered_set<int> differentNums(originalNums.begin(), originalNums.end());
        vector<int> nums(differentNums.begin(), differentNums.end());
        sort(nums.begin(), nums.end());
        int ans = n - 1;
        int r = 0;
        for (int l = 0; l < nums.size(); l++) {
            while (r < nums.size() && nums[r] <= nums[l] + n - 1) {
                r++;
            }
            ans = min(ans, n - (r - l));
        }
        return ans;
    }
};
Python
# from typing import List

class Solution:
    def minOperations(self, nums: List[int]) -> int:
        n = len(nums)
        nums = sorted(set(nums))
        ans = n - 1
        r = 0
        for l in range(len(nums)):
            while r < len(nums) and nums[r] <= nums[l] + n - 1:
                r += 1
            ans = min(ans, n - (r - l))
        return ans

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/137509681


http://www.niftyadmin.cn/n/5476036.html

相关文章

创建型模式--3.工厂模式 【人造恶魔果实工厂2】

1. 简单工厂模式的弊端 在上一节简单工厂模式中&#xff0c;创建了一个工厂类&#xff0c;用于生产需要的对象&#xff0c;但是这种方式有一个弊端&#xff0c;它违反了设计模式中的开放-封闭原则&#xff0c;先来看相关的代码&#xff1a; // 恶魔果实工厂类 enum class Typ…

Oracle容器镜像制作

对于 Oracle 数据库的容器镜像制作&#xff0c;oracle 官方提供了 Dockerfile 文件和制作脚本的&#xff08;https://github.com/oracle/docker-images&#xff09;。这里以 12c 为例看看怎么使用。 下载官方提供的 Dockerfile 文件和制作脚本 $ git clone https://github.com/…

携程API接口与旅游大数据的结合

携程API接口与旅游大数据的结合 随着旅游行业的蓬勃发展&#xff0c;大数据已经成为旅游企业制定战略、优化服务、提升用户体验的重要工具。而携程作为国内领先的在线旅游平台&#xff0c;其API接口为旅游大数据的获取和应用提供了有力的支持。本文将探讨携程API接口与旅游大数…

SQL Sever 2008 安装教程

先从官网下载程序&#xff1a;下载地址 打开上述链接后&#xff0c;点击下载按钮。 就会跳出下面这个界面&#xff0c;如果你的电脑是64位的请选择下图中这两个程序。 下载完成后&#xff0c;在电脑磁盘中找到这两个文件&#xff0c;注意安装的顺序&#xff0c;先安装 SQLEXPR…

OpenAI Sora:浅析文生视频模型Sora以及技术原理简介

一、Sora是什么&#xff1f; Sora官方链接&#xff1a;https://openai.com/sora 视频模型领头羊Runway Gen 2、Pika等AI视频工具&#xff0c;都还在突破几秒内的连贯性&#xff0c;而OpenAI&#xff0c;已经达到了史诗级的纪录。 OpenAI&#xff0c;永远快别人一步&#xff0…

CLIP模型 图片问答

先简短介绍一下CLIP模型&#xff1a; CLIP (Contrastive Language–Image Pretraining) 是由 OpenAI 开发的先进的多模态视觉模型&#xff0c;结合了图像和文本处理能力。 CLIP 模型的主要特色在于它不仅可以理解图像&#xff0c;同时也能理解描述这些图像的文本。通过这样的方…

算法| ss 合并区间

56.合并区间 56.合并区间 /*** param {number[][]} intervals* return {number[][]}*/ // 思路 区间合并 // 数组升序 // 取第一个元素作为pre // for循环遍历 // 条件判断&#xff1a; 如果当前开始大于pre的结尾&#xff0c;则存入pre&#xff0c; 更新pre为当前 // 否则 p…

鸿蒙实现一种仿小红书首页滑动联动效果

前言&#xff1a; DevEco Studio版本&#xff1a;4.0.0.600 效果描述&#xff1a;通过手指滑动列表&#xff0c;控制位置显示效果为&#xff1a;不论列表在什么位置下滑时下图粉色位置布局显示&#xff0c;手指上滑时下图粉色位置布局隐藏。 效果&#xff1a; 原理分析&…