祁彧w博客

  • 🏠首页
  • 📔文章分类
    • 🖥️互联网技术
    • 🧮算法
    • 🤖人工智能
    • 📃论文学习
    • 📸生活分享
  • 💬关于
人生若只如初见
  1. 首页
  2. 算法
  3. 正文

【每日一题】Leetcode 1299. 将每个元素替换为右侧最大元素

2025-02-16 102点热度 0人点赞 0条评论

【每日一题】Leetcode 1299. 将每个元素替换为右侧最大元素

——跳转原题

简单

数组

逆序遍历

给你一个数组 arr ,请你将每个元素用它右边最大的元素替换,如果是最后一个元素,用 -1 替换。

完成所有替换操作后,请你返回这个数组。

示例 1:

输入:arr = [17,18,5,4,6,1]
输出:[18,6,6,6,1,-1]
解释:
- 下标 0 的元素 --> 右侧最大元素是下标 1 的元素 (18)
- 下标 1 的元素 --> 右侧最大元素是下标 4 的元素 (6)
- 下标 2 的元素 --> 右侧最大元素是下标 4 的元素 (6)
- 下标 3 的元素 --> 右侧最大元素是下标 4 的元素 (6)
- 下标 4 的元素 --> 右侧最大元素是下标 5 的元素 (1)
- 下标 5 的元素 --> 右侧没有其他元素,替换为 -1

示例 2:

输入:arr = [400]
输出:[-1]
解释:下标 0 的元素右侧没有其他元素。

提示:

1 <= arr.length <= 10^4
1 <= arr[i] <= 10^5

** 注意:该题 arr 中的元素全部大于0,如果存在小于0的值,则初始化 ans 时的末尾元素不能为 -1

思路 1:(逆序遍历 时间复杂度\(O(n)\))

  1. 对于数组 arr 中的每个元素 arr[i],都替换为 max(arr[i+1], arr[i+2], ..., arr[n-1]),同时 arr[n-1] = -1;
  2. 假设 ans 为最终序列,那么逆序观察:
    ans[n-2] = arr[n-1],
    ans[n-3] = max(arr[n-2], arr[n-1]),
    ans[n-4] = max(arr[n-3], arr[n-2], arr[n-1]),
    ans[n-5] = max(arr[n-4], arr[n-3], arr[n-2], arr[n-1])
    ...
    所以通过归纳,可以得出:
    ans[n-2] = arr[n-1],
    ans[n-3] = max(ans[n-2], arr[n-2]),
    ans[n-4] = max(ans[n-3], arr[n-3]),
    ans[n-5] = max(ans[n-4], arr[n-4])
    ...
    ans[i] = max(ans[i+1], arr[i+1])
  3. 那么创建初始 ans 为 [0, 0, ..., 0, -1],通过逆序遍历 arr ,并设 ans[i] = max(ans[i+1], arr[i+1]) 得到第 i 位的ans。

思路代码 1:(逆序遍历 时间复杂度\(O(n)\))

class Solution:
    def replaceElements(self, arr: List[int]) -> List[int]:
        n = len(arr)
        ans = [0] * (n - 1) + [-1]
        for i in range(n - 2, -1, -1):
            ans[i] = max(ans[i + 1], arr[i + 1])
        return ans

思路 2:(正序遍历,时间复杂度\(O(n)\) ~ \(O(n^2)\))

  1. 如果单纯使用两层 for 嵌套循环将会超时;
  2. 查找从当前位置 cur 起,cur 后续列表的最大值 max_num 及其所在位置 cur_max;
  3. 更新 cur 位置为其右侧最大值的位置 cur_max ,并更新 cur 到 cur_max 之间的值为最大值 max_num
  4. 这样的时间复杂度:
    最差为\(O(n^2)\),例如:[5,4,3,2,1]
    最优为\(O(n)\),例如:[5,1,2,3,4]

代码 2:(正序遍历,时间复杂度\(O(n)\) ~ \(O(n^2)\))

class Solution:
    def replaceElements(self, arr: List[int]) -> List[int]:
        ans = []
        cur = 0
        while cur < len(arr)-1:
            max_num = -1
            cur_max = 0
            for right in range(cur+1, len(arr)):
                if arr[right] >= max_num:
                    max_num = arr[right]
                    cur_max = right

            for i in range(cur_max - cur):
                ans.append(max_num)
            cur = cur_max

        return ans + [-1]

感谢浏览,欢迎关注祁彧w博客!

标签: 逆序遍历
最后更新:2025-02-16

祁彧w

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

最新 热点 随机
最新 热点 随机
影视资源大全/Films & Television Resource Library - 持续更新... 使用ZeroTier进行内网穿透异地组网并搭建moon中转服务器 【每日一题】Leetcode 2595. 奇偶位数 【每日一题】Leetcode 624. 数组列表中的最大距离 【每日一题】Leetcode 2080. 区间内查询数字的频率 【每日一题】Leetcode 1287. 有序数组中出现次数超过25%的元素
影视资源大全/Films & Television Resource Library - 持续更新...
使用ZeroTier进行内网穿透异地组网并搭建moon中转服务器 pandas统计分析基础知识及练习题 【每日一题】Leetcode 2080. 区间内查询数字的频率 【每日一题】Leetcode 624. 数组列表中的最大距离 python数据分析与应用大作业-对用户用电量数据进行数据分析 【每日一题】Leetcode 1287. 有序数组中出现次数超过25%的元素
标签聚合
电视剧 python 可解释性 二分查找 sklearn 电影 数据分析 机器学习
最近评论
祁彧w 发布于 11 个月前(07月11日) 评论测试

COPYRIGHT © 2024 祁彧w. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang