草庐IT

【算法刷题】——力扣第77场双周赛

〖雪月清〗 2023-05-22 原文

力扣第77场双周赛

🚩一、统计是给定字符串前缀的字符串数目

原题传送门

🏳️‍🌈1.题目描述

给你一个字符串数组 words一个字符串 s ,其中 words[i] 和 s 只包含 小写英文字母
请你返回 words 中是字符串 s 前缀 的 字符串数目
一个字符串的 前缀 是出现在字符串开头的子字符串。子字符串 是一个字符串中的连续一段字符序列。

示例:

输入:

words = [“a”,“b”,“c”,“ab”,“bc”,“abc”], s = “abc”

输出:

3

说明:

words 中是 s = “abc” 前缀的字符串为: “a” ,“ab” 和 “abc” 。
所以 words 中是字符串 s 前缀的字符串数目为 3 。

🏳️‍🌈2.题目分析

想着第一题简单,看完一遍题目看了下示例就直接写代码了。仅比较了每个字符串的第一个字符,啪一下很快啊,WA

果然,wa一下就老实了,认真看了下题目,匹配前缀,需要字符数组中每个字符串的每一个字符都与给定字符串进行匹配,如果成功就是前缀

(注意:给定字符串的长度需要满足 ≥ 字符数组中每个字符串的长度)

🏳️‍🌈3.代码实现

class Solution {
    public int countPrefixes(String[] words, String s) {

        int count = 0;
      for(String s1 : words){
          //如果s长度 小于 s1长度 一定不是前缀
          if(s.length() < s1.length()) continue;
          int len = s1.length();
          boolean flag = true;
          for(int i = 0;i < len;i++){
              //如果有一个不相等的就结束比较
              if(s.charAt(i) != s1.charAt(i)){
                  flag = false;
                  break;
              }
          }
          if(flag) count++;
      }
        return count;
    }
}

🚩二、最小平均差

原题传送门

🏳️‍🌈1.题目描述

给你一个下标从 0 开始长度为 n 的整数数组 nums 。

下标 i 处的 平均差 指的是 nums 中 前 i + 1 个元素平均值和 后 n - i - 1 个元素平均值的 绝对差 两个平均值都需要 向下取整 到最近的整数。


请你返回产生 最小平均差 的下标。如果有多个下标最小平均差相等,请你返回 最小 的一个下标。

注意:

两个数的 绝对差 是两者差的绝对值。 n 个元素的平均值是 n 个元素之 和 除以(整数除法)n 。 0 个元素的平均值视为 0

示例 1:

输入: nums = [2,5,3,9,5,3]

输出: 3

解释:

  • 下标 0 处的平均差为:|2 / 1 - (5 + 3 + 9 + 5 + 3) / 5| = |2 / 1 - 25 / 5| = |2 - 5| = 3 。
  • 下标 1 处的平均差为:|(2 + 5) / 2 - (3 + 9 + 5 + 3) / 4| = |7 / 2 - 20 / 4| = |3 - 5| = 2 。
  • 下标 2 处的平均差为:|(2 + 5 + 3) / 3 - (9 + 5 + 3) / 3| = |10 / 3 - 17 / 3| = |3 - 5| = 2 。
  • 下标 3 处的平均差为:|(2 + 5 + 3 + 9) / 4 - (5 + 3) / 2| = |19 / 4 - 8 / 2| = |4 - 4| = 0 。
  • 下标 4 处的平均差为:|(2 + 5 + 3 + 9 + 5) / 5 - 3 / 1| = |24 / 5 - 3 / 1| = |4 - 3| = 1 。
  • 下标 5 处的平均差为:|(2 + 5 + 3 + 9 + 5 + 3) / 6 - 0| = |27 / 6 - 0| = |4 - 0| = 4 。

    下标 3 处的平均差为最小平均差,所以返回 3 。

提示:

  • 1 <= nums.length <= 105
  • 0 <= nums[i] <= 105

🏳️‍🌈2.题目分析

