30天刷题挑战(十八)

题目来源: LeetCode 75 30 天 JavaScript 挑战

215. 数组中的第K个最大元素

思路

快速排序方法对数组分区,返回第 nums.length - k 个数

代码

js 复制代码
/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
var findKthLargest = function(nums, k) {
  const len = nums.length

  const quick = (l, r) => {
    if (l > r) {
      return
    }
    let random = Math.floor(Math.random() * (r - l + 1)) + l
    swap(nums, random, r)

    let prvotIndex = partition(nums, l, r)
    
    if (len - k < prvotIndex) {
      quick(l, prvotIndex - 1)
    } else {
      quick(prvotIndex + 1, r)
    }
  }

  quick(0, len - 1)
  return nums[len - k]
};

function partition(nums, left, right) {
  let pivot = nums[right]
  let pivotIndex = left
  
  for (let i = left; i < right; i++) {
    if (nums[i] < pivot) {
      swap(nums, i, pivotIndex)
      pivotIndex++
    }
  }
  swap(nums, right, pivotIndex)
  return pivotIndex
}

function swap(nums, a, b) {
  [nums[a], nums[b]] = [nums[b], nums[a]]
}

2336. 无限集中的最小数字

思路

使用一个数组记录被删除的元素,addBack 时判断 num 是否存在于数组中,如果有就删除。popSmallest 返回数组之外最小的数。

代码

js 复制代码
class SmallestInfiniteSet {
    data: Array<number>

    constructor() {
      this.data = []
    }

    popSmallest(): number {
      let num = 0
      let n = Infinity

      for (let i = 1; i < n; i++) {
        if (!this.data.includes(i)) {
          this.data.push(i)
          num = i
          break
        }
      }

     return num
    }

    addBack(num: number): void {
      const idx = this.data.indexOf(num)
      if (idx !== -1) {
        this.data.splice(idx, 1)
      }
    }
}

2542. 最大子序列的分数

思路

nums1nums2 组合起来,然后从大到小排序。使用一个优先队列,在 knums1.length 中比较,取大值。

代码

js 复制代码
/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @param {number} k
 * @return {number}
 */
const maxScore = function(nums1, nums2, k) {
  let arr = [];
  let len = nums1.length;

  for(let i = 0; i < len; i++){
    arr.push([nums1[i], nums2[i]]);
  }

  arr.sort((a,b) => b[1] - a[1]);

  let sum = 0;
  let heap = new MinPriorityQueue();

  for (let i = 0; i < k; i++) {
    heap.enqueue(arr[i][0]);
    sum += arr[i][0];
  }

  let ans = sum * arr[k-1][1];

  for (let i = k; i < len; i++) {
    if (heap.front().element < arr[i][0]) {
        sum = sum - heap.dequeue().element + arr[i][0];
        heap.enqueue(arr[i][0]);
        ans = Math.max(ans, sum * arr[i][1]);
      }
  }

  return ans
};

本文完,感谢阅读。

相关推荐
白兰地空瓶3 分钟前
🚀你以为你在写 React?其实你在“搭一套前端操作系统”
前端·react.js
爱上妖精的尾巴36 分钟前
6-4 WPS JS宏 不重复随机取值应用
开发语言·前端·javascript
似水流年QC1 小时前
深入探索 WebHID:Web 标准下的硬件交互实现
前端·交互·webhid
陪我去看海1 小时前
测试 mcp
前端
speedoooo2 小时前
在现有App里嵌入一个AI协作者
前端·ui·小程序·前端框架·web app
fie88892 小时前
NSCT(非下采样轮廓波变换)的分解和重建程序
算法
全栈胖叔叔-瓜州2 小时前
关于llamasharp 大模型多轮对话,模型对话无法终止,或者输出角色标识User:,或者System等角色标识问题。
前端·人工智能
三七吃山漆2 小时前
攻防世界——wife_wife
前端·javascript·web安全·网络安全·ctf
用户47949283569152 小时前
面试官问"try-catch影响性能吗",我用数据打脸
前端·javascript·面试
晨晖23 小时前
单链表逆转,c语言
c语言·数据结构·算法