1. 程式人生 > >用分治法實現最大子陣列問題(Java)

用分治法實現最大子陣列問題(Java)

終於把這個搞出來了,中間出現了好多小問題,虛擬碼和演算法思想可以參考演算法導論。
package com.alibaba;

public class MaxSubarray
{
	public static void main(String[] args)
	{
		int[] array = { 1, -2, -3, 4, 5, 6, -3, 4, -11 };

		int[] result = MaxSubarray.findMaxSubarray(array, 0, array.length - 1);

		for (int i = 0; i < result.length; i++)
		{
			System.out.println(result[i]);
			
		}

	}

	public static int[] findMaxCrossingSubarray(int[] array, int low, int mid, int high)
	{

		int leftsum = Integer.MIN_VALUE;
		int sum1 = 0;
		int maxleft = 0;

		for (int i = mid; i >= 0; i--)
		{
			sum1 = sum1 + array[i];

			if (sum1 > leftsum)
			{
				leftsum = sum1;
				maxleft = i;
			}
		}

		int rightsum = Integer.MIN_VALUE;
		int sum2 = 0;
		int maxright = 0;

		for (int j = mid + 1; j <= high; j++)
		{
			sum2 = +array[j];

			if (sum2 > rightsum)
			{
				rightsum = sum2;
				maxright = j;
			}
		}
		int[] result = new int[3];

		result[0] = maxleft;
		result[1] = maxright;
		result[2] = leftsum + rightsum;

		return result;
	}

	public static int[] findMaxSubarray(int[] array, int low, int high)
	{
		if (high == low)
		{
			int[] result = { low, high, array[low] };
			return result;
		} else
		{
			int mid = (int) Math.floor((low + high) / 2);
			int[] left = new int[3];
			int[] right = new int[3];
			int[] cross = new int[3];

			left = findMaxSubarray(array, low, mid);
			right = findMaxSubarray(array, mid + 1, high);
			cross = findMaxCrossingSubarray(array, low, mid, high);

			if (left[2] >= right[2] && left[2] >= cross[2])
				return left;
			else if (right[2] >= left[2] && right[2] >= cross[2])
				return right;
			else
				return cross;
		}

	}

}


相關推薦

治法實現大子陣列問題Java

終於把這個搞出來了,中間出現了好多小問題,虛擬碼和演算法思想可以參考演算法導論。package com.alibaba; public class MaxSubarray { public sta

ADA演算法知識Divide and conquer algorithm治法解決大子陣列和問題

[Maximum Subarry Sum] The maximum subarry sum problem takes as input an array of (positive or negative) integers a[1..n] and returns the largest sum o

治法實現最近對問題JAVA

  假設所有點都在集合S中。   1.用S中個點座標的中位數作為分割點,則會得到一個平衡的分割點m,使得子集S1,S2中有個數大致相同的點。   2.選取垂直線x=c(中位線)來作為分割線。   3.遞迴地求出S1和S2中的最近對,假設D1、D2是

《演算法導論》——治法求解大子陣列

《演算法導論》——分治法求解最大子陣列 最大字陣列問題即對某一陣列A,其元素有正有負,找到一個子陣列,其元素是連續的且其和最大。 #include "iostream" using namespace std; struct uin //建立返回值資料結構 { int

[leetcode]治法求解大子序列問題——Java實現

</pre>問題描述:</h1><p></p><p style="margin-top:0px; margin-bottom:10px; color:rgb(51,51,51); font-family:'Helveti

治法求解大子陣列問題

/* 最大子陣列問題 給出每天股票的價格,求出買進和賣出的時間,使得獲利最高。 輸入: P[0~n-1] 輸出: 買進的時間i和賣出的時間j(0<=i<=j<=n-1) */ //分治法求解,將陣列P轉換為陣列A,其中A中每個元素A[i]=P

治法求解大子段和問題

部分 好的 分治法 amp 最大字段和 求解 情況 nbsp 文章 其實網上有很多分治法求最大字段和的文章,但是說實在的,show me the code對於算法初學者來說is cheap 應該改為show me the example ,只有這樣結合概念才能比較好的理解算

leetcode 53 Maximum Subarray 大子陣列的和

題目要求 (高頻題) 給定一個整數陣列nums,找到具有最大和的連續子陣列(包含至少一個數字)並返回其和。 示例 Input: [-2,1,-3,4,-1,2,1,-5,4], Output: 6 Explanation: [4,-1,2,1] has the large

LintCode 大子陣列3種方法

給定一個整數陣列,找到一個具有最大和的子陣列,返回其最大和。 樣例 給出陣列[−2,2,−3,4,−1,2,1,−5,3],符合要求的子陣列為[4,−1,2,1],其最大和為6 方法一:暴力

治法大值C語言

根據分治思路找最大值: #include <stdio.h> int max(int a,int b){ if (a >= b) return a; else return b; } int find_max(int i,int j,int num[]){ int

治法大子段和

#include<iostream> using namespace std; int MaxSubSum(int a[],int left,int right){ int sum=

[luoguP2331] [SCOI2005]大子矩陣DP

不同 clas 同時 復雜度 子矩陣 比較 int cnblogs i++ 傳送門 orz不會做。。。 一個好理解的做法(n^3*k): 分n=1和n=2兩種情況考慮。 n=1時,預處理出前綴和sum[]。 設f[i][j]為到達第i格,已經放了j個子

治法】線性時間選擇

算法思路 ont 位置 劃分 得到 子數組 als lena part 轉自:http://blog.csdn.net/liufeng_king/article/details/8480430 線性時間選擇問題:給定線性序集中n個元素和一個整數k,1≤k≤n,要求找出這n

Vue來實現音樂播放器:自動輪播圖啊

-s AR better hold ons ntp next start upd slider.vue組件的模板部分 <template> <div class="slider" ref="slider"> <div class=

Vue來實現音樂播放器:歌單數據接口分析

QQ 插件 但是 之間 nbsp 跨域問題 前端 代理服務 一點 z這裏如果我們和之前獲取輪播圖的數據一樣來獲取表單的數據 發現根本獲取不到 原因是qq音樂在請求頭裏面加了authority和refer等 但是如果我們通過jsonp實現跨域

51Nod 1158 - 全是1的大子矩陣DP

題目連結 http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1158 【題目描述】 給出1個M*N的矩陣M1,裡面的元素只有0或1,找出M1的一個子矩陣M2,M2中的元素只有1,並且M2的面積是最大的。輸出M2的面

《劍指offer》系列 連續子陣列大和Java

連結 牛客:連續子陣列的最大和 題目描述 HZ偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了:在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊

程式設計練習題:實現大公約數和小公倍數Java

使用輾轉相除法可以快速的實現求最大公約數,而最小公倍數可以通過最大公約數求出。那麼輾轉相除法的原理是什麼呢? 輾轉相除法,又名歐幾里德演算法,是已知最古老的演算法,其可追溯至公元前300年前。

使用指標來實現變長陣列VLA

實現程式碼: #include <cstdio> #include <cstdlib> void usePtoImplementVLA(int SIZE) { scanf("%d", &SIZE); int *pVLA = (int *)malloc(size

全是1的大子矩陣DP

【題目描述】 給出1個M*N的矩陣M1,裡面的元素只有0或1,找出M1的一個子矩陣M2,M2中的元素只有1,並且M2的面積是最大的。輸出M2的面積。 Input 第1行:2個數m,n中間用空格分隔(2 <= m,n <= 500) 第2 - N +