标签:周赛 fr return 运算 vis second leetcode5916 each first
思路:BFS
细节: 每次把到达的数字放入队列,按照nums.size() × 3进行扩散,扩散到的数字下次扩散的时候就不用继续放入队列了。
总结:
1.遇到从一个值,到另外一个值最小操作次数的题目,要想到BFS
2.难点在于判断广搜的终止条件:这道题是超过1000!!!
class Solution {
public:
int minimumOperations(vector<int>& nums, int start, int goal) {
//中间到达过的数字,之后就不用再搜索了,因为操作都是一样的,而且题目问的是最短次数,所以到达过该数字之后更没必要了
vector<bool> vis(1005); //优化,改成bool类型!!!
queue<pair<int, int>> q;
q.push(make_pair(start, 0));
vis[start] = true;
while (!q.empty()) {
auto fr = q.front();
q.pop();
if (fr.first == goal) return fr.second;
//if (fr.first > 1000 || fr.first < 0) continue; //不满足尽量不入队!!!
for (auto &each : nums) {
if (fr.first + each >= 0 && fr.first + each <= 1000) {
if (!vis[fr.first + each]) {
vis[fr.first + each] = true;
q.push(make_pair(fr.first + each, fr.second + 1));
}
}else if (fr.first + each == goal) return fr.second + 1;
//q.push(make_pair(fr.first + each, fr.second + 1)); //优化,不满足的尽量就不入队!!!
if (fr.first - each >= 0 && fr.first - each <= 1000) {
if (!vis[fr.first - each]) {
vis[fr.first - each] = true;
q.push(make_pair(fr.first - each, fr.second + 1));
}
}else if (fr.first - each == goal) return fr.second + 1;
if ((fr.first ^ each) >= 0 && (fr.first ^ each) <= 1000) { //加括号!!!
if (!vis[fr.first ^ each]) {
vis[fr.first ^ each] = true;
q.push(make_pair(fr.first ^ each, fr.second + 1));
}
}else if ((fr.first ^ each) == goal) return fr.second + 1;
}
}
return -1;
}
};
优化:
不满足的尽量就不入队,对时间影响特别大!!!
标签:周赛,fr,return,运算,vis,second,leetcode5916,each,first 来源: https://blog.csdn.net/zhangjiaji111/article/details/121063251
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。