First Missing Positive & Clone Graph & Sqrt(x)

(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值