求最長連續子陣列問題
題意描述:題目意思是說給定一個正數陣列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數組中第一個出現正無窮的位