力扣 431 场周赛-前两题-javascript(把哥们难懵了)

123 阅读1分钟

3411. 最长乘积等价子数组

第一题直接来个下马威,时间复杂度:O(n2)O(n^2)

function gcd(a, b) {
  return b === 0 ? a : gcd(b, a % b)
}

function lcm(a, b) {
  return (a * b) / gcd(a, b)
}

var maxLength = function (nums) {
  let maxLen = 0

  for (let i = 0; i < nums.length; i++) {
    let prod = 1
    let currentGcd = nums[i]
    let currentLcm = nums[i]

    for (let j = i; j < nums.length; j++) {
      prod *= nums[j]
      currentGcd = gcd(currentGcd, nums[j])
      currentLcm = lcm(currentLcm, nums[j])

      if (prod === currentGcd * currentLcm) {
        maxLen = Math.max(maxLen, j - i + 1)
      }
    }
  }

  return maxLen
}

3412. 计算字符串的镜像分数

第二题还算是平常题,按照题目说的流程来就行了,主要就是使用一个 map 来维护每个元素的标记状态,时间复杂度:O(n)O(n)

var calculateScore = function (s) {
  const mirror = (char) => String.fromCharCode(219 - char.charCodeAt(0))
  const map = new Map()
  let ans = 0
  for (let i = 0; i < s.length; i++) {
    const mirroredChar = mirror(s[i])
    const temp = map.get(mirroredChar)
    if (temp == undefined || temp.length == 0) {
      const item = map.get(s[i])
      if (item == undefined) {
        map.set(s[i], [i])
      } else {
        item.push(i)
        map.set(s[i], item)
      }
    } else {
      const j = temp.pop()
      ans += i - j
      map.set(mirroredChar, temp)
    }
  }
  return ans
}