likes
comments
collection
share

30 天刷题计划(二)

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

1431. 拥有最多糖果的孩子

思路

使用贪心算法,对于每个孩子,检查糖果 candies[i] + extraCandies ≥ candies[i] 中的最大值。

代码

function kidsWithCandies(candies: number[], extraCandies: number): boolean[] {
  let res = []
  let _candies = candies.map(c => c += extraCandies)
  let max = Math.max(...candies)

  console.log(max)
  
  candies.forEach((can) => {
      if (can + extraCandies >= max) {
          res.push(true)
      } else {
          res.push(false)
      }
  }) 

  return res
};

605. 种花问题

思路

模拟法,按题意只有相邻都为 0,并且自身也为 0 的位置才能种花

代码

function canPlaceFlowers(flowerbed: number[], n: number): boolean {
  flowerbed.unshift(0)
  flowerbed.push(0)

  for(let i = 1; i < flowerbed.length; i++) {
      if (flowerbed[i - 1] === 0 && flowerbed[i] === 0 && flowerbed[i + 1] === 0) {
          flowerbed[i] = 1
          n--
      }
  }

  return n <= 0
};

80. 删除有序数组中的重复项 II

思路

快慢指针,慢指针 slow 走在后面,快指针 fast 走在前面探路,找到一个不重复的元素就告诉 slow 并让 slow 前进一步。这样当 fast 指针遍历完整个数组 nums 后,nums[0..slow] 就是不重复元素

添加一个 count 变量记录每个数字重复出现的次数。

代码

function removeDuplicates(nums: number[]): number {
  if (nums.length === 0) {
    return 0
  }

  let slow = 0
  let fast = 0
  let count = 0

  while(fast < nums.length) {
      if (nums[fast] !== nums[slow]) {
          slow++
          nums[slow] = nums[fast]
      } else if (slow < fast && count < 2) {
          slow++
          nums[slow] = nums[fast]
      }
      fast++
      count++

      if (fast < nums.length && nums[fast] !== nums[fast - 1]){
          count = 0
      }
  }

  return slow + 1
};

2620. 计数器

思路

使用闭包保存一个变量,每次调用 counter 函数,变量加一

代码

function createCounter(n: number): () => number {
    let res = -1

    return function() {
        res += 1
        return res + n
    }
}

// 简化
function createCounter(n: number): () => number {
    return () => n++
}
转载自:https://juejin.cn/post/7283799929403195449
评论
请登录