在本题中,任何一个正整数都会由完全平方数1组成,所以不可能没有解。

贪心是不成立的,因为如果寻找12的完全平方数,使用贪心,则它由9,1,1,1四个数组成;但是最少的完全平方数是由三个4组成的。

4->3->2->1->0 之间相差1,这个完全平方数;

4->0 之间相差4,这个完全平方数。

class Solution {
public:
int numSquares(int n) {
//图的广度优先遍历
queue< pair<int, int> > q; //具体第几个数字;图中经历了几段路径到达这个数字
q.push(make_pair(n,)); //对于n这个数字,0步到达 vector<bool> visited(n+, false); //0 - n 这n+1个结点有没有被访问过
visited[n] = true; //n一开始已经被推入栈中了 while(!q.empty()){
//取出队首元素
int num = q.front().first; //这个数字是多少
int step = q.front().second; //走了几步
q.pop(); for(int i=; ; i++){
int a = num-i*i;
if(a<)
break;
if(a == )
return step+;
if(!visited[a]){ //当visited这个结点没有被访问过时,将它推入,避免重复计算
//说明除了i之外还能有一个完全平方数
q.push(make_pair(a, step+));
visited[a] = true;
}
}
}
throw invalid_argument("No Solution.");
}
};

class Solution {
public:
int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
unordered_set<string> wordSet(wordList.begin(), wordList.end()); if(!wordSet.count(endWord)) //若给定单词列表没有endWord,返回
return ; queue<pair<string, int>> q;
q.push(make_pair(beginWord, )); while(!q.empty()){
string word = q.front().first;
int res = q.front().second;
q.pop(); if(word == endWord)
return res; for(int i=;i<word.size();i++){
string newWord = word;
for(char ch='a'; ch<='z';ch++){
newWord[i] = ch;
if(wordSet.count(newWord) && newWord!=word){
q.push(make_pair(newWord, res+));
wordSet.erase(newWord);
}
}
}
}
return ;
}
};

127这道题需要注意的是:如果不把vector里存储的数据用set来存,就会导致 time limited 的问题!!

class Solution {
public:
vector<vector<string>> findLadders(string beginWord, string endWord, vector<string>& wordList) { vector<vector<string>> res; //res保存最短路径 unordered_set<string> dict(wordList.begin(), wordList.end()); //dict保存单词列表 queue<vector<string>> paths; //保存所有可能路径
paths.push({beginWord}); int level = , minLevel = INT_MAX; //level存储当前路径,minLevel最短路径 unordered_set<string> words; //存储已经遍历过的单词 while(!paths.empty()){ vector<string> t = paths.front(); //队列中首路径
paths.pop(); if(t.size()>level){
//把已经遍历过的单词在dict中删除
for(string a:words) dict.erase(a);
words.clear(); //words清零 准备储存下一次遍历的单词
level = t.size(); //剪枝
if(level > minLevel)
break; } string last = t.back(); //last存储当前路径的最后一个单词
for(int i=; i<last.size();i++){
string newlast = last;
for(char ch ='a';ch<='z';ch++){
newlast[i] = ch;
if(!dict.count(newlast))
continue; //若dict中找不到这个单词,退出本次循环
words.insert(newlast); //插入到已遍历列表
vector<string> nextPath = t;
nextPath.push_back(newlast); if(newlast == endWord){
//先找到endWord的路径一定是最短的
res.push_back(nextPath);
minLevel = level;
}
else
paths.push(nextPath); }
}
} return res;
}
};

·

