挑战 - 每日系列(Algorithm + TypeChallenge)

59 阅读1分钟

算法小白,2024年2月21日,开始挑战在掘金发布“每日”系列。 (节假日可能会出门所以不算) 涉及到算法,type challenge 等,感兴趣的小伙伴可以持续关注督促互勉 🚀🚀🚀

算法

2369. 检查数组是否存在有效划分

题意理解

一个长度为 n 的数组由常数组成,有三种划分方式:连续两个相等,连续三个相等,连续三个递增。求这个数组是否能被这三种方式划分

思路

  • 数组长度为 1 的时候,无法被划分
  • 数组长度为 2 的时候,只需要判断是否相等即可
  • 数组长度为 3 的时候,只需要判断是否相等或者连续递增
  • 数组长度为 4 的时候,只需要判断长度为 2 和 4 的两个子数组是否能被划分
  • 可以使用动态规划,dp[i] 表示长度为 i 的子数组能否被划分

解题

const validPartition = (nums) => {
  const n = nums.length
  const dp = new Array(n).fill(false)

  dp[0] = false
  dp[1] = nums[1] === nums[0]

  for (let i = 2; i < n; i++) {
    // 连续两个相等
    if(nums[i] === nums[i - 1]) {
      dp[i] = dp[i] || dp[i - 2]
    }
    // 连续三个相等或者递增
    if ((num[i] === nums[i - 1] && nums[i - 1] === nums[i - 2]) || (nums[i] - 1 === nums[i - 1] && nums[i - 1] - 1 === nums[i - 2])) {
      dp[i] = dp[i] || (i - 3 >= 0 ? dp[i - 3] : true)
    }
  }

  return dp[n - 1]
}

TypeChallenge

实现一个Diff<S, R>,返回类型 SR 中不同的类型

思路

  • 对两个类型取或操作,获得公共的类型字段
  • 使用 Omit去除公共字段
type Diff<S, T> = Omit<S & T, keyof (T | S)>