题目意思就是求解nums数组,前 i+1 个元素的平均值 与 后 n-i-1 个元素的平均值 之差的绝对值的 最小值的位置下标 i

吸取第一题的教训理解题目意思后,才开始写代码,上来就是一个暴力双循环,啪一下很快啊,WA 果然还是老老实实想其他方法吧

因为每次都是从 下标 i 进行分隔,前面的i+1 个的元素和 与后面的元素和 两者相加就是nums数组的元素和,因此,后面元素的和 = 数组和 - 前面元素的和

  • 求nums数组元素和 count
  • 从前往后遍历数组 另设一个变量 sum 每次加上遍历的元素
  • 后面元素的和就是 count - sum
  • 求前后两个元素和的平均值 并求绝对值的差
  • 比较更新最小值下标

注意:n-i-1可能为 0 这个时候 就不能 作分母了。 求和数据是可能超过int类型的,因为选择long类型的变量记录和)

🏳️‍🌈3.代码实现

class Solution {
    public int minimumAverageDifference(int[] nums) {

        int n = nums.length;
        int min = Integer.MAX_VALUE;
        int idx = -1;
        long count = 0;
        long sum = 0;
        //求和
        for(int i = 0 ; i < n;i++) count+=nums[i];

        for(int i = 0; i < n;i++){
            // 前 i + 1个元素的和 
            sum += nums[i];
            //求平均值
            long l = sum/(i+1);
            long r = 0;
            //考虑 n-1-i等于0的情况
                 if(i!= n-1) {
                      r = (count - sum) / (n - i - 1);
                 }

           //求差值的绝对值 并更新
            int num = (int) Math.abs(l-r);
            if(num < min){
                min = num;
                idx = i;
            }


        }
return idx;
    }


}

🚩三、统计网格中没有被保卫的格子数

原题传送门

🏳️‍🌈1.题目描述

给你两个整数 mn 表示一个下标从 0 开始的 m x n 网格图。同时给你两个二维整数数组 guardswalls ,其中 guards[i] = [rowi, coli]walls[j] = [rowj, colj],分别表示第 i 个警卫和第 j 座墙所在的位置。


一个警卫能看到 4 个坐标轴方向(即东、南、西、北)的 所有 格子,除非他们被一座墙或者另外一个警卫 挡住 了视线。如果一个格子能被 至少 一个警卫看到,那么我们说这个格子被 保卫 了。
请你返回空格子中,有多少个格子是 没被保卫 的。

示例1:

输入: m = 4, n = 6, guards = [[0,0],[1,1],[2,3]], walls = [[0,1],[2,2],[1,4]]
输出: 7
解释: 上图中,被保卫和没有被保卫的格子分别用红色和绿色表示。 总共有 7 个没有被保卫的格子,所以我们返回 7 。

提示:

  • 1 <= m, n <= 10^5
  • 2 <= m * n <= 10^5
  • 1 <= guards.length, walls.length <= 5 * 10^4
  • 2 <= guards.length + walls.length <= m * n
  • guards[i].length == walls[j].length == 2
  • 0 <= rowi, rowj < m
  • 0 <= coli, colj < n
  • guards 和 walls 中所有位置 互不相同 。

🏳️‍🌈2.题目分析

根据题目描述,首先想到了是DFS,由于周赛时间是晚上10点半 —— 12点,写到这里就已经11点了,太晚了,要回宿舍睡大觉了…😪😪😪

第二天以dfs的思路写着写着就写不下去了,主要是怎么如何只进行四个方向的持续遍历,如果使用dfs会以每个格子为起点进行上下左右遍历,但是题目意思显然是 仅朝着四个方向,看了题解区大佬的解法,使用方向数组可以解决这个问题了。

  • 初始化一个 m x n 的数组res 数组值 -1表示墙 1表示守卫 2表示被保护 0表示没有被保护
  • 将墙和守卫的位置对res数组进行状态更新
  • 遍历每个守卫,使用方向数组,并不断进行四个方向遍历 直至遇到墙或者其他守卫 或者超过res数组边界 并将保卫的地方更新数组值为 2
  • 遍历数组res 统计0的个数 就是所求

