1. 程式人生 > >分治策略求解子陣列最大並返回下標

分治策略求解子陣列最大並返回下標

//尋找最大子陣列的和,分成三種情況來討論
/*
在陣列A[low...high]中,任何連續子陣列A[i...j]的位置有三種
一、完全位於陣列A[low...mid]中,因此low<=i<=j<=mid
二、完全位於陣列A[mid+1...high]中,因此mid<i<=j<=mid
三、跨越了中點,因此low<=i<=mid<j<=high
*/

class FindMaxSubarray
{
public:
	//尋找跨越中點的陣列,得到的是crossLow,crossHigh,crossSum
	void findMaxCrossingSubarray(int *,int,int,int);
	//尋找和最大的子陣列,得到的是lLow,hHigh,sSum,
	void findMaxSubarray(int *,int,int);

	int getLow(){return lLow;}
	int getHigh(){return hHigh;}
	int getSum(){return sSum;}

private:
	int leftLow,leftHigh,leftSum;
	int rightLow,rightHigh,rightSum;
	int crossLow,crossHigh,crossSum;
	
	int lLow,hHigh,sSum;
};

void FindMaxSubarray::findMaxCrossingSubarray(int *sPtr,int low,int mid,int high)
{
	int sum=0;//臨時子陣列和,sum不賦值就蛋疼了!!!!!!!!!!
	
	//mid左邊的最大和
	int left_sum = sPtr[mid];//最接近mid位置的數作為left_sum

	for(int k=mid;k>=low;k--)
	{
		sum = sum + sPtr[k];
		if(sum>left_sum)//尋找mid左邊最大和
		{
			left_sum = sum;
			lLow = k;
		}
	}

	int right_sum = sPtr[mid+1];//最接近mid位置的數作為right_sum
	sum = 0;
	for(int k=mid+1;k<=high;k++)
	{
		sum = sum + sPtr[k];
		if(sum>right_sum)//尋找mid右邊最大和
		{
			right_sum = sum;
			hHigh = k;
		}
	}
    
	//得到跨越mid的字串最大和
	sSum = left_sum + right_sum;
}


void FindMaxSubarray::findMaxSubarray(int * sPtr,int low,int high)
{
	if(low == high)//只有一個元素的起情況
	{
		lLow = low;
		hHigh = high;
		sSum = sPtr[low];
	}
	else
	{
		int mid = (low+high)/2;

		findMaxSubarray(sPtr,low,mid);//找出mid左邊最大陣列和
		leftLow = lLow;
		leftHigh = hHigh;
		leftSum = sSum;

		findMaxSubarray(sPtr,mid+1,high);//找出mid右邊最大陣列和
		rightLow = lLow;
		rightHigh = hHigh;
		rightSum = sSum;

		findMaxCrossingSubarray(sPtr,low,mid,high);//找出跨越mid的最大陣列和
		crossLow = lLow;
		crossHigh = hHigh;
		crossSum = sSum;

		//比較leftSum,rightSum,crossSum的大小來確定sSum
		if((leftSum>=rightSum)&&(leftSum>=crossSum))
		{
			lLow = leftLow;
			hHigh = leftHigh;
			sSum = leftSum;
		}
		else if((rightSum>=leftSum)&&(rightSum>=crossSum))
		{
			lLow = rightLow;
			hHigh = rightHigh;
			sSum = rightSum;
		}
		else
		{
			lLow = crossLow;
			hHigh = crossHigh;
			sSum = crossSum;
		}
 	}
}

相關推薦

分治策略求解陣列返回

//尋找最大子陣列的和,分成三種情況來討論 /* 在陣列A[low...high]中,任何連續子陣列A[i...j]的位置有三種 一、完全位於陣列A[low...mid]中,因此low<=i<=j<=mid 二、完全位於陣列A[mid+1...high]中

迴圈陣列陣列

一。實驗要求 1.輸入一個整型陣列,數組裡有正數也有負數,陣列中一個或多個整陣列成一個整陣列,每個子陣列都有一個和。 2.陣列可以首位相連,允許A【i-1】,....,A[n-2],A[0]........A[j-1]和最大 3.返回最大子陣列的位置,求最大子陣列的和. 二、實驗思路 迴圈陣列,也就

劍指offer:(31)時間效率 :連續陣列

