3086.力扣每日一题7/4 Java

news/2024/7/9 6:03:57 标签: leetcode, 算法, java
  • 博客主页:音符犹如代码
  • 系列专栏:算法练习
  • 关注博主,后期持续更新系列文章
  • 如果有错误感谢请大家批评指出,及时修改
  • 感谢大家点赞👍收藏⭐评论✍

 

目录

思路

解题方法

时间复杂度

空间复杂度

Code


思路

  • 首先通过循环计算前缀和 cnt 和前缀乘积和 s ,用于后续计算。
  • 然后遍历数组的每个位置 i 。
  • 计算当前位置 i 周围可以直接利用的 1 的数量,以及还需要的数量 need 。
  • 通过调整尝试找到满足需求的最小操作次数,并更新最终的最小操作次数 ans 。

解题方法

  • 利用前缀和与前缀乘积和来快速计算部分和与乘积和。
  • 通过循环和二分查找来找到满足需求的最小操作次数。

时间复杂度

  • 主要的时间复杂度在于外层的遍历 n 次,以及内部的二分查找,总体时间复杂度为  O(nlogn)

空间复杂度

  • 创建了两个额外的辅助数组 cnt 和 s ,空间复杂度为 O(n)

Code

java">class Solution {
    public long minimumMoves(int[] nums, int k, int maxChanges) {
        int n = nums.length;
        int[] cnt = new int[n + 1];
        long[] s = new long[n + 1];
        for (int i = 1; i <= n; ++i) {
            cnt[i] = cnt[i - 1] + nums[i - 1];
            s[i] = s[i - 1] + i * nums[i - 1];
        }
        long ans = Long.MAX_VALUE;
        for (int i = 1; i <= n; ++i) {
            long t = 0;
            int need = k - nums[i - 1];
            for (int j = i - 1; j <= i + 1; j += 2) {
                if (need > 0 && 1 <= j && j <= n && nums[j - 1] == 1) {
                    --need;
                    ++t;
                }
            }
            int c = Math.min(need, maxChanges);
            need -= c;
            t += c * 2;
            if (need <= 0) {
                ans = Math.min(ans, t);
                continue;
            }
            int l = 2, r = Math.max(i - 1, n - i);
            while (l <= r) {
                int mid = (l + r) >> 1;
                int l1 = Math.max(1, i - mid), r1 = Math.max(0, i - 2);
                int l2 = Math.min(n + 1, i + 2), r2 = Math.min(n, i + mid);
                int c1 = cnt[r1] - cnt[l1 - 1];
                int c2 = cnt[r2] - cnt[l2 - 1];
                if (c1 + c2 >= need) {
                    long t1 = 1L * c1 * i - (s[r1] - s[l1 - 1]);
                    long t2 = s[r2] - s[l2 - 1] - 1L * c2 * i;
                    ans = Math.min(ans, t + t1 + t2);
                    r = mid - 1;
                } else {
                    l = mid + 1;
                }
            }
        }
        return ans;
    }
}

科学是没有国界的,因为它是属于全人类的财富,是照亮世界的火把;但学者属于祖国。——巴斯德


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

相关文章

Java项目总结3

目录 1.抽象类与抽象方法 抽象类的作用&#xff1a; 抽象类和抽象方法的格式&#xff1f; 2.接口 接口设计规则&#xff1a; 接口的定义与使用&#xff1a; ​编辑 接口的换代升级&#xff1a; 3.内部类 内部类的访问特点&#xff1a; 非静态外部类访问内部类 非静态…

达梦数据库kill会话

达梦数据库kill会话 在达梦数据库&#xff08;DM Database&#xff09;中&#xff0c;可以使用 SP_CLOSE_SESSION 存储过程来终止会话。这个存储过程需要提供会话 ID (sid) 作为参数&#xff0c;用于指定哪个会话需要被终止。 下面是使用 SP_CLOSE_SESSION 存储过程的详细步骤…

【重磅】万能模型-直接能换迪丽热巴的模型

万能模型&#xff0c;顾名思义&#xff0c;不用重新训练src&#xff0c;直接可以用的模型&#xff0c;适应大部分原视频脸 模型用法和正常模型一样&#xff0c;但可以跳过训练阶段&#xff01;直接到合成阶段使用该模型 本模型没有做Xseg&#xff0c;对遮挡过多的画面不会自动适…

Decoder-Only、Encoder-Only、Encoder-Decoder 区别

Decoder-Only、Encoder-Only 和 Encoder-Decoder 是三种常见的神经网络架构&#xff0c;主要用于自然语言处理&#xff08;NLP&#xff09;任务。它们在结构和应用上有显著的区别。 1. Decoder-Only 架构 描述&#xff1a; 仅包含解码器部分&#xff0c;没有编码器。 应用&…

FineBI在线学习资源-数据处理

FineBI在线学习资源汇总&#xff1a; 学习资源 视频课程 帮助文档 问答 数据处理学习文档&#xff1a; 相关资料&#xff1a; 故事背景概述-https://help.fanruan.com/finebi6.0/doc-view-1789.html 基础表处理-https://help.fanruan.com/finebi6.0/doc-view-1791.html …

设计模式实现思路介绍

设计模式是在软件工程中用于解决特定问题的典型解决方案。它们是在多年的软件开发实践中总结出来的&#xff0c;并且因其重用性、通用性和高效性而被广泛接受。设计模式通常被分为三种主要类型&#xff1a;创建型、结构型和行为型。 创建型设计模式 创建型设计模式专注于如何创…

dolphinscheduler-搭建本地环境

后端搭建开发环境 一. 基础插件 maven&#xff08;3.9.7&#xff09; maven必须升级到3.9.x版本&#xff0c;不然打包会异常jdk&#xff08;1.8&#xff09;zookeeper&#xff08;3.8.4&#xff09;mysql或者pg&#xff08;使用mysql&#xff09; 二. 代码修改点 链接&…

MySQL的并发控制、事务、日志

目录 一.并发控制 1.锁机制 2.加锁与释放锁 二.事务&#xff08;transactions&#xff09; 1.事物的概念 2.ACID特性 3.事务隔离级别 三.日志 1.事务日志 2.错误日志 3.通用日志 4.慢查询日志 5.二进制日志 备份 一.并发控制 在 MySQL 中&#xff0c;并发控制是确…