🏳️‍🌈3.代码实现

class Solution {
    int[][] res;

    public int countUnguarded(int m, int n, int[][] guards, int[][] walls) {

        res = new int[m][n];

        // -1表示墙  1表示守卫  2表示被保护  0表示没有被保护

        for (int[] guard : guards) {
            res[guard[0]][guard[1]] = 1;
        }

        for (int[] wall : walls) {
            res[wall[0]][wall[1]] = -1;
        }

        //定义一个方向数组
        int[][] dir = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};


        //从每个守卫出发遍历四个方向 标记被保护的位置
        for (int[] guard : guards) {
            int x = guard[0];
            int y = guard[1];

            for (int i = 0; i < 4; i++) {

                int nx = x + dir[i][0], ny = y + dir[i][1];
                //检查 nx ny 是否合法 并且 不能被墙或者守卫挡着
                while (nx >= 0 && ny >= 0 && nx < m && ny < n && res[nx][ny] != -1 && res[nx][ny] != 1) {
                    res[nx][ny] = 2;

                    //关键 保证只是向四个方向扩散
                    nx += dir[i][0];
                    ny += dir[i][1];
                }
            }
        }

        int ans = 0;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (res[i][j] == 0) ans++;
            }
        }

        return ans;


    }
}

就先分析前三题吧,第四题再想想🤔🤔🤔

