编程积累4

127 阅读4分钟

1.路劲规划 动态规划 使用二维数组存下已经计算过的路径数可以避免大量的重复计算

f1
class Solution {
public:
    int uniquePaths(int m, int n) {
        if(m<=0 || n<=0)
          return 0;
        else if(m==1 || n==1)
           return 1;
        else if(m==2 && n==2)
           return 2;
        int path=0;
        path=path+uniquePaths(m-1,n);
        path=path+uniquePaths(m,n-1);
        return path;
    }
};

f2
static int a[101][101]={0};
class Solution {
public:
    int uniquePaths(int m, int n) {
        if(m<=0 || n<=0)
          return 0;
        else if(m==1 || n==1)
           return 1;
        else if(m==2 && n==2)
           return 2;
        if(a[m][n]>0)
           return a[m][n];
        a[m-1][n]=uniquePaths(m-1,n);
        a[m][n-1]=uniquePaths(m,n-1);
        return a[m-1][n]+ a[m][n-1];
    }
};

2.最长回文子串

f1 超过时间
class Solution {
public:
    string longestPalindrome(string s) {
        if(s.empty())
          return "";
        int i;
        int j;
        int size=s.size();
        if(size==1)
          return s;
        int max=1;
        int a[2];
        for(i=0;i<size;i++)
        {
            for(j=i+1;j<size;j++)
            {
                if(chara(s,i,j))
                   {
                      if((j-i+1)>=max)
                      {
                          a[0]=i;
                          a[1]=j-i+1;
                          max=j-i+1;
                      }

                   }
            }

        }
        if(max==1)
          return s.substr(0,1);
        else
          return s.substr(a[0],a[1]);
       
    }
    int chara(string s,int a,int b)
    {
        if(b-a==1  && s[a]==s[b])
           return 1;
        else if(a==b)
           return 1;
        else if(s[a]!=s[b])
           return 0;  
        int tem=1;
        return tem*chara(s,a+1,b-1);
                 
    }
};

f2
class Solution {
public:
string longestPalindrome(string s) {
	if (s.empty())
		return "";
	int len = s.size();
	vector<vector<int>> dp(len, vector<int>(len, 0));
	for (int i = 0; i < len; i++)
	{
		dp[i][i] = 1;
	}
	int max = 1;
	int start_index = 0;
	for (int i = len - 2; i >= 0; i--)
	{
		for (int j = i + 1; j < len; j++)
		{
			if (s[i] == s[j])
			{
				if (j - i == 1)
				{
					dp[i][j] = 2;
					if (dp[i][j] > max && j - i + 1 == dp[i][j])
					{
						max = dp[i][j];
						start_index = i;
					}
				}
				else if (j - i > 1)
				{
					dp[i][j] = dp[i + 1][j - 1] + 2;
					if (dp[i][j] > max && j - i +1 == dp[i][j])
					{
						max = dp[i][j];
						start_index = i;	
					}
				}
			}
			else
				dp[i][j] = 0;
		}
	}
	return s.substr(start_index, max);
}
};

3.二叉树的中序遍历

class Solution { 
private:
   vector<int> res={0};
public:
    vector<int> inorderTraversal(TreeNode* root) {
        if(root==NULL)
           return res;
        aux(root);
        return res;   
    }
    void aux(TreeNode* root)
    {
        if(root != NULL)
        {
           inorderTraversal(root->left);
           res.push_back(root->val);
           inorderTraversal(root->right);
        }
    }
};

4.不同的二叉搜索树

class Solution {
public:
    int numTrees(int n) {
        if(n<=0)
          return 0;
        
        vector<int> tem(n+1,0);

        tem[0]=1;

        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=i;j++)
            {
                tem[i]+=tem[j-1]*tem[i-j];
            }
        }
        return tem[n];
    }
};

5.最小路径和

方法1:超过时间限制
class Solution {
private:
int min=INT_MAX;
public:
void aux_minpath(vector<vector<int>>& gr,int m,int n,int tem)
{
    if(m==0 && n==0)
    {
       min= tem < min ? tem : min;
       return;
    }
    if(m<0 || n<0)
      return;

    int tem1=gr[m][n];
   aux_minpath(gr,m-1,n,tem1+tem);
   aux_minpath(gr,m,n-1,tem1+tem);
   return;     
}
    int minPathSum(vector<vector<int>>& grid) {
        if(grid.empty())
           return 0;
           int n=grid[0].size();
           int m=grid.size();
           int m1=0,n1=0;
       aux_minpath(grid,m-1,n-1,0) ;
        return min+grid[0][0];   
        
    }
};

