add: 验证回文字符串 Ⅱ
This commit is contained in:
18
src/array/maximum-product-subarray.js
Normal file
18
src/array/maximum-product-subarray.js
Normal file
@ -0,0 +1,18 @@
|
||||
/**
|
||||
* @param {number[]} nums
|
||||
* @return {number}
|
||||
*/
|
||||
export const maxProduct = function (nums) {
|
||||
let res = nums[0]
|
||||
let prevMin = nums[0]
|
||||
let prevMax = nums[0]
|
||||
let tmp1 = 0; let tmp2 = 0
|
||||
for (let i = 1; i < nums.length; i++) {
|
||||
tmp1 = prevMin * nums[i]
|
||||
tmp2 = prevMax * nums[i]
|
||||
prevMin = Math.min(tmp1, tmp2, nums[i])
|
||||
prevMax = Math.max(tmp1, tmp2, nums[i])
|
||||
res = Math.max(prevMax, res)
|
||||
}
|
||||
return res
|
||||
}
|
34
src/graphs/course-schedule-ii.js
Normal file
34
src/graphs/course-schedule-ii.js
Normal file
@ -0,0 +1,34 @@
|
||||
/**
|
||||
* @param {number} numCourses
|
||||
* @param {number[][]} prerequisites
|
||||
* @return {number[]}
|
||||
*/
|
||||
export const findOrder = function (numCourses, prerequisites) {
|
||||
const courses = Array(numCourses).fill(0) // 初始化 上课 需要先完成课程 的门数
|
||||
const obj = {} // 记录受该课程 影响的其他课
|
||||
prerequisites.forEach(item => {
|
||||
const one = item[0]; const two = item[1] // one 要上的课, two 需先完成的课
|
||||
courses[one]++ // 门数 + 1
|
||||
obj[two] ? obj[two].push(one) : obj[two] = [one] // 存在就加, 不存在就新建
|
||||
})
|
||||
const res = []
|
||||
const queue = [] // 队列
|
||||
courses.forEach((t, i) => { // 往队列添加 无需先上 就可以 上 的课
|
||||
if (t === 0) queue.push(i) // 因为是从0开始的, 所以索引也能代替 课的名称
|
||||
})
|
||||
while (queue.length) {
|
||||
const cur = queue.shift() // 出队 表示该课已经上了
|
||||
res.push(cur) // 把出队的放入 结果数组
|
||||
const list = obj[cur] // 获取受该课影响的 课
|
||||
list && list.forEach(item => {
|
||||
courses[item]-- // 因为 出队表示该课已经上了, 所以 要先完成的门数 - 1
|
||||
if (courses[item] === 0) { // 当这个课 要先修完的 已经修完了, 入队
|
||||
queue.push(item)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
return res.length === numCourses ? res : []
|
||||
}
|
||||
|
||||
// 参考自 https://leetcode-cn.com/problems/course-schedule-ii/solution/chao-da-an-by-shetia/
|
37
src/string/valid-palindrome-ii.js
Normal file
37
src/string/valid-palindrome-ii.js
Normal file
@ -0,0 +1,37 @@
|
||||
/**
|
||||
* @param {string} s
|
||||
* @return {boolean}
|
||||
*/
|
||||
export const validPalindrome = function (s, flag = true) {
|
||||
let l = 0; let r = s.length - 1
|
||||
while (l < r && s[l] === s[r]) {
|
||||
l++; r--
|
||||
}
|
||||
if (l >= r) return true // 说明是回文
|
||||
if (flag) return validPalindrome(s.slice(l, r), false) || validPalindrome(s.slice(l + 1, r + 1), false) // 如果不是回文,切左边或者右边,再判断一次
|
||||
return false
|
||||
}
|
||||
|
||||
// 暴力解法,会超时
|
||||
// /**
|
||||
// * @param {string} s
|
||||
// * @return {boolean}
|
||||
// */
|
||||
// export const validPalindrome = function (s) {
|
||||
// const len = s.length
|
||||
// const tmpLen = len - 1
|
||||
// let mid = len >> 1
|
||||
// if (s.substring(0, mid) === s.substring(len % 2 ? mid + 1 : mid, len).split('').reverse().join('')) {
|
||||
// return true
|
||||
// }
|
||||
|
||||
// mid = tmpLen >> 1
|
||||
// for (let n = 0; n < len; n++) {
|
||||
// const tmp = s.substring(0, n) + s.substring(n + 1, len)
|
||||
// if (tmp.substring(0, mid) === tmp.substring(tmpLen % 2 ? mid + 1 : mid, tmpLen).split('').reverse().join('')) {
|
||||
// return true
|
||||
// }
|
||||
// }
|
||||
|
||||
// return false
|
||||
// }
|
Reference in New Issue
Block a user