【LeetCode】【分治法】連續數列(最大子序和)思路解析和程式碼
連續數列(最大子序和)
個人思路
題意
求連續的最大子序和
個人思路程式碼
O(N)解法
- 遍歷整個陣列,宣告變數ans儲存最大值,sum儲存當前和
- 如果sum加上後一個元素 比後一個元素還小,則認為後一個元素時無效的並捨棄,並令sum值等於後一個元素的值
- 否則就認為後一個元素是有效的,並加到sum上
- 比較當前的sum值和ans的大小
class Solution {
public:
int maxSubArray(vector<int>& nums) {
if(nums.size() == 1){
return nums[0];
}
int ans = nums[0];
int sum = nums[0];
for(int i = 1; i < nums.size(); ++i)
{
if(sum + nums[i] <= nums[i])
{
sum = nums[i];
}
else
{
sum += nums[i];
}
if(sum > ans)
{
ans = sum;
}
}
return ans;
}
};
分治法
- 劃分:將陣列劃分為左右子序列,當劃分到只剩一個元素時,最大子序和就是他本身(即遞迴出口)
- 解決:對劃分的子序列求當前最大子序和(需要處理最大子序和可能在左子序中,也可能在右子序中,也可能在二者之間的某段)
- 回溯:將當前的最大子序和返回
遞迴體:求左右子序列中的最大子序和,並通過比較得到最大子序和,若不在左右子序列中,則需計算出位於中間的最大子序和
遞迴出口:當左右指標相等時(即只剩一個元素時),最大子序和就是他本身,返回該元素
class Solution {
public:
int inf = -1 * 0x3fffffff;
int maxSubSum(vector<int>& nums, int left, int right){
//特判
if(nums.size() == 1){
return nums[0];
}
//遞迴出口
if(left == right){
return nums[left];
}
int mid = (left + right) / 2;
int leftSum = maxSubSum(nums, left, mid);
int rightSum = maxSubSum(nums, mid + 1, right);
//求左子序列的最大欄位和
int sum1 = inf;
int tempLeft = 0;
for (int i = mid; i >= left; --i){
tempLeft += nums[i];
if(tempLeft > sum1){
sum1 = tempLeft;
}
}
//求右子序列的最大欄位和
int sum2 = inf;
int tempRight = 0;
for(int i = mid + 1; i <= right; ++i){
tempRight += nums[i];
if(tempRight > sum2){
sum2 = tempRight;
}
}
//最大子序和在左子序列中
if((sum1 + sum2 < leftSum) && (rightSum < leftSum)){
return leftSum;
}
//最大子序和在右子序列中
if(sum1 + sum2 < rightSum){
return rightSum;
}
//最大子序和在二者之間
return sum1 + sum2;
}
int maxSubArray(vector<int>& nums) {
int len = nums.size();
return maxSubSum(nums, 0, len - 1);
}
};
相關文章
- 最大連續子陣列和(最大子段和)陣列
- 【貪心法】奇數陣列 思路解析和程式碼陣列
- 順序表應用7:最大子段和之分治遞迴法遞迴
- leetcode_最大子序和LeetCode
- 分治法演算法學習(一)——歸併排序、求最大子陣列和演算法排序陣列
- LeetCode53. 最大子陣列和LeetCode陣列
- leetcode最短無序連續子陣列LeetCode陣列
- 網球迴圈賽思路 - 分治法求解(無程式碼)
- 【刷演算法】LeetCode.53-最大子序和演算法LeetCode
- 分治法 && 動態規劃 洛谷P1115 最大子段和動態規劃
- 【刷題筆記】LeetCode-53 最大子陣列和筆記LeetCode陣列
- 數字陣列最值,總和,平均,中位數 未完待續陣列
- 最短無序連續子陣列陣列
- 給定一個整數陣列,找出總和最大的連續數列,並返回總和。陣列
- 53. 最大子陣列和陣列
- 【LeetCode】【連結串列】劍指 Offer 52. 兩個連結串列的第一個公共節點 思路解析和程式碼LeetCode
- hive生成連續的時間和連續的數Hive
- 53. 最大子序和(python3)Python
- 迴圈陣列最大子段和陣列
- 順序表應用8:最大子段和之動態規劃法動態規劃
- 演算法設計--眾數和重數問題(分治法)演算法
- 《Cracking the Coding Interview程式設計師面試金典》----最大連續數列和View程式設計師面試
- 斐波那契數列的分治法計算
- 劍指Offer:JZ30-連續子陣列最大和(解題思路+Java程式碼)陣列Java
- 分治法求眾數和重數(含檔案輸入輸出)
- 最大子陣列和問題的解陣列
- 【力扣】最大子陣列和(貪心)力扣陣列
- [Python手撕]最大子陣列和Python陣列
- 最大連續子陣列和的實現陣列
- 《程式設計珠璣》程式碼之路11:最大子陣列和問題,花式七種解法程式設計陣列
- LeetCode-128-最長連續序列LeetCode
- 求二維陣列中最大子陣列的和陣列
- Leetcode 題解系列 -- 和為s的連續正數序列(滑動視窗)LeetCode
- [演算法練習及思路-程式設計師面試金典(Java解法)]No77連續數列演算法程式設計師面試Java
- 動態規劃求解最大子段和 (兩種寫法+還原最優解)動態規劃
- [LeetCode] Count and Say 計數和讀法LeetCode
- 類化意識能夠解析任意一段連續質數的數列
- 連續順子間隔思路