30 天刷题计划(二)
思路
使用贪心算法,对于每个孩子,检查糖果 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
};
思路
模拟法,按题意只有相邻都为 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
};
思路
快慢指针,慢指针 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
};
思路
使用闭包保存一个变量,每次调用 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