当前位置:   article > 正文

leetcode周赛

leetcode周赛

一、301周赛

1.装满杯子需要的最短总时长

装满杯子需要的最短总时长https://leetcode.cn/problems/minimum-amount-of-time-to-fill-cups/

代码:

  1. class Solution {
  2. public:
  3. int fillCups(vector<int>& amount) {
  4. sort(amount.begin(),amount.end());
  5. if(amount[2]>=amount[0]+amount[1]){
  6. return amount[2];
  7. }
  8. else{
  9. return (amount[0]+amount[1]-amount[2]+1)/2+amount[2];
  10. }
  11. }
  12. };

 解析:因为一台饮水机可以同时接两杯不同温度的水,所以尽可能的让其一直同时放两杯水用时最短。这就分为两种可能:1.排序后的amount[0]和amount[1]和小于等于amount[2],这样0、1和2进行匹配接水,0、1接完后再单独接2,总用时就是2的个数;2.排序后amount[0]和amount[1]和大于amount[2],同样的用0、1去匹配2,但是为了保证用时最短,剩下的0和1的个数应该是相等或者差一,因为同时接两杯水才是最省时的,所以最短用时是0和1减去2剩下的个数加一再除以2,最后再加上2的个数。

2.无限集中的最小数字

无限集中的最小数字icon-default.png?t=M666https://leetcode.cn/problems/smallest-number-in-infinite-set/

 

  1. 现有一个包含所有正整数的集合 [1, 2, 3, 4, 5, ...] 。
  2. 实现 SmallestInfiniteSet 类:
  3. SmallestInfiniteSet() 初始化 SmallestInfiniteSet 对象以包含 所有 正整数。
  4. int popSmallest() 移除 并返回该无限集中的最小整数。
  5. void addBack(int num) 如果正整数 num 不 存在于无限集中,则将一个 num 添加 到该无限集中。
  6.  
  7. 示例:
  8. 输入
  9. ["SmallestInfiniteSet", "addBack", "popSmallest", "popSmallest", "popSmallest", "addBack", "popSmallest", "popSmallest", "popSmallest"]
  10. [[], [2], [], [], [], [1], [], [], []]
  11. 输出
  12. [null, null, 1, 2, 3, null, 1, 4, 5]
  13. 解释
  14. SmallestInfiniteSet smallestInfiniteSet = new SmallestInfiniteSet();
  15. smallestInfiniteSet.addBack(2); // 2 已经在集合中,所以不做任何变更。
  16. smallestInfiniteSet.popSmallest(); // 返回 1 ,因为 1 是最小的整数,并将其从集合中移除。
  17. smallestInfiniteSet.popSmallest(); // 返回 2 ,并将其从集合中移除。
  18. smallestInfiniteSet.popSmallest(); // 返回 3 ,并将其从集合中移除。
  19. smallestInfiniteSet.addBack(1); //1 添加到该集合中。
  20. smallestInfiniteSet.popSmallest(); // 返回 1 ,因为 1 在上一步中被添加到集合中,
  21. //1 是最小的整数,并将其从集合中移除。
  22. smallestInfiniteSet.popSmallest(); // 返回 4 ,并将其从集合中移除。
  23. smallestInfiniteSet.popSmallest(); // 返回 5 ,并将其从集合中移除。

代码:

  1. class SmallestInfiniteSet {
  2. public:
  3. unordered_set<int>s;
  4. SmallestInfiniteSet() {
  5. }
  6. int popSmallest() {
  7. int i=1;
  8. for(;s.count(i);i++){
  9. }
  10. s.insert(i);
  11. return i;
  12. }
  13. void addBack(int num) {
  14. if(s.count(num))s.erase(num);
  15. }
  16. };
  17. /**
  18. * Your SmallestInfiniteSet object will be instantiated and called as such:
  19. * SmallestInfiniteSet* obj = new SmallestInfiniteSet();
  20. * int param_1 = obj->popSmallest();
  21. * obj->addBack(num);
  22. */

解析:本体的无限集数据太大不好维护,所以维护一个无限集中被删减的数据。无限集删除最小的数据,就相当于维护集中从1开始缺少的最小整数,添加到维护集合中。无限集添加数据就等价于从维护数据集中删除对应数据。

3.移动片段得到字符串

移动片段得到字符串icon-default.png?t=M666https://leetcode.cn/problems/move-pieces-to-obtain-a-string/

  1. 给你两个字符串 start 和 target ,长度均为 n 。每个字符串 仅 由字符 'L''R''_' 组成,其中:
  2. 字符 'L''R' 表示片段,其中片段 'L' 只有在其左侧直接存在一个 空位 时才能向 左 移动,而片段 'R' 只有在其右侧直接存在一个 空位 时才能向 右 移动。
  3. 字符 '_' 表示可以被 任意 'L''R' 片段占据的空位。
  4. 如果在移动字符串 start 中的片段任意次之后可以得到字符串 target ,返回 true ;否则,返回 false
  5.  
  6. 示例 1
  7. 输入:start = "_L__R__R_", target = "L______RR"
  8. 输出:true
  9. 解释:可以从字符串 start 获得 target ,需要进行下面的移动:
  10. - 将第一个片段向左移动一步,字符串现在变为 "L___R__R_"
  11. - 将最后一个片段向右移动一步,字符串现在变为 "L___R___R"
  12. - 将第二个片段向右移动散步,字符串现在变为 "L______RR"
  13. 可以从字符串 start 得到 target ,所以返回 true
  14. 示例 2
  15. 输入:start = "R_L_", target = "__LR"
  16. 输出:false
  17. 解释:字符串 start 中的 'R' 片段可以向右移动一步得到 "_RL_"
  18. 但是,在这一步之后,不存在可以移动的片段,所以无法从字符串 start 得到 target 。
  19. 示例 3
  20. 输入:start = "_R", target = "R_"
  21. 输出:false
  22. 解释:字符串 start 中的片段只能向右移动,所以无法从字符串 start 得到 target 。
  23. 来源:力扣(LeetCode)
  24. 链接:https://leetcode.cn/problems/move-pieces-to-obtain-a-string
  25. 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 代码:

  1. class Solution {
  2. public:
  3. bool canChange(string start, string target) {
  4. if(start.size()!=target.size())return false;
  5. vector<pair<char,int>>s,t;
  6. for(int i=0;i<start.size();i++){
  7. if(start[i]!='_'){
  8. s.push_back(make_pair(start[i],i));
  9. }
  10. if(target[i]!='_'){
  11. t.push_back(make_pair(target[i],i));
  12. }
  13. }
  14. if(s.size()!=t.size())return false;
  15. for(int i=0;i<s.size();i++){
  16. if(s[i].first=='L' && s[i].second<t[i].second)return false;
  17. else if(s[i].first=='R' && s[i].second>t[i].second)return false;
  18. else if(s[i].first!=t[i].first)return false;
  19. }
  20. return true;
  21. }
  22. };

解析:将start和target数组里面的非'_'元素全存到vector<pair<char,int>>容器中,然后比较这两个容器,如果相同位置内容不同,则返回false;如果start代表的容器的'L'的下标位置小于target的位置,由于L不能右移,故返回false;同理start的R的位置大于target的R的位置则返回false;其他情况都是返回true。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/732815
推荐阅读
相关标签
  

闽ICP备14008679号