​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数

news/2024/7/2 9:36:45

 目录链接:

力扣编程题-解法汇总_分享+记录-CSDN博客

GitHub同步刷题项目:

https://github.com/September26/java-algorithms

原题链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台


描述:

给你一个下标从 0 开始长度为 n 的数组 nums 。

每一秒,你可以对数组执行以下操作:

  • 对于范围在 [0, n - 1] 内的每一个下标 i ,将 nums[i] 替换成 nums[i] ,nums[(i - 1 + n) % n] 或者 nums[(i + 1) % n] 三者之一。

注意,所有元素会被同时替换。

请你返回将数组 nums 中所有元素变成相等元素所需要的 最少 秒数。

示例 1:

输入:nums = [1,2,1,2]
输出:1
解释:我们可以在 1 秒内将数组变成相等元素:
- 第 1 秒,将每个位置的元素分别变为 [nums[3],nums[1],nums[3],nums[3]] 。变化后,nums = [2,2,2,2] 。
1 秒是将数组变成相等元素所需要的最少秒数。

示例 2:

输入:nums = [2,1,3,3,2]
输出:2
解释:我们可以在 2 秒内将数组变成相等元素:
- 第 1 秒,将每个位置的元素分别变为 [nums[0],nums[2],nums[2],nums[2],nums[3]] 。变化后,nums = [2,3,3,3,3] 。
- 第 2 秒,将每个位置的元素分别变为 [nums[1],nums[1],nums[2],nums[3],nums[4]] 。变化后,nums = [3,3,3,3,3] 。
2 秒是将数组变成相等元素所需要的最少秒数。

示例 3:

输入:nums = [5,5,5,5]
输出:0
解释:不需要执行任何操作,因为一开始数组中的元素已经全部相等。

提示:

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

解题思路:

每次只能修改相邻的,所以决定一个数字多少次可以修改完,则需要找到同一个数字相间隔的最远距离即可。

所以我们首先统计一下每个值所对应的位置,减少遍历次数。

然后遍历每个值所对应的位置集合,找出想间隔最远的距离,这就这个值所需要的最少秒数。求出所有值的最小秒数即可。

 

代码:

public class Solution2808 {

    public int minimumSeconds(List<Integer> nums) {
        Map<Integer, List<Integer>> map = new HashMap<>();
        for (int i = 0; i < nums.size(); i++) {
            List<Integer> integers = map.computeIfAbsent(nums.get(i), k -> new ArrayList<>());
            integers.add(i);
        }
        int abs = 100000;
        for (Integer key : map.keySet()) {
            List<Integer> integers = map.get(key);
            int i = computeMaxDistance(integers, nums.size());
            abs = Math.min(abs, i);
            System.out.println("key:" + key + ",value:" + i);
        }
        return abs;
    }

    private int computeMaxDistance(List<Integer> integers, int length) {
        int distance = 0;
        int lastIndex = integers.get(integers.size() - 1) - length;
        int index = 0;
        while (index < integers.size()) {
            Integer integer = integers.get(index);
            distance = Math.max(distance, (integer - lastIndex) / 2);
            index++;
            lastIndex = integer;
        }
        return distance;
    }
}


http://lihuaxi.xjx100.cn/news/1998774.html

相关文章

她是黄轩前女友,事业巅峰后陷入低谷,整容失败,39岁仍单身。

♥ 为方便您进行讨论和分享&#xff0c;同时也为能带给您不一样的参与感。请您在阅读本文之前&#xff0c;点击一下“关注”&#xff0c;非常感谢您的支持&#xff01; 文 |猴哥聊娱乐 编 辑|徐 婷 校 对|侯欢庭 你是否还记得那个由王艳和黄海冰主演的经典电视剧《武林外史》…

有关UE5在VisualStudio升级后产生C++无法编译的问题及处理方案

哈喽大家好&#xff0c;我是咕噜美乐蒂&#xff0c;很高兴又见面啦&#xff01;最近&#xff0c;许多使用UE5的游戏开发者遇到了一个问题&#xff1a;在Visual Studio升级后&#xff0c;他们的C代码无法编译。这个问题可能是由于UE5工程和VS之间的版本不兼容导致的。本文将深入…

51单片机——感应开关盖垃圾桶

51单片机——感应开关盖垃圾桶 1.定时器点灯 #include "reg52.h"sbit led P3^6;void main() {int cnt 0;led 1;//1. 配置定时器0工作模式位16位计时TMOD 0x01;//2. 给初值&#xff0c;定一个10ms出来TL00x00;TH00xDC;//3. 开始计时TR0 1;TF0 0;while(1){if(T…

在 Ubuntu 上安装 Docker Engine

系列文章目录 前言 要在 Ubuntu 上开始使用 Docker Engine&#xff0c;请确保满足先决条件&#xff0c;然后按照安装步骤进行操作。 一、先决条件 注意事项 如果您使用 ufw 或 firewalld 管理防火墙设置&#xff0c;请注意当您使用 Docker 暴露容器端口时&#xff0c;这些端口…

网络防御保护——课程笔记

一.防火墙 防火墙的主要职责&#xff1a;控制和防护 --- 安全策略 --- 防火墙可以根据安全策略来抓取流量之后做出对应的动作。 防火墙的分类 防火墙的发展进程 防火墙的控制 带内管理 --- 通过网络环境对设备进行控制 --- telnet&#xff0c;ssh&#xff0c;web --- 登录设备…

电动车电池中基于李雅普诺夫增量学习的云边协同

云边计算潜力释放导致云边协同的出现。这种分层体系使人工智能模型能够部署在智能物理环境中。本文提出双数字孪生——在两级通信可用性条件下的数字孪生的新级别,用于电动车电池实时监测和控制。为实现双数字孪生概念,我们 formulizae了一个在线自适应模型规约问题,考虑到产业…

ABAP EXCEL 转 PDF

DATA: application TYPE ole2_object, workbook TYPE ole2_object, sheet TYPE ole2_object. IF iv_pdf IS NOT INITIAL. CREATE OBJECT application ‘EXCEL.APPLICATION’. CALL METHOD OF application ‘WORKBOOKS’ workbook. CALL METHOD OF workbook ‘OPEN’ EXPORTING…

python18-Python的字符串序列相关方法

字符串本质上就是由多个字符组成的,因此程序允许通过索引来操作字符,比如获取指定索引处的字符,获取指定字符在字符串中的位置等。 Python字符串直接在方括号([])中使用索引即可获取对应的字符,字符串中第一个字符的索引为0、第二个字符的索引为1,后面各字符依此类推。 …