leetcode 第90场双周赛

6226. 摧毁一系列目标

题意:对于数组中每一个数nums[i],可以摧毁数组中值等于nums[i]+c*space的数(c为非负整数),求摧毁最大数量时的最小nums[i]

思路:如果两个数x,y可以同时被摧毁,则x%space == y%space,用map统计同一类的数量,遍历数组求得最小值。

点击查看代码
class Solution { public: int destroyTargets(vector<int>& nums, int space) { map<int,int>mp; for(auto x:nums){ mp[x%space]++; } map<int,int>::iterator iter; int ans = 1e9,res = 0; for(auto x:nums){ if(mp[x%space]>res) { res = mp[x%space]; ans = x; } else if(mp[x%space] == res && x<ans) ans = x; } return ans; } };

6227. 下一个更大元素 IV

题意:对于数组中的每一个元素,返回大于它的第二个元素的值,若不能找到,返回为-1。

思路1:利用两个单调栈,一个栈存储已经找到一个大于的元素,一个存储还没有找到大于的数。然后对已存储的与nums[i]比较,得出结果。

点击查看代码
class Solution { public: vector<int> secondGreaterElement(vector<int>& nums) { priority_queue<pair<int, int>, vector<pair<int,int>>, greater<pair<int,int>>> q; stack<int>st; int n = nums.size(); vector<int>ans(n,-1); for(int i = 0;i<n;i++) { while(!q.empty() && q.top().first < nums[i]){ ans[q.top().second] = nums[i]; q.pop(); } while(st.size() && nums[st.top()] < nums[i]){ q.push({nums[st.top()],st.top()}); st.pop(); } st.push(i); } return ans; } };

思路2:对-nums[i]当作第一关键字序排序,然后将对应的下标i依次入栈,如果能找到两个大于i的下标,则存在,反之则不存在。

点击查看代码
class Solution { public: vector<int> secondGreaterElement(vector<int>& nums) { int n = nums.size(); typedef pair<int,int> pii; vector<pii>vec; vector<int>ans(n); set<int>tmp; for(int i=0;i<n;i++){ vec.push_back({-nums[i],i}); } sort(vec.begin(),vec.end()); for(int i=0;i<n;i++){ auto x = tmp.upper_bound(vec[i].second); if(x != tmp.end() && next(x) != tmp.end()) ans[vec[i].second] = nums[*next(x)]; else ans[vec[i].second] = -1; tmp.insert(vec[i].second); } return ans; } };

__EOF__

本文作者voids
本文链接https://www.cnblogs.com/voids5/p/16841544.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   voids5  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示