文章目录
前几天公司社招面了几个同学,和其它面试官交流后听到了其中一个同事常用的一个算法题,这道算法题几乎决定了能否通过该面试官,题目比较有意思,是这样的,给定一个数组,求出奇数和偶数个数相同的最长连续子数组,有的同学可能听过这个题目,没有听过的同学可以先自己想想该怎么解决这个问题。
理解题意
这是什么意思呢,假设给定数组[2,2,2,3,4,5,6,7,7,7],那么奇数和偶数个数相同的最长连续子数组是[2,2,3,4,5,6,7,7],这个数组中奇数和个数和偶数的个数相等都是4个。再假设给定数组[1,2,3,4,5,6],那么奇数和偶数个数相同的最长连续子数组是其本身,整个数组奇数和偶数的个数相等是3个,现在你应该明白题目的意思了吧。
思考过程
这个题目我还是第一次听到,因此开始想如果我在面试时遇到这个题目该如何求解呢?我的第一反应是记录奇数和偶数个数是比较繁琐的过程,能不能把问题转化一下呢?
反正是计算奇数或者偶数的个数,那么干脆就先对数组处理一下,把奇数修改为1,把偶数修改为0,那么对于数组[2,2,2,3,4,5,6,7,7,7]经过上述转换后就变为了[0,0,0,1,0,1,0,1,0,1,1,1],然后我们来看看问题是不是变的简单了一些。
实际上有的同学可能已经看出来了,把奇数修改为1,把偶数修改为0并没有简化问题,我们依然需要计算1的个数和0的个数,这样的转换没有达到简化问题的目的。
还有没有更好的转换方法吗,奇数的个数和偶数的个数相同可以等价转换为什么呢?大家可以先自己想一想这个问题。
也许有的同学已经想出来了,上述过程中既然把奇数修改为了1,那么我们可以把偶数修改为-1,这样奇数的个数和偶数的个数相同就等价转换为了这个子数组的和为0,这样的转换极大的简化了问题的求解过程。
因此我们可以看到问题等价转换的思维方式在求解算法这类问题时是非常有用的。
现在我们知道了这个