算法笔试模拟题精解之“奇偶数列”

简介: 对于这道题来说,只需要考虑是奇数还是偶数,而不用理会具体的值。

【在线编程产品介绍】

阿里云开发者社区在线编程:

免费刷题大神器,助你拿到好offer

周赛月赛不停歇,做题还能领奖品

大赛笔试全真题,常做常新有惊喜

点击链接开始产品体验:https://developer.aliyun.com/coding

本文为大家介绍的是“136.奇偶数列”的解法探究。先来看一下题目内容:

题目详情

等级:中等
知识点:DP

查看题目:136.奇偶数列 Tom有一个长度为n(1<=n<=100)的数列,数列中只包含1-n且不重复的数字。

这个数列是一个不完整的数列,意思是说数列中有几个位置是空的,Tom想让你帮他把空的位置填上数字,当然是有要求的,对于一个数列来说,如果相邻两位的数字奇偶性不同,这个数列的权值就+1,请你算出来将空位补上以后,权值最小为多少?对于这个数列,空位用0表示。

输入数列长度n(1<=n<=100)和n个数ai(0<=ai<=n)

输出填上空位以后的数列的最小权值。
示例1
输入:
5
[0,5,0,2,3]
输出:
2
注意:
对于样例解释说明,符合题意的数列可以为1 5 4 2 3

解题思路一:贪心算法

对于这道题来说,只需要考虑是奇数还是偶数,而不用理会具体的值。

下面用0代表偶数,1代表奇数,-1表示空位。

这道题对应的空位只有下面5种情况(连续空位的不同个数没有影响):
1、空位在左右两侧(以左侧举例)-10也就是最边上是连续的空位,然后接一个偶数;
2、空位在左右两侧(以左侧举例)-11也就是最边上是连续的空位,然后接一个奇数;
3、空位在中间,两侧都是奇数1-11;
4、空位在中间,两侧都是偶数0-10;
5、空位在中间,两侧一奇一偶0-11。

计算在5种情况下对应最少可能增加的权值

1、可能增加0(填偶数)或1(偶数不够,要填奇数)
2、可能增加0或1与上面对应
3、可能0(填奇数)或2(奇数不够填偶数)
4、可能0或2与上面对应
5、只能为1

给5种空位重要性排序(确定贪心策略)
第5种,因为不管填什么都增加1,所以排在最后
第3,4种,因为填错了会增加2,比一二种多,所以排第一(相同情况按照空位个数排序,越少越靠前)
第1,2种,排在3,4后面。

计算过程
1、遍历一次,从原数组中提取出这5种空位,同时计算没有填入的奇数偶数分别为多少个
2、按照(3,4)(1,2)(5)分成三组,对前两组按照空位从少到多排序
3、按照贪心策略的顺序
先判断(3,4)中有多少可以增加0的,并消耗掉对应的奇数偶数个数,增加为2的直接跳过,不消耗个数。

然后判断(1,2)中有多少可以增加0的,并消耗掉对应的奇数偶数个数,增加为1的直接跳过,不消耗个数。

最后计算(3,4)剩下的个数*2+(1,2)中剩下的个数*1+(5)中剩下的个数*1

解题思路二:动态规划

样例是0 5 0 2 3,那么两个空位只能填1或者4,所以有1 5 4 2 3和4 5 1 2 3两种情况。

由于前者的权值要小于后者的权值,所以1 5 4 2 3是最优解,如果我们考虑贪心的做法会有很多的情况要讨论,而且也避免不了一些冲突。

我们可以将问题抽象一下,其实就是求对于当前这一个位置之前有多少个奇偶对,可以进一步转换成求前一位的奇偶性,不妨考虑动态规划

我们设dpi[k],其中i表示当前所在第i位,j表示前i位一共有j个奇数(那么就有i-j个偶数),k只能为0或1,当k为0表示第i位放0,k为1表示第i位放1,然后我们同时更新第i位放0和放1的情况的最小值。

那么对于当前的位来说如果填偶数就有dpi[0] = min(dpi-1[0], dpi-1[1] + 1),如果填奇数就有dpi[1] = min(dpi-1[0] + 1, dpi-1[1]),最终的状态就是min(dpn[1], dpn[0])。
image.png
时间复杂度:O(2n^2)
空间复杂度:2n^2+n

看完之后是不是有了答题思路了呢,快来练练手吧:136.奇偶数列

b462f1d86b44481ca24c0ad63fe55948.png

相关文章
|
3月前
|
机器学习/深度学习 算法 测试技术
【动态规划】C++算法:446等差数列划分 II - 子序列
【动态规划】C++算法:446等差数列划分 II - 子序列
|
3月前
|
算法
【算法优选】 动态规划之斐波那契数列模型
【算法优选】 动态规划之斐波那契数列模型
|
4月前
|
算法
电子好书发您分享《超全算法笔试 模拟题精解合集》
电子好书发您分享《超全算法笔试 模拟题精解合集》
26 3
|
4月前
|
算法
电子好书发您分享《超全算法笔试 模拟题精解合集》
电子好书发您分享《超全算法笔试 模拟题精解合集》
26 2
|
2月前
|
算法
算法沉淀 —— 动态规划篇(斐波那契数列模型)
算法沉淀 —— 动态规划篇(斐波那契数列模型)
24 0
|
3月前
|
编解码 算法 前端开发
往年 | 大疆雷达算法校招笔试题目解析
往年 | 大疆雷达算法校招笔试题目解析
45 1
|
6月前
|
算法
压缩算法 【腾讯2020校园招聘-后台&综合-第一次笔试 】
压缩算法 【腾讯2020校园招聘-后台&综合-第一次笔试 】
30 0
|
7月前
|
算法
趣味算法-神奇的兔子数列
趣味算法-神奇的兔子数列
|
8月前
|
算法
数列极差(大根堆的删和贪心算法模板)
数列极差(大根堆的删和贪心算法模板)
32 0
|
8月前
|
机器学习/深度学习 算法
蓝桥杯:递推算法 递归算法 例题:斐波纳契数列
蓝桥杯:递推算法 递归算法 例题:斐波纳契数列
41 0