LeetCode 每日一题 1846. 减小和重新排列数组后的最大元素
1846. 减小和重新排列数组后的最大元素
给你一个正整数数组 arr 。请你对 arr 执行一些操作(也可以不进行任何操作),使得数组满足以下条件:
- arr 中 第一个 元素必须为 1 。
- 任意相邻两个元素的差的绝对值 小于等于 1 ,也就是说,对于任意的
1 <= i < arr.length
(数组下标从 0 开始),都满足abs(arr[i] - arr[i - 1]) <= 1
。abs(x) 为 x 的绝对值。
你可以执行以下 2 种操作任意次:
- 减小 arr 中任意元素的值,使其变为一个 更小的正整数 。
- 重新排列 arr 中的元素,你可以以任意顺序重新排列。
请你返回执行以上操作后,在满足前文所述的条件下,arr 中可能的 最大值 。
示例 1:
输入:arr = [2,2,1,2,1]
输出:2
解释:
我们可以重新排列 arr 得到 [1,2,2,2,1] ,该数组满足所有条件。
arr 中最大元素为 2 。
示例 2:
输入:arr = [100,1,1000]
输出:3
解释:
一个可行的方案如下:
1. 重新排列 arr 得到 [1,100,1000] 。
2. 将第二个元素减小为 2 。
3. 将第三个元素减小为 3 。
现在 arr = [1,2,3] ,满足所有条件。
arr 中最大元素为 3 。
示例 3:
输入:arr = [1,2,3,4,5]
输出:5
解释:数组已经满足所有条件,最大元素为 5 。
提示:
- 1 <= arr.length <= 105
- 1 <= arr[i] <= 109
方法一:排序
直接排序的思路比较丝滑:
- 排序
arr
,令arr[0] = 1
- 遍历
arr
,如果arr[i] - arr[i - 1] > 1
,则令arr[i] = arr[i - 1] + 1
- 返回
arr[n - 1]
参考代码
public int maximumElementAfterDecrementingAndRearranging(int[] arr) {Arrays.sort(arr);arr[0] = 1;int n = arr.length;for (int i = 1; i < n; i++) {if (arr[i] - arr[i - 1] > 1) {arr[i] = arr[i - 1] + 1;}}return arr[n - 1];
}
执行结果
方法二:计数排序
数组长度为 n,不难发现返回值最大值就为 n
- 用一个长度为 n 的 counts 数组计数,表示每种数字的出现次数,大于 n 的元素按 n 处理,应该返回值最大就是 n。
- 遍历 counts 数组,当 counts[i] == 0,说明这里需要缩小一个数字来填充,且尽可能选择小的数。
- 用一个 miss 变量存储需要填充的数量,miss 的值表示实在无法填充的数量,返回 n - miss 就是答案。
参考代码
public int maximumElementAfterDecrementingAndRearranging(int[] arr) {int n = arr.length;int[] counts = new int[n + 1];for (int x : arr) {counts[Math.min(x, n)]++;}int miss = 0;for (int i = 1; i <= n; i++) {if (counts[i] == 0) {miss++;} else {miss -= Math.min(counts[i] - 1, miss);}}return n - miss;
}
执行结果
LeetCode 每日一题 1846. 减小和重新排列数组后的最大元素相关推荐
- LeetCode——1846. 减小和重新排列数组后的最大元素(Maximum Element After Decreasing and Rearranging)[中等]——分析及代码(Java)
LeetCode--1846. 减小和重新排列数组后的最大元素[Maximum Element After Decreasing and Rearranging][中等]--分析及代码[Java] 一 ...
- LeetCode 1846. 减小和重新排列数组后的最大元素
1846. 减小和重新排列数组后的最大元素 Idea 这题其实挺简单的,首先把数组排序,然后按照要求把数组的第一位设置为1,之后遍历整个数组,按照约束条件逐个过滤,对于不符合条件的idx数,把它重置为 ...
- 力扣 1846. 减小和重新排列数组后的最大元素(中等)
题目 给你一个正整数数组 arr .请你对 arr 执行一些操作(也可以不进行任何操作),使得数组满足以下条件: arr 中 第一个 元素必须为 1 . 任意相邻两个元素的差的绝对值 小于等于 1 , ...
- [M贪心] lc1846. 减小和重新排列数组后的最大元素(贪心+双周赛51_3)
文章目录 1. 题目来源 2. 题目解析 1. 题目来源 链接:1846. 减小和重新排列数组后的最大元素 2. 题目解析 思路: 贪心题目猜结论- 结论 1: 一定存在一个最优解是一个单调数组.因为 ...
- LeetCode题解(1846):减小和重新排列数组后的最大元素(Python)
题目:原题链接(中等) 标签:排序.贪心算法 解法 时间复杂度 空间复杂度 执行用时 Ans 1 (Python) O(NlogN)O(NlogN)O(NlogN) O(N)O(N)O(N) 68ms ...
- Leetcode每日一题:842.split-array-into-fibonacci-sequenc(将数组拆分成斐波那契序列)
思路:深度优先搜索,设定最后返回的数组vec,每次搜索只处理一个数,这数可以取1位,也可以取很多位,这取决于前面两个放入vec的数的和(vec只有两个及以下的数时,直接放入),如果无法等于他俩的和,那 ...
- Leetcode每日一题:861.score-after-flipping-matrix(反转矩阵后的得分)
思路:二进制一个高位为1比之后所有低位为1所代表的数字都要大,所以首先要确保每一行的第一位为1,然后在这基础上对于每一列,如果零的个数多于1的个数,将这列翻转: static int dec(vect ...
- Leetcode每日一题:659.split-array-into-consecutive-subsequences(分割数组为连续子序列)
思路:看它贴的标签是贪心算法,我只想到了记录每个数出现的个数,并且还是数组,后来一想如果元素太大导致数组长度很长怎么办,老是想不到hash的方法,也没想到记录以nums[i]结尾的连续子序列个数: 贴 ...
- Leetcode每日一题:80.remove-duplicates-from-sorted-array-ii(删除排序数组中的重复项Ⅱ)
思路:参照评论中的天秀解法,官方题解比较绕,不如这个好:数组删除元素一定要考虑到覆盖法,nums[i++]=n: class Solution {public: int removeDuplicate ...
最新文章
- 全麦吐司和普通吐司的区别_全麦面包和普通面包的区别
- mysql max和order by_mysql – 为什么MAX()比ORDER BY慢100倍… LIMIT 1?
- API设计中防重放攻击
- 最容易看懂的汇编语言书籍:汇编语言 王爽
- SAP ABAP和C4C,Hybris Commerce里一些性能分析工具
- Docker 方式安装 Nexus 私服
- Set与WeakSet
- 物联网(IoT)会是广告欺诈的一道后门
- ios7下弹出新浪微博界面,一出现就消失的问题
- 关于新版微信电脑版HOOK的技术经验(WX电脑版3.0)
- 智能交通:电子警察系统技术实施方案(ppt)
- 转录组分析---Hisat2+StringTie+Ballgown使用
- el-input实现防抖
- 给宝宝用乳糖酶还在不停地换品牌吗?一文读懂如何正确使用
- Python seaborn.barplot绘图将纵轴设置成百分比形式
- vim安装配置coc.vim实现语言的自动补全
- ArchLinux安装完成登陆时出现login incorrect错误
- Ubuntu安装教程1-U盘启动盘制作
- R 关于NA的处理办法
- java自学能学会吗_自学java能学会吗?有没有捷径能尽快学会?
热门文章
- 上海的外环和北京的五环是一样长的
- [Elasticsearch exception [type=search_phase_execution_exception, reason=all shards failed]]
- 【paddleocr】发票ocr
- 发那科机器人寄存器Ar_发那科机器人应用-数值寄存器 R[]
- FRDM-KL25Z开发板之殇
- java8 strem的collector.toMap根据指定字段分组
- 行业 | 什么是电力大数据?电力大数据从哪儿来?
- CAD轴测图怎么画?
- java对int数组求和
- 大朋VR章立:内容红利下,开发者将主导VR市场