(1) First Missing Positive
根据[1]: 贪心的策略,O(n)的循环把数字放到其对应的位置,即满足A[i]=i+1,就能保证每次交换就是有意义的。如果当前位置已经存在正确的值,就不交换,否则会死循环。最后在扫描一遍,如果当前位置上数字不对就输出,如果都正确,就没有漏的数字,输出n+1。
class Solution {
public:
int firstMissingPositive(int A[], int n) {
for(int i=0;i<n;i++)
while(A[i]!=i+1 && A[i]>=1 && A[i]<=n && A[A[i]-1]!=A[i])
swap(A[i],A[A[i]-1]);
for(int i=0;i<n;i++)
if(A[i]!=(i+1))
return i+1;
return n+1;
}
};
(2) Clone Graph
深度遍历,注意防止回路无限循环,就要使用hash表,这里使用unordered_map记录访问过的节点。因为这里的label应该是唯一的才对,所以可以直接使用label作为关键字就可以[2]。
class Solution {
private:
UndirectedGraphNode *dfs(UndirectedGraphNode *node, unordered_map<int, UndirectedGraphNode*> &htable){
if(!node)
return node;
if(htable.count(node->label))
return htable[node->label];
UndirectedGraphNode* ret=new UndirectedGraphNode(node->label);
htable[node->label]=ret;
if(node->neighbors.size())
for(int i=0;i<node->neighbors.size();i++)
(ret->neighbors).push_back(dfs((node->neighbors)[i],htable));
return ret;
}
public:
UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
unordered_map<int, UndirectedGraphNode*> htable;
return dfs(node,htable);
}
};
(3) Sqrt(x)
对于一个非负数n,它的平方根不会小于大于(n/2+1)。在[0, n/2+1]这个范围内可以进行二分搜索,求出n的平方根[3]。
class Solution {
public:
int sqrt(int x) {
long long range=x/2+1;
long long begin=0;
long long end=range;
while(begin<=end)
{
long long mid=(begin+end)/2;
long long tmp=mid*mid;
if(tmp>x)
end=mid-1;
else if(tmp<x)
begin=mid+1;
else
return mid;
}
return end;
}
};
还有一种方法用牛顿迭代[3]。
参考:
[1] http://blog.csdn.net/havenoidea/article/details/11812717
[2] https://oj.leetcode.com/problems/clone-graph/
[3] http://www.cnblogs.com/AnnieKim/archive/2013/04/18/3028607.html