leetcode解题思路分析(一百四十四)1247 - 1253 题

这篇具有很好参考价值的文章主要介绍了leetcode解题思路分析(一百四十四)1247 - 1253 题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  1. 交换字符使得字符串相同
    有两个长度相同的字符串 s1 和 s2,且它们其中 只含有 字符 “x” 和 “y”,你需要通过「交换字符」的方式使这两个字符串相同。每次「交换字符」的时候,你都可以在两个字符串中各选一个字符进行交换。交换只能发生在两个不同的字符串之间,绝对不能发生在同一个字符串内部。也就是说,我们可以交换 s1[i] 和 s2[j],但不能交换 s1[i] 和 s1[j]。最后,请你返回使 s1 和 s2 相同的最小交换次数,如果没有方法能够使得这两个字符串相同,则返回 -1 。

贪心算法解题:先统计差异数,然后尽可能少的解决问题。

class Solution {
public:
    int minimumSwap(string s1, string s2) {
        int xy = 0, yx = 0;
        int n = s1.size();
        for (int i = 0; i < n; i++) {
            char a = s1[i], b = s2[i];
            if (a == 'x' and b == 'y') {
                xy++;
            }
            if (a == 'y' and b == 'x') {
                yx++;
            }
        }
        if ((xy + yx) % 2 == 1) {
            return -1;
        }
        return xy / 2 + yx / 2 + xy % 2 + yx % 2;
    }
};


  1. 统计「优美子数组」
    给你一个整数数组 nums 和一个整数 k。如果某个连续子数组中恰好有 k 个奇数数字,我们就认为这个子数组是「优美子数组」。请返回这个数组中 「优美子数组」 的数目。

记录所有奇数的下标,然后找满足条件的个数。中间穿插多少个子数组通过数学公式可以计算得出。

class Solution {
public:
    int numberOfSubarrays(vector<int>& nums, int k) {
        int n = (int)nums.size();
        int odd[n + 2], ans = 0, cnt = 0;
        for (int i = 0; i < n; ++i) {
            if (nums[i] & 1) odd[++cnt] = i;
        }
        odd[0] = -1, odd[++cnt] = n;
        for (int i = 1; i + k <= cnt; ++i) {
            ans += (odd[i] - odd[i - 1]) * (odd[i + k] - odd[i + k - 1]); 
        }
        return ans;
    }
};


  1. 移除无效的括号
    给你一个由 ‘(’、‘)’ 和小写字母组成的字符串 s。你需要从字符串中删除最少数目的 ‘(’ 或者 ‘)’ (可以删除任意位置的括号),使得剩下的「括号字符串」有效。请返回任意一个合法字符串。

先统计一边的符号数,然后遍历让另一边满足对等。也可以从左往右一遍再从右往左筛一遍。

class Solution {
public:
    string minRemoveToMakeValid(string s) {
        int left = 0;
        int right = count(begin(s), end(s), ')');
        string ans = "";
        for (auto& c : s) {
            if (c == '(') {
                if (right > 0) {
                    ans += c;
                    left++;
                    right--;
                }
            } else if (c == ')') {
                if (left > 0) {
                    ans += c;
                    left--;
                } else {
                    right--;
                }
            } else {
                ans += c;
            }
        }
        return ans;
    }
};


  1. 检查「好数组」
    给你一个正整数数组 nums,你需要从中任选一些子集,然后将子集中每一个数乘以一个 任意整数,并求出他们的和。假如该和结果为 1,那么原数组就是一个「好数组」,则返回 True;否则请返回 False。

裴蜀定理的应用。

class Solution {
public:
    bool isGoodArray(vector<int>& nums) {
        int divisor = nums[0];
        for (int num : nums) {
            divisor = gcd(divisor, num);
            if (divisor == 1) {
                break;
            }
        }
        return divisor == 1;
    }
};


  1. 平均售价
    编写SQL查询以查找每种产品的平均售价。
    average_price 应该四舍五入到小数点后两位。
# Write your MySQL query statement below
SELECT
    product_id,
    Round(SUM(sales) / SUM(units), 2) AS average_price
