75 颜色分类
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
注意:
不能使用代码库中的排序函数来解决这道题。
示例:
输入: [2,0,2,1,1,0] 输出: [0,0,1,1,2,2]
进阶:
- 一个直观的解决方案是使用计数排序的两趟扫描算法。
首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。 - 你能想出一个仅使用常数空间的一趟扫描算法吗?
class Solution {
public void sortColors(int[] nums) {
int a = 0,b = 0,c = 0;
for(int i=0; i<nums.length; i++){
if(nums[i] == 0){
a += 1;
}else if(nums[i] == 1){
b += 1;
}else if(nums[i] == 2){
c += 1;
}
}
int current = 0;
for(int i=0; i<a; i++){
nums[current] = 0;
current += 1;
}
for(int i=0; i<b; i++){
nums[current] = 1;
current += 1;
}
for(int i=0; i<c; i++){
nums[current] = 2;
current += 1;
}
}
}
347 前 K 个高频元素
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2]
示例 2:
输入: nums = [1], k = 1 输出: [1]
说明:
- 你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。
- 你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大小。
class Solution {
public List<Integer> topKFrequent(int[] nums, int k) {
List<Integer> arr = new ArrayList<Integer>();
Map<Integer, Integer> num_key = new HashMap<Integer, Integer>();
for(int i=0; i<nums.length; i++){
if(!num_key.containsKey(nums[i])){
num_key.put(nums[i], 1);
}else{
num_key.put(nums[i], num_key.get(nums[i])+1);
}
}
Map<Integer, Integer> result = num_key.entrySet().stream()
.sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
(oldValue, newValue) -> oldValue, LinkedHashMap::new));
int count = 0;
for(Map.Entry<Integer,Integer> item : result.entrySet()){
if(count < k){
arr.add(item.getKey());
count += 1;
}else{
break;
}
}
return arr;
}
}
215 数组中的第K个最大元素
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例 1:
输入: [3,2,1,5,6,4] 和
k = 2
输出: 5
示例 2:
输入: [3,2,3,1,2,4,5,5,6] 和
k = 4
输出: 4
说明:
你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。
class Solution {
public int findKthLargest(int[] nums, int k) {
Queue<Integer> queue = new PriorityQueue<Integer>();
for(int i=0; i<nums.length; i++){
if(queue.size() >= k){
queue.add(nums[i]);
queue.poll();
}else{
queue.add(nums[i]);
}
}
return queue.peek();
}
}