贪心算法:种花问题🌹和验证回文字符串 Ⅱ

1,724 阅读2分钟

这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战

11月最后一天了,只做两道简单的leetcode题目吧,有时候一道简单的题目可能也花了不少时间,是我太菜了

种花问题

题目地址:    leetcode-cn.com/problems/ca…

题目描述:

假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。

给你一个整数数组  flowerbed 表示花坛,由若干 0 和 1 组成,其中 0 表示没种植花,1 表示种植了花。另有一个数 n ,能否在不打破种植规则的情况下种入 n 朵花?能则返回 true ,不能则返回 false。

示例

示例1

输入: flowerbed = [1,0,0,0,1], n = 1

输出: true

示例1

输入: flowerbed = [1,0,0,0,1], n = 2

输出: false

题目分析

本题其实是一道比较容易的算法问题(虽然我一开始走弯路了,导致越写越复杂,还没解答出来)。 首先对问题进行分析,要判断n朵花能否植入当前花地,就是说要找出当前花地最大能够种植多少花。

这里通过规律可以发现,当前位置能否种植花只需要判断前一个值和后一个值是否为0即可,如果条件都满足,则在该位置可以种花。(起始位置和某位位置可以特殊考虑,可以判断undefined的情况)

在编写代码时,我一开始使用了forEach循环对数组进行遍历,但是每种植一朵花除了计数外,还要改变数组,所以还是老老实实使用for循环吧。

代码

let curCount = 0,len = flowerbed.length;
for (let i = 0; i < len; i++) {
    let ele = flowerbed[i]
    if (ele == 0) {
        if ((flowerbed[i - 1] == undefined || flowerbed[i - 1] == 0) && (flowerbed[i + 1] == undefined || flowerbed[i + 1] == 0)) {
            curCount++;
            flowerbed[i] = 1;
        }
    }
}

if (curCount >= n) {
    return true;
} else {
    return false;
}

验证回文字符串 Ⅱ

题目地址: leetcode-cn.com/problems/va…

题目描述:

给定一个非空字符串 s最多删除一个字符。判断是否能成为回文字符串。

示例

示例 1:
输入: s = "aba"
输出: true

示例 2:
输入: s = "abca"
输出: true
解释: 你可以删除c字符。

示例 3:
输入: s = "abc"
输出: false

题目分析

本题可以通过字符串两边同时向内推进的方式判断当前是否是回文字符串,如果遇到两边值不等了,那就说明需要删除一个,先将此时左右两边的index记录下来,并结束当前循环判断。

对两个index都做一个删除,判断删除后的字符串数组是否能够回文即可。

代码

let arr = s.split(''), left = -1, right = -1;
for(let i = 0; i < Math.floor(arr.length / 2); i++) {
    if (arr[i] == arr[arr.length - 1 - i]) {
        continue;
    } else {
        left = i;
        right = arr.length - 1 - i;
        break;
    }
} 

if (left == -1 && right == -1){
    return true;
} else {
    let new1 = s.split(''), new2 = s.split('');
    new1.splice(left, 1)
    new2.splice(right, 1)
    // console.log(new2, new1);
    if (new1.join() == new1.reverse().join()) {
        return true;
    }
    if (new2.join() == new2.reverse().join()) {
        return true;
    }
}
return false;