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

本文完,感谢阅读。

相关推荐
微笑尅乐2 分钟前
从递归到迭代吃透树的层次——力扣104.二叉树的最大深度
算法·leetcode·职场和发展
广州华水科技3 分钟前
单北斗GNSS形变监测系统在桥梁安全中的应用与技术解析
前端
海梨花4 分钟前
【八股笔记】SSM
java·开发语言·笔记·后端·面试·框架
im_AMBER5 分钟前
Leetcode 28
算法·leetcode
打小就很皮...14 分钟前
ShowCountCard 功能迭代:新增周月对比属性,完善数据可视化场景
前端·react.js·信息可视化
让我们一起加油好吗22 分钟前
【基础算法】多源 BFS
c++·算法·bfs·宽度优先·多源bfs
IT_陈寒24 分钟前
Redis性能翻倍的7个冷门技巧:从P5到P8都在偷偷用的优化策略!
前端·人工智能·后端
B站计算机毕业设计之家28 分钟前
深度学习实战:python动物识别分类检测系统 计算机视觉 Django框架 CNN算法 深度学习 卷积神经网络 TensorFlow 毕业设计(建议收藏)✅
python·深度学习·算法·计算机视觉·分类·毕业设计·动物识别
Moonbit35 分钟前
MoonBit Meetup 丨 手把手带你走进 AI 编程新世代
前端·后端·程序员
携欢36 分钟前
PortSwigger靶场之 CSRF where token is not tied to user session通关秘籍
前端·csrf