BFS和图的最短路径 279,127,126的更多相关文章

  1. 模板 图的遍历 bfs+dfs 图的最短路径 Floyed+Dijkstra

    广搜 bfs //bfs #include<iostream> #include<cstdio> using namespace std; ],top=,end=; ][]; ...

  2. 【bfs分层图 dp】hihocoder#1147 : 时空阵

    最短路径树上分层dp的一类套路吧 题目大意 幽香这几天学习了魔法,准备建造一个大型的时空传送阵. 幽香现在可以在幻想乡的n个地点建造一些传送门,如果她建造了从地点a与地点b之间的传送门,那么从a到b和 ...

  3. 带权图的最短路径算法(Dijkstra)实现

    一,介绍 本文实现带权图的最短路径算法.给定图中一个顶点,求解该顶点到图中所有其他顶点的最短路径 以及 最短路径的长度.在决定写这篇文章之前,在网上找了很多关于Dijkstra算法实现,但大部分是不带 ...

  4. 数据结构 -- 图的最短路径 Java版

    作者版权所有,转载请注明出处,多谢.http://www.cnblogs.com/Henvealf/p/5574455.html 上一篇介绍了有关图的表示和遍历实现.数据结构 -- 简单图的实现与遍历 ...

  5. C++编程练习(11)----“图的最短路径问题“(Dijkstra算法、Floyd算法)

    1.Dijkstra算法 求一个顶点到其它所有顶点的最短路径,是一种按路径长度递增的次序产生最短路径的算法. 算法思想: 按路径长度递增次序产生算法: 把顶点集合V分成两组: (1)S:已求出的顶点的 ...

  6. python解决图的最短路径问题

    在hihoCoder上遇到一个算法题目,描述如下: 对图结构有了解的不难发现,这是经典的求图的最短路径问题.以下是python代码: def findMin(row): minL = max(row) ...

  7. c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法

    c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法 图的最短路径的概念: 一位旅客要从城市A到城市B,他希望选择一条途中中转次数最少的路线.假设途中每一站都需要换车,则这个问题反映到图上就是 ...

  8. 图的最短路径---迪杰斯特拉(Dijkstra)算法浅析

    什么是最短路径 在网图和非网图中,最短路径的含义是不一样的.对于非网图没有边上的权值,所谓的最短路径,其实就是指两顶点之间经过的边数最少的路径. 对于网图,最短路径就是指两顶点之间经过的边上权值之和最 ...

  9. 数据结构(C#):图的最短路径问题、(Dijkstra算法)

    今天曾洋老师教了有关于图的最短路径问题,现在对例子进行一个自己的理解和整理: 题目: 要求:变成计算出给出结点V1到结点V8的最短路径 答: 首先呢,我会先通过图先把从V1到V8的各种路径全部计算下来 ...

随机推荐

  1. 基于rank的优化

    ------------------siwuxie095                                 基于 rank 的优化         基于 size 的优化,在大多数情况下 ...

  2. 阿里云ECS购买优惠码

    今天收到了阿里云给我发的邮件,大意是阿里云推荐码限量开放,可享九折优惠! 于是就点击进去申请了一下 申请的优惠码是:C7IYIS有效期至2015-11-30 23:59:59 首次购买包年包月云服务器 ...

  3. java类中final方法的作用

    不给子类复写这个方法.说明你已经知道这个方法提供的功能已经满足你要求,不需要进行扩展,并且也不允许任何从此类继承的类来覆写这个方法,但是继承仍然可以继承这个方法,也就是说可以直接使用 inline扩展 ...

  4. 8.INSERT INTO 语句 UPDATE 语句

    1. INSERT INTO 语句 INSERT INTO 语句用于向表格中插入新的行. 语法 INSERT INTO 表名称 VALUES (值1, 值2,....) INSERT INTO Per ...

  5. GridSearchCV scoring 参考

    http://scikit-learn.org/stable/modules/model_evaluation.html Scoring parameter: Model-evaluation too ...

  6. 使用pycharm运行调试scrapy

    摘要 Scrapy是爬虫抓取框架,Pycharm是强大的python的IDE,为了方便使用需要在PyCharm对scrapy程序进行调试 python PyCharm Scrapy scrapy指令其 ...

  7. Entity Framework 6.0 Tutorials(11):Download Sample Project

    Download Sample Project: Download a sample project for Entity Framework 6 Database-First model below ...

  8. C# Code 非常好的学习博客

    https://ardalis.com/how-to-become-master-writing-c-code

  9. LightOJ 1282 Leading and Trailing (数学)

    题意:求 n^k 的前三位和后三位. 析:后三位,很简单就是快速幂,然后取模1000,注意要补0不全的话,对于前三位,先取10的对数,然后整数部分就是10000....,不用要,只要小数部分就好,然后 ...

  10. delphi创建服务程序

    创建一个自己的服务程序: File -> New -> Other -> New(选项) -> Service Application 这样delphi会自动生成服务程序的框架 ...