Leetcode(无重复字符的最长子串;缺失的第一个正数;最大子序和)

 
 
// stack::top
#include <iostream>       // std::cout
#include <stack>          // std::stack

class Solution {
public:
    int reverse(int x) {
        int result=0;
        std::stack<int> s;
        int b;
        if(x/10>0){
            b=x%10;
            s.push(b);
            x=(x-b)/10;
        }
        int n=1;
        while(!s.empty()){
            result+=s.top()*n;
            s.pop();
            n*=10;
        }
        return result;
    }
};
int main(){
    Solution solution;
    int r;
    r=solution.reverse(123);
    std::cout<<r;
}
 
  
 
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        map<char,vector<int>> mymap;
        for(int i=0;i<s.size();i++){
            mymap[s[i]].push_back(i);
        }
        int maxLength=0;
        int tempLength=0;
        for(map<char,vector<int>>::iterator it=mymap.begin();it!=mymap.end();it++){
            vector<int> temp=it->second;
            for(int j=1;j<temp.size();j++){
                if((temp[j]-temp[j-1])>tempLength){
                    tempLength=temp[j]-temp[j-1];
                }
            }
            temp.empty();
            if(tempLength>maxLength)
                maxLength=tempLength;
        }
        return  maxLength;
    }
};

 2.缺失的第一个正数(自己的思路,时间与空间都超过100%用户)

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        if(nums.size()==0)
            return 1;
        std::sort(nums.begin(),nums.end());
        int result;
        if(nums[0]>1||nums[nums.size()-1]<=0)
            return 1;
        else{
            int left=0;
            int right=nums.size()-1;
            int mid;
            while(left<right){
                mid=left+(right-left)/2;
                if(nums[mid]<0)
                    left=mid+1;
                else
                    right=mid;
            }
            int pos=left;
            int i=pos;
            if(nums[i]==0)
                i=pos+1;
            if(nums[i]>1){
                return 1;
            }
            else{
            while(nums.size()-1>i){
                if(nums[i+1]-nums[i]==1||nums[i+1]==nums[i])
                    i++;
                else{
                    result=nums[i]+1;
                    return result;
                }
            }
            result=nums[nums.size()-1]+1;
            }
        }
        return result;
    }
};

 3.最大子序和(通过这题发现了geeksforgeek上解答的bug.)

 1 class Solution {
 2 public:
 3     int maxSubArray(vector<int>& nums) {
 4         if(nums.size()==1)
 5             return nums[0];
 6         int res=maxSubSum(nums,0,nums.size()-1);
 7         return res;
 8     }
 9     int maxSubSum(vector<int>& a,int left,int right){
10         int maxLeftSum,maxRightSum;
11         int maxLeftBorderSum,maxRightBorderSum;
12         int leftBorder=0,rightBorder=0;
13         int Center,i;
14         if(left==right){
15             return a[left] ;
16         }
17         Center=(left+right)/2;
18         maxLeftSum=maxSubSum(a,left,Center);
19         maxRightSum=maxSubSum(a,Center+1,right);
20 
21         maxLeftBorderSum=a[Center];
22         for(i=Center;i>=left;i--){
23             leftBorder+=a[i];
24             if(leftBorder>maxLeftBorderSum)
25                 maxLeftBorderSum=leftBorder;
26         }
27         maxRightBorderSum=a[Center+1];
28         for(i=Center+1;i<=right;i++){
29             rightBorder+=a[i];
30             if(rightBorder>maxRightBorderSum)
31                 maxRightBorderSum=rightBorder;
32         }
33         int t=(maxLeftSum>maxRightSum)?maxLeftSum:maxRightSum;
34         int result=((maxLeftBorderSum+maxRightBorderSum)>t)?(maxRightBorderSum+maxLeftBorderSum):t;
35         return result;
36     }
37 };

猜你喜欢

转载自www.cnblogs.com/gangyin/p/12581658.html