力扣53、最大子陣列和
阿新 • • 發佈:2021-12-16
1、雙迴圈(超時)
時間複雜度:O(n^2):n為陣列元素個數
空間複雜度:O(1)
1 int maxSubArray(vector<int>& nums) { 2 int maxnum=nums[0]; 3 int sum=0; 4 for(int i=0;i<nums.size();i++){ 5 sum=0; 6 for(int j=i;j<nums.size();j++){ 7 sum+=nums[j]; 8 if(maxnum<sum) 9 maxnum=sum; 10 } 11 } 12 return maxnum; 13 }
2、動態規劃(84ms,70;66.2MB,38%)
時間複雜度:O(n):n為陣列元素個數
空間複雜度:O(1)
1 int maxSubArray(vector<int>& nums) { 2 int maxnum=nums[0]; 3 int sum=0; 4 //注意這題只是為了得出最大和 5 for(auto x:nums){ 6 //若目前的數值和小於最新的x則將sum更新為最新的x 7 sum=sum+x>x? sum+x:x; 8 maxnum=maxnum>sum? maxnum:sum; 9 } 10 return maxnum; 11 }
3、貪心(92ms,49%;66.2MB,25%)
時間複雜度:O(n):n為陣列元素個數
空間複雜度:O(1)
1 int maxSubArray(vector<int>& nums) { 2 intmaxnum=nums[0]; 3 int sum=0; 4 //即使陣列全為負數,也會在sum歸0前得出一個最大的賦值到maxnum中 5 for(auto x:nums){ 6 sum+=x; 7 maxnum=maxnum>sum? maxnum:sum; 8 if(sum<0) 9 sum=0; 10 } 11 return maxnum; 12 }
4、分治法(看懂了,寫不出)