左神算法进阶班3_4网易题——烽火传递 Bertha 。 2022-10-02 15:55 118阅读 0赞 **【题目】** 一个数组中的数字组成环形山,数值为山高 1 2 4 5 3 规则,烽火传递: 相邻之间的两座山必能看到烽火, 非相邻的山之间有一边的山高都 <= 这两个非相邻山的山高,则这两座山能相互看到烽火。 比如,1和4就不能看到,因为顺时针边,2比1大,挡住了,逆时针边,3和5都比1大,挡住了。 而3与4就能看到,虽然逆时针边5挡住了,但顺时针边1和2没挡住3。 问哪两座山能相互看到烽火;要求时间复杂为O(1) 此题答案为(1, 2)(1, 3)(2, 4)(4, 5)(5, 3)(2, 3)(4, 3) **【题解】** 【数组中的数字互不相同】 在最高山N, 和次高山M,之间的任何一座山向顺时针,逆时针寻找, 都有可以看到山N、M两座山,即有(n - 2) \* 2对,然后再加上N, M这两座山能相互看到 故共有(n - 2) \* 2 + 1 = 2 \* n - 3对 结论:n个不相同的数,共有(2 \* n - 3)对 **【数组中含有相同的数字】** 单调栈:从大到小排序 从任意一个最大值开始,以一个方向旋转,进行入栈操作 当一个数被弹出栈时,他找到了2个可以相互看到山,即,将入栈的和他下面的 当将入栈数与栈顶相等,则将两个数的信息共同记录在同一个栈位置, 当弹出某个数为n条记录时,即在同一个位置记录了n次某个数,比如,有连续n个4入栈,则在相同位置记录n次4 此时它弹出时,能看到的山为:Cn2 + n \* 2次其中Cn2\[n个4之间相互组合\] + n \* 2\[n个4与他两边的高山组合\], 当将遍历完数组后,栈中剩余的数弹出时: 对于倒数第i > 2个剩余数弹出时,他能看到的山为:Cn2 + n \* 2 对于倒数第二个剩余数弹出时, 若最后一个数为 > 1个记录他能看到的山为:Cn2 + n \* 2 若最后一个数为 == 1个记录他能看到的山为:Cn2 + n \* 1, 因为这是一个环。 对于倒数第1个剩余数弹出时,他能看到的山为:Cn2 ** 【代码】** ** ** 1 #pragma once 2 #include <iostream> 3 #include <vector> 4 #include <deque> 5 6 7 using namespace std; 8 9 int fireTranfer(vector<int>m) 10 { 11 //先找到最大值 12 int res = 0; 13 int maxIndex = 0; 14 deque<pair<int, int>>d;//单调栈 15 for (int i = 0; i < m.size(); ++i)//寻找最大值 16 maxIndex = m[maxIndex] > m[i] ? maxIndex : i; 17 d.push_back(make_pair(m[maxIndex], 1)); 18 for (int i = maxIndex + 1; i != maxIndex; ++i) 19 { 20 if (i == m.size()) 21 { 22 i = -1; 23 continue; 24 } 25 26 while (!d.empty() && m[i] > d.back().first) 27 { 28 int value, num; 29 value = d.back().first; 30 num = d.back().second; 31 res += (num*(num - 1) / 2) + num * 2;//对于弹出数据进行计算组合 32 d.pop_back(); 33 } 34 if (m[i] == d.back().first) 35 ++d.back().second; 36 else 37 d.push_back(make_pair(m[i], 1));//压入新数 38 39 40 } 41 //将队列中剩余的数据弹出来 42 while (!d.empty()) 43 { 44 int value, num; 45 value = d.back().first; 46 num = d.back().second; 47 if (d.size() > 2)//不是最后两个数据 48 res += (num*(num - 1) / 2) + num * 2; 49 else if (d.size() == 2)//为倒数第二个数 50 if (d.front().second > 1) 51 res += (num*(num - 1) / 2) + num * 2; 52 else 53 res += (num*(num - 1) / 2) + num; 54 else//为倒数第一个数 55 res += (num*(num - 1) / 2); 56 d.pop_back(); 57 } 58 return res; 59 } 60 61 void Test() 62 { 63 vector<int>v; 64 v = { 1,2,4,5,3 }; 65 cout << fireTranfer(v) << endl; 66 v = { 2,5,3,4,3,4,5 }; 67 cout << fireTranfer(v) << endl; 68 v = { 5,4,4,4 }; 69 cout << fireTranfer(v) << endl; 70 71 } 转载于:https://www.cnblogs.com/zzw1024/p/11066599.html
相关 python算法口诀_左神算法初级4 python实现 初级4的题目相关代码: 1、转圈打印矩阵 \转圈打印矩阵(二维数组), 比如a矩阵 \ \[\[ 1 2 3\] \ \[ 4 5 6\] \ \[ 7 8 9\] 桃扇骨/ 2022年11月05日 13:51/ 0 赞/ 92 阅读
相关 左神算法进阶班3_4网易题——烽火传递 【题目】 一个数组中的数字组成环形山,数值为山高 1 2 4 5 3 规则,烽火传递: 相邻之间的两座山必能看到烽火, 非相邻的山之间有一边的山高都 <= Bertha 。/ 2022年10月02日 15:55/ 0 赞/ 119 阅读
相关 左神算法进阶班3_1构造数组的MaxTree 题目 一个数组的MaxTree定义: 数组必须没有重复元素 MaxTree是一棵二叉树,数组的每一个值对应一个二叉树节点 包括MaxTree树在内且在 缺乏、安全感/ 2022年10月02日 15:55/ 0 赞/ 94 阅读
相关 左神算法:加强堆的实现(Java) 为什么要有加强堆? Java中的PriorityQueue(优先级队列)就是系统提供的堆实现,那么为什么还要手动去实现? 假如现在你手里有一个堆,里面存着一些元素,用户 小鱼儿/ 2022年09月06日 00:18/ 0 赞/ 132 阅读
相关 【搞定左神算法初级班】第7节:暴力递归、动态规划 目 录: 一、递归 题目1:求 n! 的结果 题目2:汉诺塔问题 题目3:打印一个字符串的全部子序列,包括空字符串 题目4:打印一个字符串的全部排列 题目5:母 冷不防/ 2022年04月23日 15:20/ 0 赞/ 244 阅读
相关 【搞定左神算法初级班】第4节:二叉树及相关常见面试题 目 录: 题目1:实现二叉树的先序、中序、后序遍历【递归方式和非递归方式】 题目2:在二叉树中找到一个节点的后继节点 题目3:介绍二叉树的序列化和反序列化 题目4: 怼烎@/ 2022年02月27日 13:18/ 0 赞/ 183 阅读
相关 【搞定左神算法初级班】第6节:前缀树、贪心算法 目 录: 一、前缀树:Prefix Tree 1.1 前缀树题目举例:一个字符串类型的数组 arr1,另一个字符串类型的数组 arr2 1.2 前缀树的 insert 以你之姓@/ 2022年02月26日 13:20/ 0 赞/ 187 阅读
相关 左神算法进阶班1_4Manacher算法 1 include <iostream> 2 include <string> 3 4 using namespace std; 朴灿烈づ我的快乐病毒、/ 2022年01月06日 00:01/ 0 赞/ 166 阅读
相关 左神算法进阶班3_2求最大矩阵 【题目】 给定一个整型矩阵map,其中的值只有0和1两种,求其中全是1 的所有矩形区域中,最大的矩形区域为1的数量。 例如: 1 1 1 0 逃离我推掉我的手/ 2022年01月05日 23:55/ 0 赞/ 133 阅读
还没有评论,来说两句吧...