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

方法一:排序

直接排序的思路比较丝滑:

  1. 排序 arr,令 arr[0] = 1
  2. 遍历 arr,如果 arr[i] - arr[i - 1] > 1,则令 arr[i] = arr[i - 1] + 1
  3. 返回 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. 减小和重新排列数组后的最大元素相关推荐

  1. LeetCode——1846. 减小和重新排列数组后的最大元素(Maximum Element After Decreasing and Rearranging)[中等]——分析及代码(Java)

    LeetCode--1846. 减小和重新排列数组后的最大元素[Maximum Element After Decreasing and Rearranging][中等]--分析及代码[Java] 一 ...

  2. LeetCode 1846. 减小和重新排列数组后的最大元素

    1846. 减小和重新排列数组后的最大元素 Idea 这题其实挺简单的,首先把数组排序,然后按照要求把数组的第一位设置为1,之后遍历整个数组,按照约束条件逐个过滤,对于不符合条件的idx数,把它重置为 ...

  3. 力扣 1846. 减小和重新排列数组后的最大元素(中等)

    题目 给你一个正整数数组 arr .请你对 arr 执行一些操作(也可以不进行任何操作),使得数组满足以下条件: arr 中 第一个 元素必须为 1 . 任意相邻两个元素的差的绝对值 小于等于 1 , ...

  4. [M贪心] lc1846. 减小和重新排列数组后的最大元素(贪心+双周赛51_3)

    文章目录 1. 题目来源 2. 题目解析 1. 题目来源 链接:1846. 减小和重新排列数组后的最大元素 2. 题目解析 思路: 贪心题目猜结论- 结论 1: 一定存在一个最优解是一个单调数组.因为 ...

  5. LeetCode题解(1846):减小和重新排列数组后的最大元素(Python)

    题目:原题链接(中等) 标签:排序.贪心算法 解法 时间复杂度 空间复杂度 执行用时 Ans 1 (Python) O(NlogN)O(NlogN)O(NlogN) O(N)O(N)O(N) 68ms ...

  6. Leetcode每日一题:842.split-array-into-fibonacci-sequenc(将数组拆分成斐波那契序列)

    思路:深度优先搜索,设定最后返回的数组vec,每次搜索只处理一个数,这数可以取1位,也可以取很多位,这取决于前面两个放入vec的数的和(vec只有两个及以下的数时,直接放入),如果无法等于他俩的和,那 ...

  7. Leetcode每日一题:861.score-after-flipping-matrix(反转矩阵后的得分)

    思路:二进制一个高位为1比之后所有低位为1所代表的数字都要大,所以首先要确保每一行的第一位为1,然后在这基础上对于每一列,如果零的个数多于1的个数,将这列翻转: static int dec(vect ...

  8. Leetcode每日一题:659.split-array-into-consecutive-subsequences(分割数组为连续子序列)

    思路:看它贴的标签是贪心算法,我只想到了记录每个数出现的个数,并且还是数组,后来一想如果元素太大导致数组长度很长怎么办,老是想不到hash的方法,也没想到记录以nums[i]结尾的连续子序列个数: 贴 ...

  9. Leetcode每日一题:80.remove-duplicates-from-sorted-array-ii(删除排序数组中的重复项Ⅱ)

    思路:参照评论中的天秀解法,官方题解比较绕,不如这个好:数组删除元素一定要考虑到覆盖法,nums[i++]=n: class Solution {public: int removeDuplicate ...

最新文章

  1. 全麦吐司和普通吐司的区别_全麦面包和普通面包的区别
  2. mysql max和order by_mysql – 为什么MAX()比ORDER BY慢100倍… LIMIT 1?
  3. API设计中防重放攻击
  4. 最容易看懂的汇编语言书籍:汇编语言 王爽
  5. SAP ABAP和C4C,Hybris Commerce里一些性能分析工具
  6. Docker 方式安装 Nexus 私服
  7. Set与WeakSet
  8. 物联网(IoT)会是广告欺诈的一道后门
  9. ios7下弹出新浪微博界面,一出现就消失的问题
  10. 关于新版微信电脑版HOOK的技术经验(WX电脑版3.0)
  11. 智能交通:电子警察系统技术实施方案(ppt)
  12. 转录组分析---Hisat2+StringTie+Ballgown使用
  13. el-input实现防抖
  14. 给宝宝用乳糖酶还在不停地换品牌吗?一文读懂如何正确使用
  15. Python seaborn.barplot绘图将纵轴设置成百分比形式
  16. vim安装配置coc.vim实现语言的自动补全
  17. ArchLinux安装完成登陆时出现login incorrect错误
  18. Ubuntu安装教程1-U盘启动盘制作
  19. R 关于NA的处理办法
  20. java自学能学会吗_自学java能学会吗?有没有捷径能尽快学会?

热门文章

  1. 上海的外环和北京的五环是一样长的
  2. [Elasticsearch exception [type=search_phase_execution_exception, reason=all shards failed]]
  3. 【paddleocr】发票ocr
  4. 发那科机器人寄存器Ar_发那科机器人应用-数值寄存器 R[]
  5. FRDM-KL25Z开发板之殇
  6. java8 strem的collector.toMap根据指定字段分组
  7. 行业 | 什么是电力大数据?电力大数据从哪儿来?
  8. CAD轴测图怎么画?
  9. java对int数组求和
  10. 大朋VR章立:内容红利下,开发者将主导VR市场