leetcode刷题-排序

193 阅读1分钟

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;
}