package jianzhioffer; public class Solution31 { //動態規劃:就是將中間值儲存下來 public static int FindGreatestSumOfSubArray(int[] array) { if (array == null

[leetcode]陣列平均數 I

643. 子陣列最大平均數 I 給定 n 個整數,找出平均數最大且長度為 k 的連續子陣列,並輸出該最大平均數。 示例 1: 輸入: [1,12,-5,-6,50,3], k = 4 輸出: 12.75 解釋: 最大平均數 (12-5-6+50)/4 = 51/4 = 12.

連續陣列和O(n)兩種解法:雙指標 動態規劃

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

【劍指offer】連續陣列

題目:在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如:{6,-3,-2,7,-15,1,2,2},連續子向量的最大和為8(從第0個開始,到第3個為止)。給一個數組,返回它的最大連續子序

動態規劃--求目標值問題、找零錢問題以及求連續陣列和 --java

1、動態規劃一般可分為線性動規,區域動規,樹形動規,揹包動規四類。 舉例: 線性動規:攔截導彈,合唱隊形,挖地雷,建學校,劍客決鬥等; 區域動規:石子合併, 加分二叉樹,統計單詞個數,炮兵佈陣等; 樹形動規:貪吃的九頭龍,二分查詢樹,聚會的歡樂,數字三角形等;

牛客網 《劍指Offer》程式設計 30.連續陣列

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

常見演算法 - 連續陣列

public class Solution { public int FindGreatestSumOfSubArray(int[] array) { if(array.length == 0){ return 0; }

131、陣列平均數

題目描述 給定 n 個整數,找出平均數最大且長度為 k 的連續子陣列,並輸出該最大平均數。 示例 1: 輸入: [1,12,-5,-6,50,3], k = 4 輸出: 12.75 解釋: 最大平均數 (12-5-6+50)/4 = 51/4 = 12.75 注意: 1 &l

陣列連續陣列乘積

題目:給定一個數組,要求其連續子陣列的最大和。如陣列為{6,-3,-2,7,-15,1,2,2},連續子陣列的最大和為8(從第0個開始,到第3個為止) 解法1:首先最容易想到的便是利用列舉的方法,枚舉出所有可能大小的連續子陣列的和,然後選出其中最大的一個。即從連續子陣列的大

求某個數組裡連續陣列和的幾個演算法

注意:這裡的陣列元素,有可能全為負。這樣,所謂的: int find_max_array(const vector<int> &a) { int max_sum = 0; int this_sum = 0; fo

陣列陣列的和(Maximum Subarray )

來源:https://leetcode.com/problems/maximum-subarray/#/descriptionFind the contiguous subarray within an array (containing at least one numb

在一個數組中找到連續的陣列的乘積

例如輸入[2,3,-2,4]​ 符合條件的子陣列應該是[2,3],他們的乘積是6 /** * @Author jiangfq * */ package com.test; /** * @author jiangfq * */ public clas

【演算法之陣列(一)】求陣列和的解決方法詳解

題目: 輸入一個整形陣列,數組裡有正數也有負數。 陣列中連續的一個或多個整陣列成一個子陣列,每個子陣列都有一個和。 求所有子陣列的和的最大值。 例如輸入的陣列為1, -2, 3, 10, -4, 7, 2, -5,和最大的子陣列為3, 10, -4, 7, 2, 因此

動態規劃演算法(連續陣列和,O(N)時間複雜度O(1)空間複雜度) 【更新於:2018-05-13】

這個題目最早在13年阿里筆試出現,直到前兩天面試另一家電商又出現,哎,欠的都是要還的。 這個問題的思路如下:一維陣列的下標連續的元素構成連續子陣列,求所有連續子陣列中和最大的那個子陣列。 解析:2018-11-08 1 首先這個問題要轉化為Q(n)的問題,對於Q(n)的

連續陣列

題目描述: 輸入一個整形陣列,數組裡有正數也有負數。 陣列中連續的一個或多個整陣列成一個子陣列,每個子陣列都有一個和。 求所有子陣列的和的最大值。要求時間複雜度為O(n)。 例如輸入的陣列為1, -2, 3, 10, -4, 7, 2, -5,和最大的子陣列為3, 10,

連續陣列和問題

1. 問題描述 輸入一個整形陣列,求陣列中連續的子陣列使其和最大。比如,陣列x 應該返回 x[2..6]的和187. 2. 問題解決 我們很自然地能想到窮舉的辦法,窮舉所有的子陣列的之和,找出最大值。 窮舉法 i, j的for迴圈表示x[i..j],k的for

python實現求連續陣列

問題描述:例如:[6,-3,-2,7,-15,1,2,2]求連續子陣列中的最大和,此陣列中最大和為8,從arr[0]到arr[3]。其餘位置都比這個要小。最大連續子陣列的特點:(1)第一個不為負數(2)如果前面數的累加加上當前數小於當前數,說明這次累加對總體的結果是無效的;如

(java)leetcode852 山脈陣列的封頂索引(二分查詢法找出陣列值的)(Peak Index in a Mountain Array)

題目描述: 我們把符合下列屬性的陣列 A 稱作山脈: A.length >= 3 存在 0 < i < A.length - 1 使得A[0] < A[1] < ... A[i-1] < A