一、引言
今天的周赛打的一言难尽,由于一个简单的 long
转换疏忽导致自己 T3
没A
二、 6004. 得到 0 的操作数
1、题目简介
2、题目解析
- 模拟即可
- 注意返回的条件:
while(num1 != 0 && num2 != 0)
3、题目代码
class Solution { public int countOperations(int num1, int num2) { int count = 0; while(num1 != 0 && num2 != 0){ if(num1 >= num2){ num1 = num1 - num2; }else{ num2 = num2 - num1; } count++; } return count; } }
三、6005. 使数组变成交替数组的最少操作数
1、题目简介
2、题目解析
- 贪心
- 我们分析题目,简单的来讲,最后的结果:
我们奇数位是同一个数字,偶数位是同一个数字,并且数字不能相等
- 我们使用两个优先队列存储其次数,根据
出现最多的次数
进行判断 - 我们考虑以下几种情况:
- [0]:
队列二为空
- [1,2]:
队列一和队列二大小均为1
- [1,2,3]:
队列一大小为2,队列二大小为1
- [1,2,3,4]:
队列一大小为2,队列二大小为2
- 我们比较优先队列的
int value = peek()
,数字出现的次数
- 如果不相等的话,说明最终都需要变成
value
,计算其次数即可 - 如果相等的话,我们需要比较
value
的大小,大的保持原状,小的需要变成第二大的
3、题目代码
class Solution { public static int minimumOperations(int[] nums) { if (nums.length == 1) { return 0; } HashMap<Integer, Integer> map1 = new HashMap<>(); HashMap<Integer, Integer> map2 = new HashMap<>(); int count1 = 0; int count2 = 0; for (int i = 0; i < nums.length; i++) { if (i % 2 != 0) { count1++; map1.put(nums[i], map1.getOrDefault(nums[i], 0) + 1); } else { count2++; map2.put(nums[i], map2.getOrDefault(nums[i], 0) + 1); } } // 奇数 PriorityQueue<int[]> priorityQueue1 = new PriorityQueue<>(new Comparator<int[]>() { @Override public int compare(int[] o1, int[] o2) { return o2[1] - o1[1]; } }); for (Integer key : map1.keySet()) { priorityQueue1.add(new int[]{key, map1.get(key)}); } // 偶数 PriorityQueue<int[]> priorityQueue2 = new PriorityQueue<>(new Comparator<int[]>() { @Override public int compare(int[] o1, int[] o2) { return o2[1] - o1[1]; } }); for (Integer key : map2.keySet()) { priorityQueue2.add(new int[]{(int) key, (int) map2.get(key)}); } if (priorityQueue1.size() == 1 && priorityQueue2.size() == 1) { if (priorityQueue1.peek()[0] != priorityQueue2.peek()[0]) { return 0; } else { return priorityQueue1.peek()[1] >= priorityQueue2.peek()[1] ? priorityQueue2.peek()[1] : priorityQueue1.peek()[1]; } }else if (priorityQueue1.size() > 1 && priorityQueue2.size() == 1) { if (priorityQueue1.peek()[0] != priorityQueue2.peek()[0]) { return count1 - priorityQueue1.peek()[1]; } else { if (priorityQueue1.peek()[1] >= priorityQueue2.peek()[1]) { return count2 + count1 - priorityQueue1.peek()[1]; } else { priorityQueue1.poll(); return count1 - priorityQueue1.peek()[1]; } } } else { if (priorityQueue1.peek()[0] != priorityQueue2.peek()[0]) { return count1 - priorityQueue1.peek()[1] + count2 - priorityQueue2.peek()[1]; } else { if (priorityQueue1.peek()[1] >= priorityQueue2.peek()[1]) { priorityQueue2.poll(); return count1 - priorityQueue1.peek()[1] + count2 - priorityQueue2.peek()[1]; } else { priorityQueue1.poll(); return count1 - priorityQueue1.peek()[1] + count2 - priorityQueue2.peek()[1]; } } } } }
四、6006. 拿出最少数目的魔法豆
1、题目简介
2、题目解析
- 我们发现,我们要想使魔法豆相等,需要找到一个
临界点
,根据这个临界点:小于他的全部变成0,大于他的全部变成成它
- 先进行排序
- 我们以
[1,4,5,6]
作为例子 - 假设当前的临界点为
5
,那么我们的1、4
需要变为0
,6
变成5
,最后的结果为:7 - 由于我们的魔法豆没办法增加,只能减少
- 当我们遍历其数值时,我们将
整体的和 - 后面的数据个数 * 当前的值
- 注意,我们在求值的时候,千万不要忘了将类型转为
long
- 这个题目也可以使用
前缀和
3、题目代码
class Solution { public long minimumRemoval(int[] beans) { int len = beans.length; Arrays.sort(beans); long sum = 0; for(int i = 0; i < len; i++){ sum = sum + beans[i]; } long minSum = Long.MAX_VALUE; for(int i = 0; i < len; i++){ // 注意转为long minSum = Math.min(minSum, sum - (len - i) * (long)beans[i]); } return minSum; } }
五、总结
这次的周赛成绩还是不理想,希望下次的周赛成绩更好一点~
下一次一定注意类型的转换
加油加油~~~