力扣题目系列:1299. 将每个元素替换为右侧最大元素 -- 一道算法优化入门题
刷题系列博客链接:机试题目
目录
题目及示例
我的题解
题目及示例
给你一个数组 arr ,请你将每个元素用它右边最大的元素替换,如果是最后一个元素,用 -1 替换。
完成所有替换操作后,请你返回这个数组。
示例:
输入:arr = [17,18,5,4,6,1]
输出:[18,6,6,6,1,-1]提示:
1 <= arr.length <= 10^4
1 <= arr[i] <= 10^5来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/replace-elements-with-greatest-element-on-right-side
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我的题解
刚开始就是用了循环和小循环部分选择排序,找出最大值填上。效率很慢。代码如下。图是后来截的图,56ms的是后面的优化代码,其实也就两行。
/*** 刚开始,暴力,没有优化,效率差,几百ms*/
int* replaceElements(int* arr, int arrSize, int* returnSize){*returnSize = arrSize;int max , i, j;for(i = 0; i < arrSize; ++i){max = -1;for(j = i + 1; j < arrSize; ++j){if(arr[j] > max){max=arr[j];}}arr[i] = max;}return arr;
}
这么低的效率,C的14%,把我惊呆了,通过看规律,发现有时候后面最大值是好几个一样的,于是用maxl变量把最大值位置记下来,到它之前,max都不用重新选,直接用,类似于“剪枝”。代码如下,提交之后我又惊呆了,直接C的100%,Good !
/*** 加入优化思想,用常数级的空间换取时间*/
int* replaceElements(int* arr, int arrSize, int* returnSize){*returnSize = arrSize;int max , maxl = -1, i, j;for(i = 0; i < arrSize; ++i){if(i+1 > maxl){ //超过才重新选maxmax = -1;for(j = i + 1; j < arrSize; ++j){if(arr[j] > max){max = arr[j];maxl = j; //记下位置,“剪枝”}}}arr[i] = max;}return arr;
}
后来看了官方题解,发现逆序遍历填数也是很快的,1ms代码,Java超100%。
class Solution {public int[] replaceElements(int[] arr) {int[] target = new int[arr.length];target[arr.length - 1] = -1;int max = arr[arr.length - 1];for (int i = arr.length - 2; i >= 0; i--) {target[i] = max;if(arr[i] > max) {max = arr[i];}}return target;}
}
力扣题目系列:1299. 将每个元素替换为右侧最大元素 -- 一道算法优化入门题相关推荐
- 1299. 将每个元素替换为右侧最大元素
2020-04-21 1.题目描述 将每个元素替换为右侧最大元素 2.题解 从后往前进行遍历,求出最大值即可. 3.题解 class Solution { public:vector<int&g ...
- LeetCode简单题之将每个元素替换为右侧最大元素
题目 给你一个数组 arr ,请你将每个元素用它右边最大的元素替换,如果是最后一个元素,用 -1 替换. 完成所有替换操作后,请你返回这个数组. 示例 1: 输入:arr = [17,18,5,4,6 ...
- leetcode1299. 将每个元素替换为右侧最大元素
给你一个数组 arr ,请你将每个元素用它右边最大的元素替换,如果是最后一个元素,用 -1 替换. 完成所有替换操作后,请你返回这个数组. 示例: 输入:arr = [17,18,5,4,6,1] 输 ...
- 力扣题目——230. 二叉搜索树中第K小的元素
注:本文的代码实现使用的是 JS(JavaScript),为前端中想使用JS练习算法和数据结构的小伙伴提供解题思路. 描述 给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查 ...
- 力扣题目——429. N 叉树的层序遍历
注:本文的代码实现使用的是 JS(JavaScript),为前端中想使用JS练习算法和数据结构的小伙伴提供解题思路. 描述 给定一个 N 叉树,返回其节点值的层序遍历.(即从左到右,逐层遍历). 树的 ...
- 力扣题目——637. 二叉树的层平均值
注:本文的代码实现使用的是 JS(JavaScript),为前端中想使用JS练习算法和数据结构的小伙伴提供解题思路. 描述 给定一个非空二叉树, 返回一个由每层节点平均值组成的数组. 示例: 输入: ...
- 力扣题目——103. 二叉树的锯齿形层序遍历
注:本文的代码实现使用的是 JS(JavaScript),为前端中想使用JS练习算法和数据结构的小伙伴提供解题思路. 描述 给定一个二叉树,返回其节点值的锯齿形层序遍历.(即先从左往右,再从右往左进行 ...
- 力扣题目——107. 二叉树的层序遍历 II
注:本文的代码实现使用的是 JS(JavaScript),为前端中想使用JS练习算法和数据结构的小伙伴提供解题思路. 描述 给定一个二叉树,返回其节点值自底向上的层序遍历. (即按从叶子节点所在层到根 ...
- 《LeetCode力扣练习》剑指 Offer 05. 替换空格 Java
<LeetCode力扣练习>剑指 Offer 05. 替换空格 Java 一.资源 题目: 请实现一个函数,把字符串 s 中的每个空格替换成"%20". 示例 1: 输 ...
- 基本算法总结,力扣题目整理
系统性学习算法,扎实您的打码基本功! 作为算法初学者的我从19年8月份开始在力扣学习算法,到现在AC了700多道题目. 随着打卡题目数量的增多,我发现算法常见考察的知识点大概有十几种,包括:二分,滑动 ...
最新文章
- django引入现有数据库
- 淘宝技术发展(Java时代:脱胎换骨)
- PHP常用方法很有意义的博客网址
- VSDX Annotator for mac(Visio 绘图工具)
- oracle数据库基本语句
- pandas DataFrame方法;dataframe 定义一个数值全为1的列;dataframe创建多列;如何拆分嵌套list存为dataframe;在数据集添加一个新的列
- HP CQ40-512TX不刷BIOS安装XP系统
- ❤️爆肝十二万字《python从零到精通教程》,从零教你变大佬❤️(建议收藏)
- 英国告急!无油可售!加油站大排长龙 | 经济学人早报精选
- easyui datagrid deleteRow(删除行)的BUG
- CEPH告警:health_warn 45 pgs degraded;60 pgs unclean; 45 pgs undersized
- 锐龙R3 2200G和Intel i3-8100选哪个好
- STM32F103ZET6如何驱动DS18B20温度传感器
- Towards Poisoning of Deep Learning Algorithms with Back-gradient Optimization
- 【Android】【UI】解决DialogFragment反复使用引起的并发问题和状态错误问题
- SMB2协议特性之oplock与lease(下
- 量化研究 | CTA择时出场策略指南大全
- 袋鼠云技术荟 | 某客户生产服务器CPU负载异常处理
- 【网络安全】新型网络犯罪攻防技术研究
- 函数的梯度方向和切线方向_方向导数和梯度是什么?