LeetCode:2009. 使数组连续的最少操作数(排序 Java)

目录

[2009. 使数组连续的最少操作数](#2009. 使数组连续的最少操作数)

题目描述:

实现代码与解析:

[排序 + 去重 + 双指针](#排序 + 去重 + 双指针)

原理思路:

滑动窗口

原理思路:


2009. 使数组连续的最少操作数

题目描述:

给你一个整数数组 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

实现代码与解析:

排序 + 去重 + 双指针

java 复制代码
class Solution {
    public int minOperations(int[] nums) {
        int n =nums.length;
        // 排序
        Arrays.sort(nums);
        // 去重
        int t = 1;
        for (int i = 1; i < n; i++) {
            if (nums[i] != nums[i - 1]) {
                nums[t++] = nums[i];
            }
        }

        int res = n;

        for (int i = 0, j = 0; i < t; i++) {
            while (j < t && nums[j] - nums[i] <= n - 1) {
                j++;
            }
            res = Math.min(res, n - (j - i));
        }

        return res;

    }
}

原理思路:

nums最大 元素与 最小 元素的差等于 nums.length - 1,说明,数组中的数,一定是从最小值连续到最大值且没有重复值

所以,进行排序和去重。枚举最小值,找出在 numsi + n - 1 范围内的个数,不在范围内的就是需要修改的个数。

当然二分也可以求,就是求第一个大于numsi+n−1的位置j。

滑动窗口

java 复制代码
class Solution {
    public int minOperations(int[] nums) {
        int n =nums.length;
        // 排序
        Arrays.sort(nums);
        // 去重
        int t = 1;
        for (int i = 1; i < n; i++) {
            if (nums[i] != nums[i - 1]) {
                nums[t++] = nums[i];
            }
        }

        int res = 0;

        int l = 0;
        for (int r = 0; r < t; r++) {
            while (nums[l] < nums[r] - (n - 1)) {
                l++;
            }
            res = Math.max(res, r - l + 1);
        }
        return n - res;
    }
}

原理思路:

和上面的解法原理相同,只不过这里枚举的最大值,然后不在范围内的通过左端点过滤掉,也就是滑动窗口。

相关推荐
星轨初途21 分钟前
LeetCode 热题 100——day7 接雨水
数据结构·c++·笔记·算法·leetcode·职场和发展
wangjialelele25 分钟前
Spring Cloud 全体系学习笔记(REST、Nacos、Feign、Gateway)
java·spring boot·笔记·学习·spring·spring cloud·gateway
qeen8727 分钟前
【数据结构】搜索二叉树的介绍与算法原理解析及实现
数据结构·c++·学习·算法·模板
weixin_BYSJ198737 分钟前
springboot医疗信息管理系统---附源码17465
java·javascript·spring boot·python·django·flask·php
阳明山水42 分钟前
销量预测的“隐形杀手”:概念漂移与自适应学习实战
人工智能·深度学习·算法·机器学习·架构
xqqxqxxq44 分钟前
吃透 Spring 高频注解(包含SpringMVC Spring Boot)
java·spring boot·spring
都叫我大帅哥1 小时前
Embabel 1.0 Agent Framework 完全指南:从入门到生产级实践
java
szarron1 小时前
HT666 0.6-6GHz 定向高增益手持天线:EMC 测试与频谱定位实战指南
网络·算法·5g·信号处理·射频工程·频谱仪
福大大架构师每日一题1 小时前
agno v2.8.7 发布:顾问模型、精准路线、调度能力全面升级,10项关键修复一次看懂
java·开发语言·数据库
liulilittle1 小时前
反量化:反量化Q8零(q8_0)
人工智能·算法·机器学习·ai·llm