算法小白,2024年2月21日,开始挑战在掘金发布“每日”系列。 (节假日可能会出门所以不算) 涉及到算法,type challenge 等,感兴趣的小伙伴可以持续关注督促互勉 🚀🚀🚀
算法
题意理解
一个长度为 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>,返回类型 S 和 R 中不同的类型
思路
- 对两个类型取或操作,获得公共的类型字段
- 使用
Omit去除公共字段
type Diff<S, T> = Omit<S & T, keyof (T | S)>