Leetcode 1144:递减元素使数组呈锯齿状(超详细的解法!!!)
发布日期:2021-06-29 16:06:14
浏览次数:2
分类:技术文章
本文共 1681 字,大约阅读时间需要 5 分钟。
给你一个整数数组 nums
,每次 操作 会从中选择一个元素并 将该元素的值减少 1。
如果符合下列情况之一,则数组 A
就是 锯齿数组:
- 每个偶数索引对应的元素都大于相邻的元素,即
A[0] > A[1] < A[2] > A[3] < A[4] > ...
- 或者,每个奇数索引对应的元素都大于相邻的元素,即
A[0] < A[1] > A[2] < A[3] > A[4] < ...
返回将数组 nums
转换为锯齿数组所需的最小操作次数。
示例 1:
输入:nums = [1,2,3]输出:2解释:我们可以把 2 递减到 0,或把 3 递减到 1。
示例 2:
输入:nums = [9,6,1,6,2]输出:4
提示:
1 <= nums.length <= 1000
1 <= nums[i] <= 1000
解题思路
这个问题首先不难想到暴力解法,也就是将两种情况模拟一遍取最小值即可
class Solution: def movesToMakeZigzag(self, nums: List[int]) -> int: def helper(data, f): res = 0 for i in range(len(data)-1): pre, cur = i, i + 1 if (f and data[pre] >= data[cur]) or (not f and data[pre] <= data[cur]): if f and data[pre] >= data[cur]: res += data[pre] - data[cur] + 1 data[pre] = data[cur] - 1 else: res += data[cur] - data[pre] + 1 data[cur] = data[pre] - 1 f = not f return res return min(helper(nums[:], True), helper(nums[:], False))
这个问题有一个巧妙的思路。我们首先看这样的例子
1 2 33 2 11 3 2
对于上面三组数我们想让波峰变成波谷需要怎么做?只需要将中间的数变成min(l, r)-1
即可,因为这样操作的次数最小。如果给定的数组就是波谷呢?我们可以这样处理max(0, mid - min(l, r) + 1)
就可以得到最小操作次数。那么当我们考虑第一种情况的时候,我们只需要将所有偶数位置变成波谷即可。对于第二种情况实际上就是波谷变成波峰的问题,我们采用相同的思考方式,并且我们可以这个问题看成是将所有奇数位置变成波谷的问题。此时的问题就非常简单了,_
class Solution: def movesToMakeZigzag(self, nums: List[int]) -> int: nums = [float("inf")] + nums + [float("inf")] res = [0, 0] for i in range(1, len(nums) - 1): res[i % 2] += max(0, nums[i] - min(nums[i - 1], nums[i + 1]) + 1) return min(res)
reference:
我将该问题的其他语言版本添加到了我的
如有问题,希望大家指出!!!
转载地址:https://coordinate.blog.csdn.net/article/details/98478325 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月19日 06时13分56秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Redis的学习之路
2019-04-29
Windows下Redies+GUI安装,使用Jedis与spring boot 整合
2019-04-29
Windows创建本地版本库(1)
2019-04-29
基于java的酒店管理系统的设计与实现
2019-04-29
基于WEB的仓库管理系统的设计与实现
2019-04-29
基于java的web聊天系统
2019-04-29
基于java的俄罗斯方块的设计与实现
2019-04-29
基于java的魂斗罗的设计
2019-04-29
基于java的网页内容管理
2019-04-29
基于java的学生管理系统
2019-04-29
基于java网盘搜索的设计与实现
2019-04-29
基于SSM的仿小米商城源码
2019-04-29
基于SSM的医院人事管理系统的设计与实现
2019-04-29
基于SSM的网上购物系统的设计与开发
2019-04-29
基于SSM框架的BS微博系统的设计与实现
2019-04-29
超市订单管理系统
2019-04-29
基于ssm的民宿网站
2019-04-29
基于JavaWeb的物流管理系统的设计与实现
2019-04-29
基于Java的飞机大战游戏的设计与实现论文
2019-04-29