当前位置: 首页 > news >正文

LeetCode1299

LeetCode1299

目录

  • 题目描述
  • 示例
  • 思路分析
  • 代码段
  • 代码逐行讲解
  • 复杂度分析
  • 总结的知识点
  • 整合
  • 总结

题目描述

给你一个数组 arr,请你将每个元素替换为它右侧最大的元素。如果右侧没有元素,则替换为 -1

完成替换操作后,返回这个数组。


示例

示例 1

输入:

arr = [17, 18, 5, 4, 6, 1]

输出:

[18, 6, 6, 6, 1, -1]

解释:

  • 下标 0 的元素右侧最大元素是 18。
  • 下标 1 的元素右侧最大元素是 6。
  • 下标 2 的元素右侧最大元素是 6。
  • 下标 3 的元素右侧最大元素是 6。
  • 下标 4 的元素右侧最大元素是 1。
  • 下标 5 的元素右侧没有元素,替换为 -1。

示例 2

输入:

arr = [400]

输出:

[-1]

解释:

  • 下标 0 的元素右侧没有元素,替换为 -1。

思路分析

问题核心

我们需要将数组中的每个元素替换为它右侧最大的元素。如果右侧没有元素,则替换为 -1

思路拆解

  1. 从右向左遍历
    • 从数组的末尾开始遍历,可以方便地记录当前元素右侧的最大值。
  2. 更新最大值
    • 在遍历过程中,用一个变量 max 记录当前元素右侧的最大值。
    • 每次更新当前元素为 max,然后更新 max 为当前元素和 max 中的较大值。
  3. 处理边界条件
    • 最后一个元素右侧没有元素,直接替换为 -1

代码段

class Solution {
    public int[] replaceElements(int[] arr) {
        int max = -1;
        int len = arr.length;
        for (int i = len - 1; i >= 0; i--) {
            int temp = arr[i];
            arr[i] = max;
            max = Math.max(max, temp);
        }
        return arr;
    }
}

在这里插入图片描述


代码逐行讲解

1. 初始化最大值

int max = -1;
  • max 用于记录当前元素右侧的最大值,初始值为 -1

2. 获取数组长度

int len = arr.length;
  • len 是数组的长度,用于控制遍历的范围。

3. 从右向左遍历

for (int i = len - 1; i >= 0; i--) {
  • 从数组的最后一个元素开始,向左遍历到第一个元素。

4. 保存当前元素

int temp = arr[i];
  • temp 用于保存当前元素的值,以便后续更新 max

5. 替换当前元素

arr[i] = max;
  • 将当前元素替换为 max,即右侧的最大值。

6. 更新最大值

max = Math.max(max, temp);
  • 更新 max 为当前元素和 max 中的较大值。

7. 返回结果数组

return arr;
  • 返回替换后的数组。

复杂度分析

时间复杂度

  • 我们只需要遍历数组一次,因此时间复杂度为 O(n),其中 n 是数组的长度。

空间复杂度

  • 只使用了常数级别的额外空间,因此空间复杂度为 O(1)

总结的知识点

1. 数组遍历

  • 从右向左遍历数组,可以方便地记录右侧的最大值。

2. 变量更新

  • 使用 max 变量记录当前最大值,并在遍历过程中动态更新。

3. 边界条件处理

  • 最后一个元素右侧没有元素,直接替换为 -1

整合

class Solution {
    public int[] replaceElements(int[] arr) {
        int max = -1; // 初始化最大值
        int len = arr.length; // 数组长度
        for (int i = len - 1; i >= 0; i--) { // 从右向左遍历
            int temp = arr[i]; // 保存当前元素
            arr[i] = max; // 将当前元素替换为右侧最大值
            max = Math.max(max, temp); // 更新最大值
        }
        return arr; // 返回结果数组
    }
}

总结

这段代码通过从右向左遍历数组,并动态更新右侧的最大值,能够更高效地解决问题。

相关文章:

  • 自动创建spring boot应用(eclipse版本)
  • DeepSeek 入门指南
  • 【解决方法】vite-plugin-svg-icons使用中出现问题[vite] Cannot find package ‘fast-glob‘
  • 网络爬虫学习:借助DeepSeek完善爬虫软件,实现模拟鼠标右键点击,将链接另存为本地文件
  • BiRefNet C++ TensorRT (二分类图像分割)
  • MySQL数据库入门到大蛇尚硅谷宋红康老师笔记 高级篇 part 1
  • [原创](Modern C++)现代C++的关键性概念: 妙用std::reference_wrapper, 让std::list容器具有随机访问功能.
  • Zookeeper(54)如何使用Zookeeper的命令行工具?
  • 寒假学习总结
  • 如何解决服务器端口被攻击:全面防护与快速响应
  • 侯捷 C++ 课程学习笔记:设计模式在面向对象开发中的应用
  • Soft Actor-Critic (SAC)算法
  • 嵌入式人工智能应用-第四章 逻辑回归 8
  • unity学习48:动态障碍物 Obstacle 对 NavMesh的影响
  • LearnOpenGL——高级OpenGL(下)
  • 企业级RAG开源项目分享:Quivr、MaxKB、Dify、FastGPT、RagFlow
  • 4.4 使用Datasets.map方法处理数据集:从基础到企业级优化
  • Spring IoC DI:控制反转与依赖注入
  • IGT_GPU_TOOL系列之CRC(一):test_grab_crc
  • SQLMesh 系列教程6- 详解 Python 模型
  • 新华时评:中美经贸会谈为全球经济纾压增信
  • 马上评丨75万采购300元设备,仅仅终止采购还不够
  • 白玉兰奖征片综述丨综艺市场破局焕新,多元赛道重塑价值坐标
  • 上海交大计算机学院成立,设多个拔尖人才特色班
  • 姚洋将全职加盟上海财经大学,担任滴水湖高级金融学院院长
  • 总粉丝破亿!当网络大V遇见硬核科技,互联网时代如何书写上海故事?