FROM (
    SELECT
        Prices.product_id AS product_id,
        Prices.price * UnitsSold.units AS sales,
        UnitsSold.units AS units
    FROM Prices 
    JOIN UnitsSold ON Prices.product_id = UnitsSold.product_id
    WHERE UnitsSold.purchase_date BETWEEN Prices.start_date AND Prices.end_date
) T
GROUP BY product_id


  1. 奇数值单元格的数目
    给你一个 m x n 的矩阵,最开始的时候,每个单元格中的值都是 0。另有一个二维索引数组 indices,indices[i] = [ri, ci] 指向矩阵中的某个位置,其中 ri 和 ci 分别表示指定的行和列(从 0 开始编号)。对 indices[i] 所指向的每个位置,应同时执行下述增量操作:
    ri 行上的所有单元格,加 1 。
    ci 列上的所有单元格,加 1 。
    给你 m、n 和 indices 。请你在执行完所有 indices 指定的增量操作后,返回矩阵中 奇数值单元格 的数目。

如果x,y位置想为奇数,则x行和y列只可以有一个是奇数。因此统计各自奇数个数然后直接乘一下就可以得到答案了。

class Solution {
public:
    int oddCells(int m, int n, vector<vector<int>>& indices) {
        vector<int> rows(m), cols(n);
        for (auto & index : indices) {
            rows[index[0]]++;
            cols[index[1]]++;
        }
        int oddx = 0, oddy = 0;
        for (int i = 0; i < m; i++) {
            if (rows[i] & 1) {
                oddx++;
            }
        }
        for (int i = 0; i < n; i++) {
            if (cols[i] & 1) {
                oddy++;
            }
        }
        return oddx * (n - oddy) + (m - oddx) * oddy;
    }
};

  1. 重构 2 行二进制矩阵
    给你一个 2 行 n 列的二进制数组,你需要利用 upper,lower 和 colsum 来重构这个矩阵,并以二维整数数组的形式返回它。如果有多个不同的答案,那么任意一个都可以通过本题。如果不存在符合要求的答案,就请返回一个空的二维数组。

先判断不存在的条件,保证一定存在的情况下,采用贪心法优先满足upper/lower其中之一即可文章来源地址https://www.toymoban.com/news/detail-575587.html

class Solution {
public:
    vector<vector<int>> reconstructMatrix(int upper, int lower, vector<int>& colsum) {
        int n = colsum.size();
        int sum = 0, two = 0;
        for (int i = 0; i < n; ++i) {
            if (colsum[i] == 2) {
                ++two;
            }
            sum += colsum[i];
        }
        if (sum != upper + lower || min(upper, lower) < two) {
            return {};
        }
        upper -= two;
        lower -= two;
        vector<vector<int>> res(2, vector<int>(n, 0));
        for (int i = 0; i < n; ++i) {
            if (colsum[i] == 2) {
                res[0][i] = res[1][i] = 1;
            } else if (colsum[i] == 1) {
                if (upper > 0) {
                    res[0][i] = 1;
                    --upper;
                } else {
                    res[1][i] = 1;
                }
            }
        }
        return res;
    }
};


