LeetCode刷题笔记

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;
     }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值