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

本文完,感谢阅读。

相关推荐
不会打代码呜呜呜呜11 分钟前
小白零基础--CPP多线程
开发语言·c++·算法
老大白菜17 分钟前
在 Ubuntu 中使用 FastAPI 创建一个简单的 Web 应用程序
前端·ubuntu·fastapi
渔阳节度使26 分钟前
React
前端·react.js·前端框架
辰尘_星启43 分钟前
【单层神经网络】基于MXNet的线性回归实现(底层实现)
算法·线性回归·mxnet
kcwqxx1 小时前
day37|完全背包基础+leetcode 518.零钱兑换II ,377.组合总和II
c++·算法·leetcode·动态规划
程序趣谈1 小时前
算法随笔_36: 复写零
数据结构·python·算法
九亿AI算法优化工作室&1 小时前
GWO优化LSBooST回归预测matlab
人工智能·python·算法·机器学习·matlab·数据挖掘·回归
LCG元2 小时前
Vue.js组件开发-如何实现异步组件
前端·javascript·vue.js
Lorcian2 小时前
web前端12--表单和表格
前端·css·笔记·html5·visual studio code
问道飞鱼2 小时前
【前端知识】常用CSS样式举例
前端·css