likes
comments
collection
share

30天刷题挑战(十八)

作者站长头像
站长
· 阅读数 26

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

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

思路

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

代码

/**
 * @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 返回数组之外最小的数。

代码

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 中比较,取大值。

代码

/**
 * @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
};

本文完,感谢阅读。

转载自:https://juejin.cn/post/7290414556353953829
评论
请登录