用分治法實現最大子陣列問題(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 +