leetcode刷题-排序
1. 数组中的第K个最大元素
题目
给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
var findKthLargest = function(nums, k) {
const n = nums.length;
nums.sort((a, b) => a - b);
return nums[n - k];
};
2. 前 K 个高频元素
题目
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序返回答案。
var topKFrequent = function(nums, k) {
const map = new Map();
nums.forEach(item => {
if (map.has(item)) {
map.set(item, map.get(item) + 1);
} else {
map.set(item, 1);
}
});
const mapArr = Array.from(map);
mapArr.sort((a, b) => b[1] - a[1]);
const resArr = [];
for (let i = 0; i < k; i++) {
resArr.push(mapArr[i][0]);
}
return resArr;
};
3. 根据字符出现频率排序
题目
给定一个字符串,请将字符串里的字符按照出现的频率降序排列。
var frequencySort = function(s) {
const map = new Map();
const sArr = s.split('');
sArr.forEach(item => {
if (map.has(item)) {
map.set(item, map.get(item) + 1);
} else {
map.set(item, 1);
}
});
const mapArr = Array.from(map);
mapArr.sort((a, b) => b[1] - a[1]);
const resArr = [];
mapArr.forEach(item => {
for (let i = 0; i < item[1]; i++) {
resArr.push(item[0]);
}
});
return resArr.join('');
};
4. 颜色分类
题目
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
var sortColors = function(nums) {
let zero = -1, one = 0, two = nums.length;
while(one < two) {
if (nums[one] === 0) {
swap(nums, one++, ++zero);
} else if (nums[one] === 2) {
swap(nums, one, --two);
} else {
one++;
}
}
};
function swap(nums, i, j) {
const temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}