Java编程数组中最大子矩阵简便解法实现代码

 更新时间:2018年01月26日 16:33:53   作者:Marksinoberg  
这篇文章主要介绍了Java编程数组中最大子矩阵简便解法实现代码,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下

本文研究的主要是Java编程数组中最大子矩阵的相关内容,具体介绍如下。

遇到一个好人,可以改变一生;遇到一本好书,又何尝不是呢?

最近在翻阅 左程云先生的程序员代码面试指南–IT名企算法与数据结构题目最优解时就非常的有感悟。建议有这方面爱好的博友,也去观摩观摩。

书中讲解的基于栈的数组的最大矩阵的算法很经典,但是博主能力有限,没能彻底的领悟该算法的精髓,但是根据这个思想,博主想出了一种简易的应对该类问题的算法,现概述如下。

核心思想

先来看一张图吧,我们就可以大致的理解了。

如图,每一个轮次都是一次运算,而我们的核心就是针对这每一个轮次的内部的运算。

计算出每一层连续不间断的最大长度

也就是说,我们是最这个数组进行由下至上的轮次计算,然后针对每一轮就可以计算出本轮次可以得出的连续最大子矩阵的面积。然后只需要比较每一个轮次的最大的那个数据,返回就可以求出该数组最大的连续的子矩阵的面积了。

代码

好了,有了上面的核心思想的铺垫,我们就可以着手编写代码了。(虽然我也觉得自己并没有说的很清楚,见谅见谅)。

package stack_and_queue;
/**
 * @author 郭 璞<br>
 *  根据数组来计算连续的最大的矩形区域的面积
 */
public class MaxRectangle {
	public static void main(String[] args) {
		Integer[] arr = { 2, 1, 3, 5, 7, 6, 4 };
		Integer maxRectangle = maxRectangleArea(arr);
		System.out.println("数组中最大的连续的矩形区域的面积为: " + maxRectangle);
	}
	/**
 * @param arr
 * @return 数组中连续矩形区域的最大面积
 */
	private static Integer maxRectangleArea(Integer[] arr) {
		int[] result = new int[arr.length];
		// 对数组进行遍历式的计算,由底向上不间断的连续长度
		for (int i = 1; i <= arr.length; i++) {
			// 当前轮次 中实现对连续长度的累加的临时取值
			int templen = 0;
			// 记录本轮高度下的最大连续长度
			int templen_max = 0;
			// 内层循环应该是从数组首部开始,而从当先层下标开始会导致前面部分数据的丢失
			for (int j = 1; j <= arr.length; j++) {
				if (arr[j - 1] >= i) {
					templen += 1;
					templen_max = templen;
				} else {
					templen = 0;
				}
			}
			result[i - 1] = i * templen_max;
			// System.out.println("第" + i + "层连续不间断的最大长度为:" + templen_max);
		}
		// 求得结果集数组中数值最大的那个数,即为所求连续区域中的最大的矩形域的面积
		int maxArea = 0;
		for (int i = 0; i < result.length; i++) {
			maxArea = maxArea > result[i] ? maxArea : result[i];
		}
		// 将所求得的最大连续矩形域的面积返回
		return maxArea;
	}
}

代码中的注释也比较的全面,就不再过多的赘述了。

测试

下面就对数组进行测试。首先以本文开头图片上所示的数组来进行测试吧。

Integer[] arr = {2,1,3,5,7,6,4}
···

数组中最大的连续的矩形区域的面积为: 16

然后我们修改一下数组中元素的值,来进一步的测试看看结果是否正确。

Integer[] arr = {2,1,3,1,7,6,4}
···

数组中最大的连续的矩形区域的面积为: 12

经博主本人亲自测试,该算法可以正常的工作。 :)

优化部分

说道优化部分,首先我们可以看出的估计便是最后的那步求结果集数组中的最大值了吧。

确实是的,我们其实可以另外申请一个变量,来记录到目前为止的轮次的最大的那个子矩阵的面积的。不过 这点优化而言起到的作用不是很大,时间复杂度也没有什么比较大的改善。

另外一点,我觉的可以比较好的切入点就是对每一个轮次的进行运算的时候添加一个判断,来决定当前轮次之前是否往下循环。如果数组中的元素的波动比较大的话,优化的程度还是很不错的。

总结

这个小算法比较精巧,唯一比较缺憾的地方就是时间复杂度稍微的有点大了。如果读者在寻求一种时间复杂度比较小的算法的话,请绕道咯。

如果只是想寻求一个结果,还是不错的。至少比暴力方式的计算效率高多了。

以上就是本文关于Java编程数组中最大子矩阵简便解法实现代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

相关文章

  • Java排序算法中的快速排序算法实现

    Java排序算法中的快速排序算法实现

    这篇文章主要介绍了Java排序算法中的快速排序算法实现,通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,需要的朋友可以参考下
    2023-12-12
  • Spring cache源码深度解析

    Spring cache源码深度解析

    缓存用于提升系统的性能,特别适用于一些对资源需求比较高的操作,下面这篇文章主要给大家介绍了关于Spring cache源码的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • Mybatis原始执行方式Executor代码实例

    Mybatis原始执行方式Executor代码实例

    这篇文章主要介绍了Mybatis原始执行方式Executor代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • SpringBoot配置Apollo代码实例

    SpringBoot配置Apollo代码实例

    这篇文章主要介绍了SpringBoot配置Apollo代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Spring Security登录表单配置示例详解

    Spring Security登录表单配置示例详解

    这篇文章主要介绍了Spring Security登录表单配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • SWT(JFace) Wizard(Eclipse插件编程必备)

    SWT(JFace) Wizard(Eclipse插件编程必备)

    SWT(JFace)小制作:Wizard(Eclipse插件编程必备)
    2009-06-06
  • Spring占位符Placeholder的实现原理解析

    Spring占位符Placeholder的实现原理解析

    这篇文章主要介绍了Spring占位符Placeholder的实现原理,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • 快速解决idea @Autowired报红线问题

    快速解决idea @Autowired报红线问题

    这篇文章主要介绍了快速解决idea @Autowired报红线问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • Java中的WeakHashMap简析

    Java中的WeakHashMap简析

    这篇文章主要介绍了Java中的WeakHashMap简析,Map 的子类常见的有 HashMap、Hashtable、ConcurrentHashMap、LinkedHashMap 等,WeakHashMap,直译就是,虚弱的 HashMap,从名字可得知其和 HashMap 有关,需要的朋友可以参考下
    2023-09-09
  • idea如何关闭右侧类显示方法

    idea如何关闭右侧类显示方法

    这篇文章主要介绍了idea如何关闭右侧类显示方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07

最新评论