有关【算法刷题】——力扣第77场双周赛的更多相关文章

  1. 区块链之加解密算法&数字证书 - 2

    目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非

  2. 100个python算法超详细讲解:画直线 - 2

    1.问题描述使用Python的turtle(海龟绘图)模块提供的函数绘制直线。2.问题分析一幅复杂的图形通常都可以由点、直线、三角形、矩形、平行四边形、圆、椭圆和圆弧等基本图形组成。其中的三角形、矩形、平行四边形又可以由直线组成,而直线又是由两个点确定的。我们使用Python的turtle模块所提供的函数来绘制直线。在使用之前我们先介绍一下turtle模块的相关知识点。turtle模块提供面向对象和面向过程两种形式的海龟绘图基本组件。面向对象的接口类如下:1)TurtleScreen类:定义图形窗口作为绘图海龟的运动场。它的构造器需要一个tkinter.Canvas或ScrolledCanva

  3. ruby - 在 Ruby 中实现 Luhn 算法 - 2

    我一直在尝试用Ruby实现Luhn算法。我一直在执行以下步骤:该公式根据其包含的校验位验证数字,该校验位通常附加到部分帐号以生成完整帐号。此帐号必须通过以下测试:从最右边的校验位开始向左移动,每第二个数字的值加倍。将乘积的数字(例如,10=1+0=1、14=1+4=5)与原始数字的未加倍数字相加。如果总模10等于0(如果总和以零结尾),则根据Luhn公式该数字有效;否则无效。http://en.wikipedia.org/wiki/Luhn_algorithm这是我想出的:defvalidCreditCard(cardNumber)sum=0nums=cardNumber.to_s.s

  4. Ruby 斐波那契算法 - 2

    下面是我写的一个计算斐波那契数列中的值的方法:deffib(n)ifn==0return0endifn==1return1endifn>=2returnfib(n-1)+(fib(n-2))endend它工作到n=14,但在那之后我收到一条消息说程序响应时间太长(我正在使用repl.it)。有人知道为什么会这样吗? 最佳答案 Naivefibonacci进行了大量的重复计算-在fib(14)fib(4)中计算了很多次。您可以将内存添加到您的算法中以使其更快:deffib(n,memo={})ifn==0||n==1returnnen

  5. ruby-on-rails - Rails add_index 算法 : :concurrently still causes database lock up during migration - 2

    为了防止在迁移到生产站点期间出现数据库事务错误,我们遵循了https://github.com/LendingHome/zero_downtime_migrations中列出的建议。(具体由https://robots.thoughtbot.com/how-to-create-postgres-indexes-concurrently-in概述),但在特别大的表上创建索引期间,即使是索引创建的“并发”方法也会锁定表并导致该表上的任何ActiveRecord创建或更新导致各自的事务失败有PG::InFailedSqlTransaction异常。下面是我们运行Rails4.2(使用Acti

  6. ruby - 趋势算法 - 2

    我正在开发一个类似微论坛的项目,其中一个特殊用户发布一条快速(接近推文大小)的主题消息,订阅者可以用他们自己的类似大小的消息来响应。直截了当,没有任何形式的“挖掘”或投票,只是每个主题消息的响应按时间顺序排列。但预计会有很高的流量。我们想根据它们引起的响应嗡嗡声来标记主题消息,使用0到10的等级。在谷歌上搜索了一段时间的趋势算法和开源社区应用示例,到目前为止已经收集到两个有趣的引用资料,但我还没有完全理解它们:Understandingalgorithmsformeasuringtrends,关于使用基线趋势算法比较维基百科页面浏览量的讨论,在SO上。TheBritneySpearsP

  7. Ruby - 不支持的密码算法 (AES-256-GCM) - 2

    我收到错误:unsupportedcipheralgorithm(AES-256-GCM)(RuntimeError)但我似乎具备所有要求:ruby版本:$ruby--versionruby2.1.2p95OpenSSL会列出gcm:$opensslenc-help2>&1|grepgcm-aes-128-ecb-aes-128-gcm-aes-128-ofb-aes-192-ecb-aes-192-gcm-aes-192-ofb-aes-256-ecb-aes-256-gcm-aes-256-ofbRuby解释器:$irb2.1.2:001>require'openssl';puts

  8. java实现Dijkstra算法 - 2

    文章目录一.Dijkstra算法想解决的问题二.Dijkstra算法理论三.java代码实现一.Dijkstra算法想解决的问题解决的问题:求解单源最短路径,即各个节点到达源点的最短路径或权值考察其他所有节点到源点的最短路径和长度局限性:无法解决权值为负数的情况二.Dijkstra算法理论参数:S记录当前已经处理过的源点到最短节点U记录还未处理的节点dist[]记录各个节点到起始节点的最短权值path[]记录各个节点的上一级节点(用来联系该节点到起始节点的路径)Dijkstra算法步骤:(1)初始化:顶点集S:节点A到自已的最短路径长度为0。只包含源点,即S={A}顶点集U:包含除A外的其他顶

  9. 对于体育新闻中文文本关键字提取有哪些关键字提取算法及其步骤 - 2

    对于体育新闻中文文本的关键字提取,常用的算法包括TF-IDF、TextRank和LDA等。它们的基本步骤如下:1.TF-IDF算法: -将文本进行分词和词性标注处理。-统计每个词在文本中的词频(TF)。-计算每个词在整个语料库中出现的文档频率(DF)和逆文档频率(IDF)。-计算每个词的TF-IDF值,并按照值的大小进行排序,选择排名前几的词作为关键字。2.TextRank算法:-将文本进行分词和词性标注处理。-将分词结果转化成图模型,每个词语为节点,根据词语之间的共现关系建立边。-对图模型进行迭代计算,计算每个节点的PageRank值,表示该节点的重要性。-选择排名前几的节点作为关键字。3.

  10. arrays - ruby 中的最佳排列计数算法 - 2

    我正在尝试计算由二进制形式的1和0的P数表示的数字的数量。如果P=2,则表示的数字为0011、1100、0110、0101、1001、1010,所以计数为6。我试过:[0,0,1,1].permutation.to_a.uniq但这不是大数的最佳解决方案(P可以什么可能是最好的排列技术,或者我们是否有任何直接的数学来做到这一点? 最佳答案 Numberofpermutationcanbecalculatedusingfactorial.a=[0,0,1,1](1..a.size).inject(:*)#=>4!=>24要计算重复项,

随机推荐