CSDN话题挑战赛第2期 参赛话题:学习笔记
题目一、(简单题)1464. 数组中两元素的最大乘积
原题链接:1464. 数组中两元素的最大乘积
题目描述:
给你一个整数数组 nums,请你选择数组的两个不同下标 i 和 j,使 (nums[ i ] - 1)*(nums[ j ] - 1) 取得最大值。
请你计算并返回该式的最大值。
解题思路: 这道题十分简单,当作热身吧。 要选择下标 i 与 j 让 (nums[ i ] - 1)*(nums[ j ] - 1) 取得最大值。 我们不需要纠结选择哪两个下标才能取到最大值,直接为数组排序,选择最大的两个元素分别减1再相乘即可。 我使用的是最大堆为数组元素排序。
解题代码:
class Solution {
public int maxProduct(int[] nums) {
PriorityQueue<Integer> que = new PriorityQueue<>(new Comparator<Integer>(){
public int compare(Integer a,Integer b){
return b - a;
}
});
for(int num : nums){
que.offer(num);
}
int a = (int)que.poll()-1;
int b = (int)que.poll()-1;
return a*b;
}
}
提交结果:
题目二、(中等题)347. 前 K 个高频元素
原题链接:347. 前 K 个高频元素
题目描述:
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
/
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2] / 示例 2:
输入: nums = [1], k = 1
输出: [1]
解题思路: 用HashMap的键值对{key-value对}存放数组元素与元素出现的次数。 key: 数组中出现过的元素 value: 元素出现的频率 遍历map集合,将键值对以长度为2的一维数组形式放入最大堆排序: 一维数组 int [ ] {key,value} 排序按照数组中的value大小排序。 最后输出排序好的,前k个高频元素。 具体实现可以看代码,注释详细:
代码:
class Solution {
public int[] topKFrequent(int[] nums, int k) {
PriorityQueue<int[]> que = new PriorityQueue<>(new Comparator<int[]>(){
public int compare(int[] a,int[] b){
return b[1]-a[1];
}
});
Map<Integer,Integer> map = new HashMap<>();
for(int num : nums){
if(map.containsKey(num)){
map.replace(num,map.get(num).intValue()+1);
}else{
map.put(num,1);
}
}
Iterator<Map.Entry<Integer,Integer>> iterator = map.entrySet().iterator();
while(iterator.hasNext()){
Map.Entry<Integer,Integer> entry = iterator.next();
que.offer(new int[]{entry.getKey(),entry.getValue()});
}
int[] out = new int[k];
for(int i = 0;i < k; ++i){
out[i] = (int)que.poll()[0];
}
return out;
}
}
提交结果:
题目三、(困难题)2163. 删除元素后和的最小差值
原题链接:2163. 删除元素后和的最小差值
题目描述:
解题思路: 舒勇两个优先队列,一个最小堆,一个最大堆。 创建两个数组,分别存放最小和与最大和的所有情况。 最后将所有情况中最小的差值输出。
代码:
class Solution {
public long minimumDifference(int[] nums) {
int n = nums.length / 3;
long[] min = new long[3 * n];
long[] max = new long[3 * n];
PriorityQueue<Integer> asc = new PriorityQueue<>();
PriorityQueue<Integer> desc = new PriorityQueue<>(new Comparator<Integer>(){
public int compare(Integer a,Integer b){
return b-a;
}
});
long sum_first = 0, sum_second = 0;
for (int i = 0; i < 3 * n; i++) {
int l = i, r = 3 * n - 1 - i;
int left = nums[l], right = nums[r];
sum_first += left;
desc.add(left);
sum_second += right;
asc.add(right);
if (i >= n) {
sum_first -= desc.poll();
sum_second -= asc.poll();
}
min[l] = sum_first;
max[r] = sum_second;
}
long minAns = Long.MAX_VALUE;
for (int i = n - 1; i < 2 * n; i++) {
minAns = Math.min(minAns, min[i] - max[i + 1]);
}
return minAns;
}
}
提交结果:
贵在坚持:🎇关注作者,共同进步…
|