Restore IP Address
题意:给定多个数字(多于3个,少于13个),返回所有合法的ip地址,要求用到所有数字。
思路:使用回溯可以解,但是有点儿麻烦
在本题目中,我觉得暴力解法是最好的:
vector<string> restoreIpAddresses(string s) {
vector<string> ret;
string ans;
for (int a=1; a<=3; a++)
for (int b=1; b<=3; b++)
for (int c=1; c<=3; c++)
for (int d=1; d<=3; d++)
if (a+b+c+d == s.length()) {
int A = stoi(s.substr(0, a));
int B = stoi(s.substr(a, b));
int C = stoi(s.substr(a+b, c));
int D = stoi(s.substr(a+b+c, d));
if (A<=255 && B<=255 && C<=255 && D<=255)
if ( (ans=to_string(A)+"."+to_string(B)+"."+to_string(C)+"."+to_string(D)).length() == s.length()+3)
ret.push_back(ans);
}
return ret;
}
95 Unique Binary Search Trees II
题意:给定n,返回所有的n个节点可能组成的二叉搜索树。要求中序遍历要符合1到n的顺序。
思路:非常典型的分治题目
96 Unique Binary Search Trees
题意:和上题一样的要求,只不过给出的不是全部情况,给出的是数量
思路:简单的动态规划。这道题目也可以使用卡特兰数来求解,代码如下:
int numTrees(int n) {
//cantalan树
//C(2n,n)/(n+1)
long long ans =1;
for(int i=n+1;i<=2*n;i++){
ans = ans*i/(i-n);
}
return ans/(n+1);
}
98 Validate Binary Search Tree
题意:判断一个给定的二叉搜索树是不是合法的
思路:通过判断该二叉树的中序遍历是不是有序的。