C++實現(xiàn)LeetCode(53.最大子數(shù)組)
[LeetCode] 53. Maximum Subarray 最大子數(shù)組
Given an integer array nums, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.
Example:
Input: [-2,1,-3,4,-1,2,1,-5,4],
Output: 6
Explanation: [4,-1,2,1] has the largest sum = 6.
Follow up:
If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.
這道題讓求最大子數(shù)組之和,并且要用兩種方法來解,分別是 O(n) 的解法,還有用分治法 Divide and Conquer Approach,這個解法的時間復(fù)雜度是 O(nlgn),那就先來看 O(n) 的解法,定義兩個變量 res 和 curSum,其中 res 保存最終要返回的結(jié)果,即最大的子數(shù)組之和,curSum 初始值為0,每遍歷一個數(shù)字 num,比較 curSum + num 和 num 中的較大值存入 curSum,然后再把 res 和 curSum 中的較大值存入 res,以此類推直到遍歷完整個數(shù)組,可得到最大子數(shù)組的值存在 res 中,代碼如下:
C++ 解法一:
class Solution { public: int maxSubArray(vector<int>& nums) { int res = INT_MIN, curSum = 0; for (int num : nums) { curSum = max(curSum + num, num); res = max(res, curSum); } return res; } };
Java 解法一:
public class Solution { public int maxSubArray(int[] nums) { int res = Integer.MIN_VALUE, curSum = 0; for (int num : nums) { curSum = Math.max(curSum + num, num); res = Math.max(res, curSum); } return res; } }
題目還要求我們用分治法 Divide and Conquer Approach 來解,這個分治法的思想就類似于二分搜索法,需要把數(shù)組一分為二,分別找出左邊和右邊的最大子數(shù)組之和,然后還要從中間開始向左右分別掃描,求出的最大值分別和左右兩邊得出的最大值相比較取最大的那一個,代碼如下:
C++ 解法二:
class Solution { public: int maxSubArray(vector<int>& nums) { if (nums.empty()) return 0; return helper(nums, 0, (int)nums.size() - 1); } int helper(vector<int>& nums, int left, int right) { if (left >= right) return nums[left]; int mid = left + (right - left) / 2; int lmax = helper(nums, left, mid - 1); int rmax = helper(nums, mid + 1, right); int mmax = nums[mid], t = mmax; for (int i = mid - 1; i >= left; --i) { t += nums[i]; mmax = max(mmax, t); } t = mmax; for (int i = mid + 1; i <= right; ++i) { t += nums[i]; mmax = max(mmax, t); } return max(mmax, max(lmax, rmax)); } };
Java 解法二:
public class Solution { public int maxSubArray(int[] nums) { if (nums.length == 0) return 0; return helper(nums, 0, nums.length - 1); } public int helper(int[] nums, int left, int right) { if (left >= right) return nums[left]; int mid = left + (right - left) / 2; int lmax = helper(nums, left, mid - 1); int rmax = helper(nums, mid + 1, right); int mmax = nums[mid], t = mmax; for (int i = mid - 1; i >= left; --i) { t += nums[i]; mmax = Math.max(mmax, t); } t = mmax; for (int i = mid + 1; i <= right; ++i) { t += nums[i]; mmax = Math.max(mmax, t); } return Math.max(mmax, Math.max(lmax, rmax)); } }
到此這篇關(guān)于C++實現(xiàn)LeetCode(53.最大子數(shù)組)的文章就介紹到這了,更多相關(guān)C++實現(xiàn)最大子數(shù)組內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Dijkstra算法最短路徑的C++實現(xiàn)與輸出路徑
今天小編就為大家分享一篇關(guān)于Dijkstra算法最短路徑的C++實現(xiàn)與輸出路徑,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-02-02一篇文章徹底弄懂C++虛函數(shù)的實現(xiàn)機制
C++中的虛函數(shù)的作用主要是實現(xiàn)了多態(tài)的機制,基類定義虛函數(shù),子類可以重寫該函數(shù),在派生類中對基類定義的虛函數(shù)進行重寫時,需要在派生類中聲明該方法為虛方法,這篇文章主要給大家介紹了關(guān)于如何通過一篇文章徹底弄懂C++虛函數(shù)的實現(xiàn)機制,需要的朋友可以參考下2021-06-06C/C++可變參數(shù)函數(shù)的實現(xiàn)
這篇文章主要介紹了C/C++可變參數(shù)函數(shù)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04淺析ORB、SURF、SIFT特征點提取方法以及ICP匹配方法
這篇文章主要為大家介紹了常用的特征點提取方法(ORB、SURF、SIFT)和ICP匹配方法,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2021-12-12C++面試八股文之如何實現(xiàn)strncpy函數(shù)
strncpy函數(shù),主要用做字符串復(fù)制,將于字符從一個位置復(fù)制到另一個位置,那么如何實現(xiàn)一個strncpy函數(shù),下面小編就來和大家簡單講講吧2023-07-07