前些天笔者的一位朋友参加面试,参加笔试的时候碰到了一道求二维数组平衡线的算法题,题目是要这样子:
给你一个二维数组,要求打印出所有平衡线的index序号,平衡线的意思是:这个线上面的所有数和下面的所有数之和相等,如:
二维数组:int[][] a = new int[][]{{1,1},{1,2},{1,1},{3,2}};
1 1
1 2
1 1 -------> 平衡线
3 2
怎么解决这个问题呢,那我们先换个思路,先来找找一维数组的平衡点,平衡点就是指这个点之前的所有数之和等于这个点之后的所有数之和。
思路是这样子的:先算出一维数组每个index之前各个数之和(包括index) 去覆盖掉这个一维数组, 然后遍历这个数组,如果某个index前面的那个index值等于数组之和减去
这个index的值,那这个index就是一个平衡点。算法代码如下:
算法的时间复杂度为O(n)
现在我们继续回到二维数组的平衡线问题上面,解决了一维数组的平衡点问题,那解决二维数组的平衡线问题就很简单了,把二维数组转化为一维数组不就解决了这个 问题,算法代码如下:
算法时间复杂度为O(n^2),
欢迎大家提出更好的算法实现