【五月集训】第四天打卡(贪心)

本文介绍了四个算法问题的解题思路:1221.分割平衡字符串通过线性扫描实现;1827.最少操作使数组递增通过判断并更新前一个数实现;2144.打折购买糖果的最小开销通过排序优化求解;1400.构造K个回文字符串关注字符奇偶性。这些题目涉及字符串处理、数组操作和算法优化技巧。
摘要由CSDN通过智能技术生成


1221. 分割平衡字符串

题目链接

分割平衡字符串

思路

利用一个统计变量,线性扫描整个字符串,遇到L则加一,遇到R则减一,当统计变量为零的时候计数器加一

题解

  • js
function balancedStringSplit(s: string): number {
    let ans = 0, d = 0;
    for (let i = 0; i < s.length; ++i) {
        const ch = s[i];
        if (ch === 'L') {
            ++d;
        } else {
            --d;
        }
        if (d === 0) {
            ++ans;
        }
    }
    return ans;
};

1827. 最少操作使数组递增

题目链接

最少操作使数组递增

思路

判断如果当前的数比前一个数大

  • 如果满足条件,重置前一个数为当前数加一
  • 如果不满足,需要把当前的数变成前一个数加一

题解

  • js
function minOperations(nums: number[]): number {
    let ans = 0, pre = 0
    for (let i = 0; i < nums.length; i++) {
        if (pre < nums[i]) {
            pre = nums[i] + 1
        } else {
            ans += pre - nums[i]
            ++pre
        }
    }
    return ans
};

2144. 打折购买糖果的最小开销

题目链接

打折购买糖果的最小开销

思路

将数组从大到小排序,定义一个spend作为累加,每计算两个就跳过一个

题解

  • js
function minimumCost(cost: number[]): number {
    cost.sort((a, b) => b - a);
    let spend = 0;
    const len = cost.length;
    for (let i = 1; i <= len; i++) {
        if (i % 3 === 0) continue;
        spend += cost[i - 1];
    }
    return spend;

};

1400. 构造 K 个回文字符串

题目链接

构造 K 个回文字符串

思路

找最多能构造的回文串数,其实就是字符串的长度,每个字符独自形成回文串,找最少能构造的回文串数,就是找出现奇数次的字符个数(出现奇数次的字符要想形成回文串,必须要和出现偶数次的字符搭配,并且不能和另一个出现奇数次的字符搭配),然后看k是否在这个范围内

题解

  • js
function canConstruct(s, k, m = {}): boolean {
    const max = s.length;
    let min = 0;
    for (const c of s) {
        m[c] = (m[c] || 0) + 1;
    }
    for (const v of Object.values(m)) {
        if (+v & 1) min++;
    }
    return k >= min && k <= max;
};
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值