【算法】有效的字母异位词、前 K 个高频元素

73 阅读2分钟

242、有效的字母异位词

0. 题面

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

示例 1:

输入: (s = 'anagram'), (t = 'nagaram');
输出: true;

示例 2:

输入: (s = 'rat'), (t = 'car');
输出: false;

提示:

1 <= s.length, t.length <= 5 * 104
s 和 t 仅包含小写字母

解法 1: 排序

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isAnagram = function (s, t) {
  return s.split('').sort().join('') === t.split('').sort().join('');
};

思路:

  • 将字符串转为数组,排序后再转为字符串,比较两个字符串是否相等。
  • 复杂度:时间复杂度 O(nlogn),空间复杂度 O(1)

解法 2: 哈希表

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isAnagram = function (s, t) {
  if (s.length !== t.length) {
    return false;
  }
  const map = new Map();
  for (let i = 0; i < s.length; i++) {
    map.set(s[i], (map.get(s[i]) || 0) + 1);
    map.set(t[i], (map.get(t[i]) || 0) - 1);
  }
  for (const value of map.values()) {
    if (value !== 0) {
      return false;
    }
  }
  return true;
};

思路:

  • 使用哈希表存储每个字符出现的次数,然后比较遍历这个哈希表,一个加一,一个减一,最后判断是否都为 0。
  • 复杂度:时间复杂度 O(n),空间复杂度 O(1)

347、前 K 个高频元素

0. 题面

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

示例 1:

输入: (nums = [1, 1, 1, 2, 2, 3]), (k = 2);
输出: [1, 2];

示例 2:

输入: (nums = [1]), (k = 1);
输出: [1];

提示:

1 <= nums.length <= 10^5
k 的取值范围是 [1, 数组中不相同的元素的个数]
题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一

解法

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number[]}
 */
var topKFrequent = function (nums, k) {
  const obj = {};
  for (let i = 0; i < nums.length; i++) {
    if (obj[nums[i]]) {
      obj[nums[i]] = obj[nums[i]] + 1;
    } else {
      obj[nums[i]] = 1;
    }
  }
  const keys = Object.keys(obj);
  const result = [0];
  for (let i = 0; i < keys.length; i++) {
    result[obj[keys[i]]] = keys[i];
  }
  return result.splice(k, result.length - 1);
};

思路:

  • 遍历数组,将每个元素出现的次数存入对象。
  • 遍历对象,将每个元素出现的次数作为索引,元素作为值存入数组。
  • 返回数组中索引从 k 开始到末尾的元素。
  • 复杂度:时间复杂度 O(n),空间复杂度 O(n)