到了这里,关于leetcode解题思路分析(一百四十四)1247 - 1253 题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 海信电视LED55N3000U(000)版本刷机(一百四十七)

    需求: 电视内存不足,导致无法安装第三方app? 推荐四种解决方案: 注意:U盘格式化成FAT32格式。 ---------设置 ---------通用设置 ---------把”商场模式“打开 ---------插入U盘,打开\\\"应用安装到U盘\\\",如果打开不成功,开关机,多试几次。 二、打开\\\"开发者模式\\\" ---------设置 ------

    2024年02月05日
    浏览(57)
  • 一百四十六、Xmanager——Xmanager5连接Xshell7并控制服务器桌面

    由于kettle安装在Linux上,Xshell启动后需要Xmanager。而Xmanager7版本受限、没有免费版,所以就用Xmanager5去连接Xshell7 注册码 :101210-450789-147200 Xmanager 下载 - NetSarang Website CentOS 7 GNOME桌面环境 [root@hurys22 ~]# yum install epel-release -y [root@hurys22 ~]# yum install lightdm -y [root@hurys22 ~]# yum groupi

    2024年02月14日
    浏览(41)
  • 一百四十七、Kettle——Linux上安装的kettle8.2连接ClickHouse数据库

    kettle8.2在Linux安装好后,需要与ClickHouse数据库建立连接 https://pan.baidu.com/s/1iqGyXsTaQSCHEbjj7yX7AA 提取码: mvzd   注意 : clickhouse-plugins文件里就是自定义的驱动jar包 注意: 要知道Linux系统架构是64位还是32位, 它们所属的Linux文件夹不同 到这里,Linux安装的kettle8.2就可以与ClickHou

    2024年02月13日
    浏览(66)
  • 一百四十一、Kettle——kettle8.2在Windows本地开启carte服务以及配置子服务器

    在kettle建好共享资源库后,为了给在服务器上部署kettle的carte服务躺雷,先在Windows本地测试一下怎么玩carte服务 kettle版本是8.2             pdi-ce-8.2.0.0-342     kettle本地安装路径是D:javakettlepdi-ce-8.2.0.0-342 Carte是Kettle自带的调度及监控工具,是一种内置的轻量级的web服务,支

    2024年02月10日
    浏览(56)
  • 一百四十九、Kettle——Linux上安装的kettle8.2创建共享资源库时遇到的问题(持续更新中)

    在kettle8.2在Linux上安装好可以启动界面、并且可以连接MySQL、Hive、ClickHouse等数据库后开始创建共享资源库,但是遇到了一些问题 1、报错详情 2023/08/10 13:57:21 - Spoon - Caused by: java.lang.UnsatisfiedLinkError: Could not load SWT library. Reasons:  2023/08/10 13:57:21 - Spoon -     no swt-mozilla-gtk-4335 i

    2024年02月13日
    浏览(69)
  • 2023年第十四届蓝桥杯javaB组 蜗牛解题思路(动态规划 O(n))

     E、蜗牛(时间限制: 1.0s 内存限制: 512.0MB) 【问题描述】 这天,一只蜗牛来到了二维坐标系的原点。 在 x 轴上长有 n 根竹竿。它们平行于 y 轴,底部纵坐标为 0 ,横坐标分别 为 x 1 , x 2 , ..., x n 。竹竿的高度均为无限高,宽度可忽略。蜗牛想要从原点走到第 n 个竹竿的底部

    2023年04月27日
    浏览(43)
  • 第十四届蓝桥杯大赛软件赛省赛-试题 B---01 串的熵 解题思路+完整代码

    欢迎访问个人网站来查看此文章:http://www.ghost-him.com/posts/db23c395/ 对于一个长度为 n 的 01 串 S = x 1 x 2 x 3 . . . x n S = x_{1} x_{2} x_{3} ... x_{n} S = x 1 ​ x 2 ​ x 3 ​ ... x n ​ ,香农信息熵的定义为 H ( S ) = − ∑ 1 n p ( x i ) l o g 2 ( p ( x i ) ) H(S ) = − {textstyle sum_{1}^{n}} p(x_{i})log_{2} (p

    2023年04月10日
    浏览(45)
  • 每天一个数据分析题(一百六十四)

    关于OLAP系统,下列选项不正确的是() A. 是基于数据仓库的信息进行分析处理过程 B. 用户数量相对较少,其用户主要是业务决策人员与管理人员 C. 对响应时间要求非常高。 D. 基础数据来源于生产系统的操作数据,也就是说,OLAP系统的数据来源与OLTP系统。 题目来源于CDA模

    2024年02月22日
    浏览(51)
  • leetcode 122双周赛 解题思路+代码

    本人水平有限,只做出3道,最后1道放弃。 给你一个长度为 n 的整数数组 nums 。 一个数组的 代价 是它的 第一个 元素。比方说,[1,2,3] 的代价是 1 ,[3,4,1] 的代价是 3 。 你需要将 nums 分成 3 个 连续且没有交集 的子数组。 请你返回这些子数组的 最小 代价 总和 。 示例 1: 输

    2024年02月20日
    浏览(43)
  • Leetcode 75——1768.交替合并字符串 解题思路与具体代码【C++】

    1768. 交替合并字符串 - 力扣(LeetCode) 给你两个字符串  word1  和  word2  。请你从  word1  开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。 返回  合并后的字符串  。 1 = word1.length, word2.length = 100

    2024年02月07日
    浏览(79)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包