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

本文完,感谢阅读。

相关推荐
发现一只大呆瓜6 小时前
深度解密 Rollup 插件开发:核心钩子函数全生命周期图鉴
前端·vite
java_nn7 小时前
一文了解前端技术
前端
发现一只大呆瓜7 小时前
深度解析 Rollup 配置与 Vite 生产构建流程
前端·vite
小码哥_常7 小时前
安卓黑科技:让手机成为你的“跌倒保镖”
前端
故事和你917 小时前
洛谷-数据结构1-1-线性表1
开发语言·数据结构·c++·算法·leetcode·动态规划·图论
脱氧核糖核酸__7 小时前
LeetCode热题100——53.最大子数组和(题解+答案+要点)
数据结构·c++·算法·leetcode
小李子呢02118 小时前
前端八股Vue---Vue2和Vue3的区别,set up的用法
前端·javascript·vue.js
m0_647057968 小时前
Harness Engineering 实践指南
前端
脱氧核糖核酸__8 小时前
LeetCode 热题100——42.接雨水(题目+题解+答案)
数据结构·c++·算法·leetcode
我叫黑大帅8 小时前
为什么TCP是三次握手?
后端·网络协议·面试