6.加一

class Solution {
public:
   vector<int> plusOne(vector<int>& digits) {
	int size = digits.size();
	int at = 0;
	int end = digits[size - 1] + 1;
	if (end == 10)
		at++;
	vector<int> ret(size + 1, 0);
	ret[size] = end % 10;
	
	for (int i = size - 2; i >= 0; i--)
	{
		ret[i + 1] = digits[i] + at;
		if (ret[i + 1] == 10)
		{
			at = 1;
			ret[i + 1] = 0;
		}
		else
			at = 0;
	}
	if (at == 0)
	{
		ret.erase(ret.begin(), ret.begin() + 1);
		return ret;
	}
	ret[0] = 1;
	return ret;
}
};

7.二进制求和

string addBinary(string a, string b) {
	int sizea = a.size();
	int sizeb = b.size();
	if (sizea == 0 && sizeb != 0)
		return b;
	if (sizea != 0 && sizeb == 0)
		return a;
	string ret = "";
	if (sizea > sizeb)
	{
		int i = sizea - sizeb;
		while (i)
		{
			b = to_string(0) + b;
			i--;
		}
	}
	if (sizea < sizeb)
	{
		int j = sizeb - sizea;
		while (j)
		{
			a = to_string(0) + a;
			j--;
		}
	}
	int len = b.size();
	int at = 0;
	for (int i = len - 1; i >= 0; i--)
	{
		int tem = a[i] - '0' + b[i] - '0' + at;
		if (tem == 2)
		{
			at = 1;
			ret = to_string(0) + ret;
			continue;
		}
		if (tem == 3)
		{
			at = 1;
			ret = to_string(1) + ret;
			continue;
		}
		at = 0;
		ret = to_string(tem) + ret;
	}
	if (at == 1)
		ret = to_string(1) + ret;
	return ret;
}

swap的使用
	string a = "1111";
	string b = "11111";
	vector<int> a1 = { 1,2,3 };
	vector<int> b1 = { 1 };
	int a2 = 1;
	int b2 = 3;
	swap(a2, b2);

8.矩阵置零

STL的元素可以为pair形式;注意是first,second;加入用make_pair(int,int)的形式
class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        if(matrix.empty())
           return;
        int x=matrix.size();
        int y=matrix[0].size();
        queue<pair<int,int>>index;
        for(int i=0;i<x;i++)
         {
             for(int j=0;j<y;j++)
             {
                 if(matrix[i][j]==0)
                 index.push(make_pair(i,j));
             }
         }
         while(!index.empty())
         {
             auto inx=index.front();
              index.pop();
             for(int i=0;i<x;i++)
                 matrix[i][inx.second]=0;
            for(int j=0;j<y;j++)
                  matrix[inx.first][j]=0;
         }
    }
};
9. 搜索二维矩阵
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
	bool ret = false;
	if (matrix.empty() || matrix[0].empty())
		return ret;
	int x = matrix.size();
	int y = matrix[0].size();
	int i = 0;
	for (; i < x; i++)
	{
		if (matrix[i][0] > target)
			break;
		else if (matrix[i][0] == target)
			return true;
	}
	if (i== 0)
		i++;
	for (int j = 0; j < y; j++)
	{
		if (matrix[i- 1][j] == target)
		{
			ret = true;
			break;
		}
		else if (matrix[i- 1][j] > target)
			break;
	}
	return ret;
}
};

10 颜色分类

class Solution {
public:
    void sortColors(vector<int>& nums) {
        if(nums.empty())
           return;
         int size=nums.size();
          int left=0;
          int right=size-1;
          int curr=0;
         while(curr<=right)
         {
             if(nums[curr]==0)
             {
                 int tem=nums[curr];
                 nums[curr]=nums[left];
                 nums[left]=tem;
                 curr++;
                 left++;
             }
             else if(nums[curr]==2)
             {
                 int tem=nums[curr];
                 nums[curr]=nums[right];
                 nums[right]=tem;
                 right--;
             }
             else
             curr++;
         }
    }
};