LeetCode 53 Maximum Subarray
1.O(n)
class Solution {public: int maxSubArray(vector<int>& nums) { int n=nums.size(); int max=-2147483648; int si=0;//0...i元素和 int sj=0;//0..j元素和 int minsi=0; for(int j=0;j<n;j++) { sj+=nums[j]; if(si<minsi) minsi=si; if(sj-minsi>max)//i..j元素和最大值 max=sj-minsi; si+=nums[j]; } return max; }
};
2.贪心算法 O(n)
class Solution { public: int maxSubArray(vector<int>& nums) { int n=nums.size(); int max=-2147483648; int sum=0; for(int i=0;i<n;i++) { sum+=nums[i]; if(sum>max) max=sum; if(sum<0) sum=0; } return max; } };LeetCode 128. Longest Consecutive Sequence
1.O(n) 哈希表实现
class Solution {public: int longestConsecutive(vector<int>& nums) { if(nums.size()<=0) return nums.size(); unordered_set<int> hash(nums.begin(),nums.end()); int res=1; for(int n:nums) { if(hash.find(n)==hash.end())//哈希表查找 continue; hash.erase(n);//找到后删除该元素 int prev=n-1,next=n+1; while(hash.find(prev)!=hash.end()) hash.erase(prev--); while(hash.find(next)!=hash.end()) hash.erase(next++); res=max(res,next-prev-1); } return res; }};
LeetCode 152. Maximum Product Subarray
1. 双重循环 O(n^2)
class Solution {public: int maxProduct(vector<int>& nums) { int n=nums.size(); int max=-2147483648; for(int start=0;start<n;start++) { int product=1; for(int end=start+1;end<=n;end++) { product*=nums[end-1]; if(product>max) max=product; } } return max; }};
2. O(n) 算法
class Solution {public: int maxProduct(vector<int>& nums) { int n=nums.size(); int product=nums[0]; int rmin,rmax;//保存当前最大值和最小值 rmin=product; rmax=product; for(int i=1;i<n;i++) { if(nums[i]<0) swap(rmin,rmax);//若当前项为负值,则交换当前最大值和最小值 rmin=min(nums[i],rmin*nums[i]); rmax=max(nums[i],rmax*nums[i]); product=max(rmax,product); } return product; }
};
LeetCode 155 Min Stack
class MinStack {private: std::stack<int> stack;//正常的操作 std::stack<int> minstack;//维护最小值 public: /** initialize your data structure here. */ MinStack() { } void push(int x) {
stack.push(x);
if(minstack.empty()||(!minstack.empty()&&x<=minstack.top()))//只有小于顶部元素的值才压栈 minstack.push(x); } void pop() { if(!stack.empty()) { if(stack.top()==minstack.top())//只有在最小值栈顶端的元素才出栈 minstack.pop(); stack.pop(); } } int top() { if(!stack.empty()) return stack.top(); } int getMin() { if(!minstack.empty()) return minstack.top(); }};
LeetCode 394 Decode String
class Solution {public: string decodeString(string s) { stack<string> chars;//存字符串 stack<int> nums;//存数字 string res; int num = 0; for(char c : s) { if(isdigit(c)) { num = num*10 + (c-'0'); } else if(isalpha(c)) { res.push_back(c); } else if(c == '[') { chars.push(res); nums.push(num); res = ""; num = 0; } else if(c == ']') { string tmp = res;//存开始的字符 for(int i = 0; i < nums.top()-1; ++i) { res += tmp; } res = chars.top() + res;//和之前的结果相连 chars.pop(); nums.pop(); } } return res; }};
