当前位置:   article > 正文

最小调整顺序次数(特异性双端队列)_第一行一个整数 n,表示数据范围。 接下来有 2n 行,其中有 n 行为添加数据:指令“

第一行一个整数 n,表示数据范围。 接下来有 2n 行,其中有 n 行为添加数据:指令“

题目

有一个特异性的双端队列,该队列可以从头部到尾部添加数据,但是只能从头部移除数据。 小 A 一次执行 2n 个指令往队列中添加数据和移除数据, 其中 n 个指令是添加数据(可能从头部也可以从尾部添加) 依次添加 1 到 n , n 个指令是移出数据 现在要求移除数据的顺序为 1 到 n , 为了满足最后输出的要求, 小 A 可以在任何时候调整队列中的数据的顺序 请问,小 A 最少需要调整几次才能满足移除数据的顺序正好是 1 到 n

输入

第一行一个整数 n ,表示数据范围 接下来有 2n 行,其中有 n 行为添加数据: 指令head add x表示从头部添加数据x tail add x表示从尾部添加数据x 另外 n 行为移除数据指令,指令为remove形式,表示移除一个数据 1≤n≤3×10^5105

输出

一个整数,表示小 A 要调整的最小次数

示例:

3
head add 1
remove
tail add 2
head add 3
remove
remove

输出:

1

 只需要调整1次,第二次remove需要将应该删除2,但是2在队尾,需要调整,然后再删除。

Java 代码

使用Deque

  1. public static void main(String[] args) {
  2. String[] ss = {"head add 1","remove","tail add 2","head add 3","remove","remove"};
  3. int count = 0;
  4. //删除索引,从1开始,每次删除一个,加一
  5. int delIndex = 1;
  6. Deque<Integer> deque = new ArrayDeque<>();
  7. for(String s : ss){
  8. if (s.startsWith("remove")){
  9. //如果只有一个元素,或者队列开头就是要删除的元素,直接操作
  10. if (deque.size() == 1 || deque.peekFirst() == delIndex){
  11. deque.poll();
  12. delIndex++;
  13. continue;
  14. }
  15. //开始调整,转化为数组
  16. Object[] nums = deque.toArray();
  17. //排序
  18. Arrays.sort(nums);
  19. deque.clear();
  20. //写入deque
  21. for(Object obj:nums){
  22. deque.addLast((Integer) obj);
  23. }
  24. deque.poll();
  25. delIndex++;
  26. count++;
  27. }
  28. else{
  29. String[] arr = s.split(" ");
  30. if (s.startsWith("head")){
  31. deque.addFirst(Integer.parseInt(arr[2]));
  32. }
  33. else{
  34. deque.addLast(Integer.parseInt(arr[2]));
  35. }
  36. }
  37. }
  38. System.out.println(count);
  39. }

使用List

  1. public static void main(String[] args) {
  2. String[] ss = {"head add 1","remove","tail add 2","head add 3","remove","remove"};
  3. int count = 0;
  4. int delIndex = 1;
  5. List<Integer> list = new ArrayList<>();
  6. for(String s : ss){
  7. if (s.startsWith("remove")){
  8. if (list.size() == 1 || list.get(0) == delIndex){
  9. list.remove(0);
  10. delIndex++;
  11. continue;
  12. }
  13. Collections.sort(list);
  14. list.remove(0);
  15. delIndex++;
  16. count++;
  17. }
  18. else{
  19. String[] arr = s.split(" ");
  20. if (s.startsWith("head")){
  21. list.add(0,Integer.parseInt(arr[2]));
  22. }
  23. else{
  24. list.add(Integer.parseInt(arr[2]));
  25. }
  26. }
  27. }
  28. System.out.println(count);
  29. }

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

闽ICP备14008679号