1. 程式人生 > >求最長連續子陣列問題

求最長連續子陣列問題

題意描述:題目意思是說給定一個正數陣列num[]和一個值key,求滿足和為key最長的子陣列的長度【與求連續子陣列的最大和互為姊妹題

解題思路:暴力解法肯定可以求解,如下所示:

int getMaxLengthForce(int[] arr, int k) {
	int res = 0;
	for (int i = 0; i < arr.length; i++) {
		int sum = 0;
		for (int j = i; j < arr.length; j++) {
			sum += arr[j];
			if (sum <= k) {
				res = Math.max(res, j - i + 1);
			}
		}
	}
	return res;
}

但暴力解法的時間複雜度太高。優化解法---引入兩個指標,分別指向子陣列的左邊界和右邊界,當一個子陣列的和等於給定值時就更新最大子陣列的長度,當子陣列和小於給定值時就增加子陣列的右邊界,當子陣列和大於給定值時就增加子陣列的左邊界。程式碼如下:

public int getMaxLength(int[] arr, int k) {
	int[] h = new int[arr.length + 1];
	int sum = 0;
	h[0] = sum;
	for (int i = 0; i != arr.length; i++) {
		sum += arr[i];
		h[i + 1] = Math.max(sum, h[i]);
	}
	sum = 0;
	int res = 0;
	int pre = 0;
	int len = 0;
	for (int i = 0; i != arr.length; i++) {
		sum += arr[i];
		pre = getLessIndex(h, sum - k);
		len = pre == -1 ? 0 : i - pre + 1;
		res = Math.max(res, len);
	}
	return res;
}

public int getLessIndex(int[] arr, int num) {
	int low = 0;
	int high = arr.length - 1;
	int mid = 0;
	int res = -1;
	while (low <= high) {
		mid = (low + high) / 2;
		if (arr[mid] >= num) {
			res = mid;
			high = mid - 1;
		} else {
			low = mid + 1;
		}
	}
	return res;
}




相關推薦

連續陣列問題

題意描述:題目意思是說給定一個正數陣列num[]和一個值key,求滿足和為key最長的子陣列的長度【與求連續子陣列的最大和互為姊妹題】 解題思路:暴力解法肯定可以求解,如下所示: int getMax

python連續陣列

尋找最大子陣列問題: 給定陣列A:尋找A中的和最大的非空連續子陣列。我們稱這樣的連續子陣列為最大子陣列(maximum subarray) 1、暴力求解:兩個迴圈,時間複雜度為O(n^2) 2、用分治策略的求解方法: 假定我們要尋找子陣列A[low...high]的最大子陣列。使用分

演算法之連續陣列

假設給定一陣列{1,4,2,-3,-1,2,5,6,-8,9},我們要求的是最大的連續子序列的和,如果採用暴力破解法的話,那就是遍歷所有的連續子序列了,時間複雜度就是O(N^3)程式碼如下: private int max = Integer.MIN_VALUE; public int ma

連續陣列和的大值

題目描述:給定一個數組A[0,....,n-1],求A的連續子陣列,使得該子陣列的和最大。eg:  1,-2,3,10,-4,7,2,-5的最大子陣列為3,10,-4,7,2演算法分析:記S[i]為以A[i]結尾的陣列中和最大的子陣列,則S[i+1]=max(S[i]+A[i

Algorithm:連續陣列

1、最大連續子陣列 給定一個數組A[0,…,n-1],求A的連續子陣列,使得該子陣列的和最大。 (1)、code暴力法  O(n3) 時間複雜度O(n3) (2)、分治法   O( n*log(n)

連續陣列的和

問題描述 給定一個數組,找出其中最大的連續子陣列的和 如[5,-7,3,-2,6]最長的連續子陣列為[3,-2,6],和為7 問題分析 令sum[i]表示以第i個元素結尾的最大連續子陣列和,maxSum表示最大連續子陣列的和 遞推公式 sum[i]

poj 2774 字尾陣列 連續公共串長度

Long Long Message Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 35480 Accepted: 14218 Case Time Limit: 10

一整型陣列的嚴格單調的連續序列的長度

求最長連續單調子序列 package adk; import java.util.ArrayList; import java.util.Collections; import java.util

golang 陣列連續陣列

直接上程式碼了 //x.1 求數組裡最長連續字陣列 O(n)內 func MaxSerialArr(arr []int) []int { //總長 var max = 0 //集合點 var jointIndex = -1 //結果集

二維陣列連續陣列

#include "stdafx.h" #include "stdio.h" #include "stdlib.h" int _tmain(int argc, _TCHAR* argv[]) { int x[3][3] = {0}; int sum = 0; int max = 0; int

字尾陣列重複

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

[字尾陣列] 兩串公共串 POJ - 2774

Long Long Message Time Limit: 4000MS   Memory Limit: 131072K Total Submissions: 35426 &n

無序陣列中找到連續序列

原始題目: 給定一個無序的整數序列, 找到最長的連續子序列。 例如: 給定[100, 4, 200, 1, 3, 2], 最長的連續子序列是[1, 2, 3, 4]。 第一種解法:不要求時間複雜度,直接排序後比較得到最長子序列。 第二種解法:要求時間複雜度,

面試題,一個整數陣列中和大的連續陣列,例如:[1, 2, -4, 4, 10, -3, 4, -5, 1]的連續陣列是[4, 10, -3, 4](需寫明思路,並程式設計實現)

php實現: function get_max_value($arr) { $max_sum=0;//最大的值 $max_start=0;//和最大子陣列開始下標 $max_end=

【Python】給定一個數組A[0,…,n-1],A的連續陣列,使得該陣列的和

最大子陣列 給定一個數組A[0,…,n-1],求A的連續子陣列,使得該子陣列的和最大。 例如陣列: 1, -2, 3, 10, -4, 7, 2, -5 最大子陣列:3, 10, -4, 7, 2 演算法分析 定義:字首和sum[i

分治法:給定陣列A[1:n]的連續陣列

演算法分析:將陣列從中間分開,則最大子陣列要麼完全在左半邊陣列,要麼在右半邊陣列,要麼跨立在中間的分界點上,如果完全在左或右半邊陣列,用遞迴解決,如果跨立在分界點上,則一定包含左半邊陣列的最大字尾和右半邊陣列的最大字首,因此可以從分界處向前後掃。 複雜度:時間複雜度O(nl

一個數組的連續序列

分析: 如果允許O(nlogn)的複雜度,那麼可以先排序,可是本題要求O(n)。 由於序列裡的元素是無序的,又要求O(n),首先要想到用雜湊表。 用一個雜湊表unordered_map<int,bool> used 記錄每個元素是否使用, 對每個元素,以該

SCU - 4441 Necklace(樹狀數組上升數列)

arranged art 樹狀 max pri nsis names for each cnblogs Necklace frog has \(n\) gems arranged in a cycle, whose beautifulness are \(a_1, a_2,

公共序列

ade empty 全部 str2 comm star 要求 longest strlen 最長公共子序列,英文縮寫為LCS(Longest Common Subsequence)。其定義是。一個序列 S 。假設各自是兩個或多個已知序列的子序列。且是全部符合此條件序列中

O(n log n)上升序列與不下降序列

clas 每一個 for spa pen pan close color style 考慮dp(i)表示新上升子序列第i位數值的最小值.由於dp數組是單調的,所以對於每一個數,我們可以二分出它在dp數組中的位置,然後更新就可以了,最終的答案就是dp數組中第一個出現正無窮的位