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