数据结构与算法 刷题leetcode 009

今天的刷题的内容是还是关于队列的数据结构和昨天的一致;

今天要讲的是队列和图论算法的应用

leetcode 279:

Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 16, ...) which sum to n.For example, given n = 12, return 3 because 12 = 4 + 4 + 4; given n = 13, return 2 because 13 = 4 + 9. 返回一个数由完全平方数和构成的最小的长度。 数学建模过程,假设有n个结点,如果两个结点之间相差一个完全平方数,那么在这两个数之间就连接一条边,构成一个图,就将原问题转换为求救图中的最短路径的问题,或者说是广度优先的算法;

class Solution {
public:
    int numSquares(int n) {
        int step=0;//建模实现,将所有节点:如果两个结点之间的数据差相差一个完全平方数,那么就在两个数据之间构造一条边
        queue<pair<int ,int>> node;//第二个int表示的是行走的步数;
        vector<bool> flag(n+1,false);//如果这个节点被访问过,那么下次不再进行访问;
        node.push(make_pair(n,step));
        while(!node.empty()){
            pair<int,int> top=node.front();
            step=top.second;
            int nums=top.first;
            node.pop();
            if(nums==0){//如果数值为0,说明已经到达到达了,所以返回结果,step步数;
                return step;
            }
            for(int i=1;nums-i*i>=0;i++){
                if(flag[nums-i*i]==false){
                    node.push(make_pair(nums-i*i,step+1));
                    flag[nums-i*i]=true;
                }
            }
        }
        return step;
    }
};

同理解法类似的还有leetcode127:

class Solution {
public:
    int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
        //使用一个队列来维护信息;
        int step=1;
        queue<pair<string,int>> strNode;
        strNode.push(make_pair(beginWord,step));
        int size=wordList.size();
        vector<bool> flag(size+1,false);
        while(!strNode.empty()){
            pair<string,int> top=strNode.front();
            strNode.pop();
            string firstStr=top.first;
            int step=top.second;
            if(firstStr==endWord){
                return step;
            }
            for(int i=0;i<size;i++){
                if(flag[i]==false){
                string temp=wordList[i];
                if(compare(firstStr,temp)){
                //如果他们之间相差一个字符,那么返回true
                    strNode.push(make_pair(temp,step+1));
                    flag[i]=true;
                }
            }
                }
        }
        return 0;}
    
private:
    bool compare(string& s1,string &s2){
        if(s1.size()!=s2.size()){
            return false;
        }
        int count=0;
        for(int i=0;i<s1.size();i++){
            if(s1[i]!=s2[i]){
                count++;
            }
        }
        if(count==1){
            return true;
        }
        return false;
    }
};


猜你喜欢

转载自blog.csdn.net/hufanglei007/article/details/79541308