1. 程式人生 > >最大子陣列差

最大子陣列差

描述
給定一個整數陣列,找出兩個不重疊的子陣列A和B,使兩個子陣列和的差的絕對值|SUM(A) - SUM(B)|最大。

返回這個最大的差值。

子陣列最少包含一個數

樣例
給出陣列[1, 2, -3, 1],返回 6

挑戰
時間複雜度為O(n),空間複雜度為O(n)

思路
構建相應的陣列ForMax[i]表示從nums[0]到nums[i]的子陣列和的最大值,ForMin[i]表示從nums[0]到nums[i]的子陣列和的最小值,RevMax[i]表示從nums[i]到nums[len-1]的子陣列和的最大值,RevMin[i]表示從nums[i]到nums[len-1]的子陣列和的最小值。最終的結果取ForMax[i] - RevMin[i + 1]與RevMax[j] - ForMin[j - 1]的最大值

#ifndef C45_H
#define C45_H
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class Solution {
public:
    /**
    * @param nums: A list of integers
    * @return: An integer indicate the value of maximum difference between two substrings
    */
    int maxDiffSubArrays(vector
<int>
&nums) { // write your code here if (nums.empty()) return 0; int len = nums.size(); //ForMax[i]表示從nums[0]到nums[i]的子陣列和的最大值 //ForMin[i]表示從nums[0]到nums[i]的子陣列和的最小值 //RevMax[i]表示從nums[i]到nums[len-1]的子陣列和的最大值 //RevMin[i]表示從nums[i]到nums[len-1]的子陣列和的最小值
vector<int> ForMax(len), ForMin(len), RevMax(len), RevMin(len); ForMax[0] = nums[0]; ForMin[0] = nums[0]; RevMax[len - 1] = nums[len - 1]; RevMin[len - 1] = nums[len - 1]; int res = INT_MIN; int Max = nums[0], Min = nums[0]; int curMax = nums[0], curMin = nums[0]; for (int i = 1; i < len; ++i) { if (curMax>0) curMax += nums[i]; else curMax = nums[i]; if (curMax > Max) Max = curMax; ForMax[i] = Max; if (curMin < 0) curMin += nums[i]; else curMin = nums[i]; if (curMin < Min) Min = curMin; ForMin[i] = Min; } Max = nums.back(), Min = nums.back(); curMax = Max, curMin = Min; for (int i = len - 2; i >= 0; --i) { if (curMax>0) curMax += nums[i]; else curMax = nums[i]; if (curMax > Max) Max = curMax; RevMax[i] = Max; if (curMin < 0) curMin += nums[i]; else curMin = nums[i]; if (curMin < Min) Min = curMin; RevMin[i] = Min; } //計算ForMax[i] - RevMin[i + 1] for (int i = 0; i < len - 1; ++i) { res = max(res, ForMax[i] - RevMin[i + 1]); } //計算RevMax[i] - ForMin[i - 1] for (int i = len - 1; i > 0; --i) { res = max(res, RevMax[i] - ForMin[i - 1]); } return res; } }; #endif

相關推薦

Lintcode :45. 大子陣列

描述 給定一個整數陣列,找出兩個不重疊的子陣列A和B,使兩個子陣列和的差的絕對值|SUM(A) - SUM(B)|最大。 返回這個最大的差值。 子陣列最少包含一個數 樣例 給出陣列[1, 2, -3, 1],返回 6 挑戰 時間複雜度為O(n),空間複雜度為O(n)

大子陣列

描述 給定一個整數陣列,找出兩個不重疊的子陣列A和B,使兩個子陣列和的差的絕對值|SUM(A) - SUM(B)|最大。 返回這個最大的差值。 子陣列最少包含一個數 樣例 給出陣列[1, 2, -3, 1],返回 6 挑戰 時間複雜度為O(n),空

643. Maximum Average Subarray I 大子陣列平均數

bject ble height r12 for over xpl example padding Given an array consisting of n integers, find the contiguous subarray of given length k

大子陣列/連續數組的大和

HA ati pan AC () 個數 code 少包 CA 問題描述 在一個數組中找出和最大的連續幾個數(至少包含一個數)。 例如: 數組 A[] = [?2, 1, ?3, 4, ?1, 2, 1, ?5, 4],則連續的子序列[4,?1,2,1]有最大的和6。 輸入格

返回一個二維整形陣列中的大子陣列的和(隨機二維整形陣列

一、題目:返回一個二維整數陣列中的最大子陣列的和(隨機二維整形陣列) 二、課題要求: 輸入一個二維整形陣列,數組裡有正數也有負數; 二維陣列中連續的一個子矩陣組成一個子陣列,沒個子陣列都有一個和; 求所有子陣列的和的最大值,要求時間複雜度為O(n)。 三、結對程式設計要求: 兩人結對完成程式設計任

陣列-BAT面試經典試題:絕對眾數,零子陣列大子陣列

1.絕對眾數問題 定義:給定N個數,稱出現次數最多的數為眾數:若某眾數出現的次數大於N/2,稱該眾數為絕對眾數。 如:A={1,2,1,3,2}中,1和2都是眾數,但都不是絕對眾數;A={1,2,1,3,1}中,1是絕對眾數。 已知給定的N個整數存在絕對眾數,以最低的時空負責度計算該

用c++實現環形陣列大子陣列之和(結對)

結對作業 1.分解問題,將環形陣列,剪開變成一個一維陣列。 2.用一維陣列的最大子陣列和解決。 對於一個環形陣列,對每一個一維陣列的表示共有n-1種 原始碼如下: 1 #include<iostream> 2 using namespace std; 3 int max_

用c++實現環形陣列大子陣列之和

分析:   1.將環形陣列,剪開變成一個一維陣列。   2.用一維陣列的最大子陣列和解決。 對於一個環形陣列,表示成一個一維陣列總共有n種。如圖所示: 程式程式碼: 1 #include<iostream> 2 using namespace std; 3 int mai

用c++實現環形陣列大子陣列的和

分析:對環形陣列確定首元素,從而變成一位陣列。因為有n個元素,所以有n種情況 如圖: 程式程式碼: #include<iostream> using namespace std; int max_sum1(int a[],int n) { int max_sum_h=a[0

環形陣列大子陣列求解

    然後再用一維陣列求解最大子陣列的方法即可。值得注意的是,子陣列的長度不可超過n,在我程式中有所體現。最終,因為沒有要求時間複雜度的問題,我選擇 了遍歷的方法求解了此問題。 程式程式碼: 1 #include<iostream> 2 using nam

求一個環形陣列大子陣列的和

假如我們輸入一個一維的陣列,陣列中既有正數也有負數,而且這個陣列首尾相接,就像一個圓圈。陣列中連續的一個或多個整陣列成一個子陣列,每個子陣列都有一個和。求所有子陣列的和的最大值,如何用程式設計的語言實現?設計思想:1.首先定義一個數組與這個陣列的長度,然後輸入這個陣列。2.再定義一個新的陣列,此陣列把第一個陣

能返回一個環形陣列大子陣列的和的小程式

要求: 1.輸入一個整形陣列,數組裡有正數也有負數。 2.陣列中連續的一個或多個整陣列成一個子陣列,每個子陣列都有一個和。 3.求所有子陣列的和的最大值。 思路: 做個專案時,我的想法是基於之前做的“能返回一個整陣列中最大子陣列的和”專案之上,它已經有能找出一個數組中最大子陣列的功能,那麼我要解決的

返回整數陣列大子陣列的值(陣列首尾相連)

應王老師要求,返回子陣列的作業又來啦!這次的陣列是首尾相連的 預計時間:兩小時 實際時間:週四上課15分鐘+週日13:20-14:30 先說一下我的想法,之前的作業都是可以直接遍歷整個陣列,因為陣列的長度是一定的,迴圈結束後就可以獲得到所有子陣列。但是這次作業的前提是陣列首尾相連,遍歷整個陣列是無法結束

返回一個整數陣列大子陣列的和(迴圈)。

要求:輸入一個整形陣列,數組裡有正數也有負數。陣列中連續的一個或多個整陣列成一個子陣列,每個子陣列都有一個和。如果陣列A[0]……A[j-1]首尾相鄰,允許A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。同時返回最大子陣列的位置。求所有子陣列的和的最大值。 思路:在上次實驗的基礎上,

返回整數陣列大子陣列的和

#include<iostream> using namespace std; int max(int a, int b)   {     if 

返回一個整數迴圈陣列大子陣列的和

要求:        輸入一個整形陣列,數組裡有整數也有負數。        陣列中連續的一個或多個整陣列成一個子陣列,每個子陣列都有一個和。       &nbs

題目:返回一個整數陣列大子陣列的和。

要求 1 要求程式必須能處理1000 個元素; 2 每個元素是int32 型別的; 3 輸入一個整形陣列,數組裡有正數也有負數。 4 陣列中連續的一個或多個整陣列成一個子陣列,每個子陣列都有一個和。 5 如果陣列A[0]……A[j-1]首尾相鄰

返回一個首尾相連的整數陣列大子陣列的和數

設計思路:只要找到從A[0]開始和最大的一段(A[0]…..A[j])(0 <= j < n) 以及以A[n-1]結尾的和最大的一段(A[i]…..A[n-1])(0 <= i < n) 該種情況的最大值為A[i]+…..+A[n-1]+A[0]+….+A[j] 如果i <

返回一維整數陣列大子陣列的和

1.要求:(1)輸入一個整形陣列,數組裡有正數也有負數。(2)陣列中連續的一個或多個整陣列成一個子陣列,每個子陣列都有一個和。(3)如果陣列A[0]……A[j-1]首尾相鄰,允許A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。(4)同時返回最大子陣列的位置。(5)求所有子陣列的和的最大

返回一個二維整數陣列中的大子陣列的和

#include<iostream> using namespace std; int max(int a,int b) { if(a>b) {return a; } else {return b; } } int maxsum(int