LeetCode 2016 424,187,200,376,390,354,15,18,419

来源:互联网 发布:常熟淘宝培训 编辑:程序博客网 时间:2024/05/02 06:45

424 Longest Repeating Character Replacement

class Solution {public:    int characterReplacement(string s, int k)    {        int ans=0;        int ls=s.size();        vector<char> letters;        int flag[30]={0};        for(int i=0;i<ls;i++)            flag[s[i]-'A']=1;        for(int i=0;i<26;i++)            if (flag[i]>0) letters.push_back(i+'A');        int lletters=letters.size();        for(int i=0;i<lletters;i++)        {            int head=0,tail,leftk=k;            // head is the first letter of substring            // tail is the one trying to envolve            if (s[head]!=letters[i])            {                if (leftk>0) leftk--;                else                {                    while (head<ls && s[head]!=letters[i]) head++;                }            }            tail=head+1;            while(tail<ls)            {                if (s[tail]!=letters[i])                {                    if (leftk>0)                        leftk--;                    else                    {                        while(s[head]==letters[i]) head++;                        head++;                    }                }                ans=max(ans,(tail-head+1));                tail++;            }        }        return ans;    }};


187 Repeated DNA Sequences
class Solution {public:    vector<string> findRepeatedDnaSequences(string s)    {        vector<string> ans;        int len=10;        map<string,int> flag;        int ls=s.size();        int ends=ls-len;        for(int i=0;i<=ends;i++)        {            string str=s.substr(i,len);            if (flag.find(str)==flag.end())                flag[str]=1;            else                flag[str]=flag[str]+1;        }        for(map<string,int>::iterator j=flag.begin();j!=flag.end();j++)        {            if (j->second > 1) ans.push_back(j->first);        }        return ans;    }};

200 Number of Islands

class Solution {public:    int dx[4]={1,-1,0,0};    int dy[4]={0,0,1,-1};    vector< vector<int> > matrix;    int numIslands(vector<vector<char> >& grid)    {        int ans=0;        int row=grid.size();        if (row==0) return 0;        int col=grid[0].size();        matrix.resize(row+2);        for(int i=0;i<=col+1;i++)        {            matrix[0].push_back(0);            matrix[row+1].push_back(0);        }        for(int i=0;i<row;i++)        {            matrix[i+1].push_back(0);            for(int j=0;j<col;j++)            {                matrix[i+1].push_back(grid[i][j]-'0');            }            matrix[i+1].push_back(0);        }        row++;col++;        for(int i=0;i<=row;i++)        {            for(int j=0;j<=col;j++)            {                if (matrix[i][j]!=0)                {                    matrix[i][j]=0;                    ans++;                    depthSearch(i,j);                }            }        }        return ans;    }    void depthSearch(int x,int y)    {        for(int i=0;i<4;i++)        {            int tmpx=x+dx[i],tmpy=y+dy[i];            if (matrix[tmpx][tmpy]==1)            {                matrix[tmpx][tmpy]=0;                depthSearch(tmpx,tmpy);            }        }        return ;    }};


376 Wiggle Subsequence

class Solution {public:    int wiggleMaxLength(vector<int>& nums)    {        int ans=0;        int ln=nums.size();        vector<int> fp,fn;        fp.resize(ln+1);        fn.resize(ln+1);        for(int i=0;i<=ln;i++)        {            fp[i]=1;fn[i]=1;        }        for(int i=0;i<ln;i++)        {            for(int j=0;j<i;j++)            {                if (nums[j]<nums[i])                {                    fp[i]=max(fp[i],fn[j]+1);                }                if (nums[j]>nums[i])                {                    fn[i]=max(fn[i],fp[j]+1);                }            }        }        for(int i=0;i<ln;i++)        {            ans=max(ans,fp[i]);            ans=max(ans,fn[i]);        }        return ans;    }};


390 Elimination Game

class Solution {public:int lastRemaining(int n) {    return n == 1 ? 1 : 2 * (1 + n / 2 - lastRemaining(n / 2));}};


354 Russian Doll Envelopes

class Solution {public:    static bool cmp(const std::pair<int,int> &x,const std::pair<int,int> &y)    {        if (x.first == y.first) return x.second < y.second;        return x.first < y.first;    }    int maxEnvelopes(vector<pair<int, int> >& envelopes)    {        int len=envelopes.size();        vector<int> f;        f.resize(len+1);        for(int i=0;i<=len;i++) f[i]=1;        sort(envelopes.begin(),envelopes.end(),cmp);        for(int i=0;i<len;i++)        {            for(int j=0;j<i;j++)            {                if ((envelopes[j].first < envelopes[i].first )&&                    (envelopes[j].second < envelopes[i].second))                {                    f[i]=max(f[j]+1,f[i]);                }            }        }        int ans=0;        for(int i=0;i<len;i++)            ans=max(ans,f[i]);        return ans;    }};

15 3Sum

class Solution {public:    vector<vector<int> > threeSum(vector<int>& nums)    {        vector<vector<int> > ans;        int n=nums.size(),target=0;        if (n==0)return ans;        sort(nums.begin(),nums.end());        int i=0,j,k;        while(i<n-2)        {            j=i+1;            k=n-1;            while(j<k)            {                int sum=nums[i]+nums[j]+nums[k];                if (sum==target)                {                    vector<int>tmp;                    tmp.push_back(nums[i]);                    tmp.push_back(nums[j]);                    tmp.push_back(nums[k]);                    ans.push_back(tmp);                    while(nums[j]==nums[j+1]) j++;                    while(nums[k]==nums[k-1]) k--;                    j++;k--;                }                else                {                    if(sum>0) k--;                    if(sum<0) j++;                }            }            while(nums[i]==nums[i+1])i++;                i++;        }        return ans;    }};


18 4Sum

class Solution {public:    vector<vector<int>> fourSum(vector<int>& nums, int target)    {        vector<vector<int> > ans;        int n=nums.size();        if (n==0)return ans;        sort(nums.begin(),nums.end());        int p,i,j,k;        p=0;        while(p<n-3)        {            i=p+1;            while(i<n-2)            {                j=i+1;                k=n-1;                while(j<k)                {                    int sum=nums[p]+nums[i]+nums[j]+nums[k];                    if (sum==target)                    {                        vector<int>tmp;                        tmp.push_back(nums[p]);                        tmp.push_back(nums[i]);                        tmp.push_back(nums[j]);                        tmp.push_back(nums[k]);                        ans.push_back(tmp);                        while(nums[j]==nums[j+1]) j++;                        while(nums[k]==nums[k-1]) k--;                        j++;k--;                    }                    else                    {                        if(sum>target) k--;                        if(sum<target) j++;                    }                }                while(nums[i]==nums[i+1])i++;                    i++;            }            while(nums[p]==nums[p+1])p++;            p++;        }        return ans;    }};


419 Battleships in a Board

class Solution {public:    int dx[4]={1,-1,0,0};    int dy[4]={0,0,1,-1};    vector<vector<int> >grid;    void depthSearch(int x,int y)    {        for(int i=0;i<4;i++)        {            int tx=x+dx[i];            int ty=y+dy[i];            if (grid[tx][ty]==1)            {                grid[tx][ty]=0;                depthSearch(tx,ty);            }        }        return ;    }    int countBattleships(vector<vector<char> >& board)    {        int ans=0;        int row=board.size();        if (row==0) return ans;        int col=board[0].size();        grid.resize(row+2);        for(int i=0;i<=col+1;i++)        {            grid[0].push_back(0);            grid[row+1].push_back(0);        }        for(int i=0;i<row;i++)        {            grid[i+1].push_back(0);            for(int j=0;j<col;j++)            {                if (board[i][j]=='X')                    grid[i+1].push_back(1);                else grid[i+1].push_back(0);            }            grid[i+1].push_back(0);        }        for(int i=1;i<=row;i++)        {            for(int j=1;j<=col;j++)            {                if (grid[i][j]==1)                {                    ans++;                    grid[i][j]=0;                    depthSearch(i,j);                }            }        }        return ans;    }};







0 0