LeetCode数组专栏(简单:21-40)

  1. 最大连续1的个数(485)
    在这里插入图片描述
      这道题没什么可说的,比较容易。
    在这里插入图片描述

  1. 斐波那契数(509)
    在这里插入图片描述
      这道题目测应该是用递归做。。。
    在这里插入图片描述
      使用动态规划的方法(直观的公式),效率更高~。
    在这里插入图片描述
      这里注意一下赋值的方法,在不引入中间变量的情况下,同时更新a1和a2,可以使用数组的形式,也即[a1, a2] = [a2, a1+a2]。

  1. 数组中的K-diff数对(532)在这里插入图片描述在这里插入图片描述  
      这道题可以使用设立set的方法,保存两数之差中小的那一个,然后最后统计set中的元素个数就可以知道k-diff的数量了。在这里插入图片描述
      也可以使用排序+遍历的方法。需要注意的是sort方法:
    在这里插入图片描述
      需要注意sort()方法里面什么都不写的时候,排序默认不是按照从小到大排序的,而是按照从高到底位数字大小排序。而sort((a,b)=>a-b)则是按照数字从小到大排序。这里需要特别注意!我就是这里偷懒没有写里面的函数,以为默认从小到大排序,导致算法一直没法AC
    在这里插入图片描述

  1. 数组拆分(561)
    在这里插入图片描述
      这道题还是挺容易看到规律的,凑对的时候只要小的跟小的一组,大的跟大的一组就可以了,当然,为了保证后续求和,我们需要先将数组进行排序。
    在这里插入图片描述

  1. 重塑矩阵(566)
    在这里插入图片描述
    在这里插入图片描述
      第一种方法是使用队列,先把nums数组中的数从前到后依次入队,然后再按照要求的r行乘c列,将队列中的元素依次从前向后,出队赋给res。
      这里特别需要注意js不像java那样可以[][]的形式定义二维数组。js定义二维数组可以使用下述代码中的写法:let res = new Array®.fill(’’).map((ele)=>new Array©)。具体含义就是先定义一个有r个元素的一维数组并初始化空值(初始化空很重要!),然后再利用map函数对每个元素进行操作-每个元素都是一个新的数组,其中每个数组又包含c个元素,这样就定义了一个r乘c的二维数组。还需要注意的是js没有队列和栈类型,队列和栈的先进先出、先进后出可以使用数组的push() + shift()、unshift() + pop()。
    在这里插入图片描述
      第二种方法是不使用额外空间的方法,也就是不借助队列,直接将输出的元素排列到结果里(需要在每次赋值的时候与列进行比对,可以理解为依次往res里加数据,第一次像res[0]加,加入列是5,那么加到5的时候就“加满”了,从而换下一个元素)。
    在这里插入图片描述
      第三种方法与第二种方法类似,只不过是加了个计数器记录当前数字位置,然后通过除列(可以看作res中每个数组元素最大容量),得到的除数和余数来动态更新res。
    在这里插入图片描述

  1. 最短无序连续子数组(581)
    在这里插入图片描述
      这个方法使用的是类似选择排序的思想,但是效率明显很差。
    在这里插入图片描述
      下面这个方法就很好了。大概思路是创建一个与原数组相同的已排序数组,然后寻找数组头部与原数组不同的元素的位置,再寻找数组尾部与原数组不同的元素的位置,中间的元素的长度就是题目所求。
    在这里插入图片描述
      下面这个方法是用栈来实现:
    这个方法暂时没弄明白。。。。。

  1. 种花问题(605)
    在这里插入图片描述
      刚开始拿到这道题,没有想出好的解决方法,耻辱的看了解析~。大致意思是遍历数组,从头到尾找可种花的位置(自身为0,并且前后均为0或者前后位边界),找到位置后“种上花(设置元素为1)”,种一次花,将最终结果+1,最后看最终结果max是否大于n即可。
    在这里插入图片描述

  1. 三个数的最大乘积(628)
    在这里插入图片描述
      这道题其实没什么难度,但是我一开始以为这道题等同于排序后找最大的三个数,但是事实证明我错了。因为当[-4,-3,-2,-1,20]的时候,两个负数乘最大值明显是比最大的三个值相乘还要大,所以最后需要返回的是“最小的两个数与最大的一个数的组合”和“最大的三个数组合”之中较大的那一组。
    在这里插入图片描述
      实际上,这道题根本不用排序,一次扫描,找出5个数即可(最大的三个数,最小的二个数)。这种方法逻辑比较复杂,但是明显效率更高。
    在这里插入图片描述

  1. 子数组最大平均数I(643)
    在这里插入图片描述
      我一开始的想法是设置两个指针,一个指向数组头部,一个指向数组尾部。然后根据k的值,逐渐缩小取字串,每次缩小的时候比较两个指针对应元素大小,每次都删减小的那一个。但是算法没有AC,很明显,我这种做法没有考虑到后序步骤有可能在未删减那一侧可能含有“极其小的数”,从而导致错误。错误代码如下
    在这里插入图片描述
      这道题就用很直观的方法,先计算出前k个元素和,然后对子串循环“前推后移”,保持字串长度为k,循环比较长度为k的字串中的较大值。最终得出结果。
    在这里插入图片描述

  1. 图片平滑器(661)
    在这里插入图片描述
      这道题一开始我尝试使用多个if去判断,但是分支太多,所以失败了。最后看了别人的solution,把res特定位置求结果值抽象出一个函数。把结果数组中每个值的求解看成是对周围8个方格的遍历(可以看作是内外两层循环----上一层,本层,下一层)。每次判断是否出现越界,出现越界的时候直接continue。
    在这里插入图片描述

  1. 非递减数列(665)
    在这里插入图片描述
      当nums长度小于3的时候,很明显,只有两个数,无论如何都为True。当超过三个数时,假设nums[y] > nums[z]。此时有下列两种情况:
    (1). y = 0,此时前方没有元素了,此时只需让y=z,即可满足题目要求。
    (2). y != 0,假设y前方元素为x,有下列几种情况
xyz
142
242
342
442

  x的取值有可能小于z,等于z或者大于z。大于z的时候,x的值还有可能等于y(不可能大于y)。
(1)小于z的时候,令y=z(1 2 2)
(2)等于z的时候,令y=z(2 2 2)
(3)大于z的时候,令z=y(3 4 4)
(4)大于z的时候,等于y时,令z=y(4 4 4)
  所以可以总结出来:当x小于等于z,令y=z;当x大于等于z,令z=y。但是由于更新y对后序的检验并无帮助,所以,当x小于等于z的时候什么都不做即可。
在这里插入图片描述


  1. 最长连续递增序列(674)
    在这里插入图片描述
      这道题还是比较简单的,不赘述了。
    在这里插入图片描述

  1. 数组的度(697)
    在这里插入图片描述
      这道题使用了hashMap,其中hashMap存储的值是[键出现的次数,最小长度]。这种写法还是第一次见,以往来说,我们都会认为hashMap是键值对,而值是一个特定的数字。然而这里的值可以是一个数组。我们只需要在一次循环过程中动态的比较count大小(保证count当前是最大的),并且根据count去动态更新minLen即可。这里需要特别注意一下,每次如果出现count与当前元素出现的次数相同了,那么此时minLen要取最小的那个即可。
    在这里插入图片描述

  1. 1比特与2比特字符(717)
    在这里插入图片描述
    在这里插入图片描述
      通过题目可以确定当1存在的时候,一定是2比特字符,后面接0或者1,而当0存在时,则为1比特字符(前方没有配对的)。所以第一种方法可以是线性扫描,即从左到右开始,当bits[i]为0的时候i+1,查看下一个元素;当bits[i]为1的时候i+2,因为此时一定是一个2比特字符,不需要看该元素后面的元素,直接跳到下下个元素。如果最后i落在了bits.length-1的位置,说明除了末尾元素,前面元素都已配对,所以最后的0一定是一个1比特字符。
    在这里插入图片描述
      第二种方法是贪心法。其实仔细观察可以看到最后一位是否为1比特字符取决于末尾0前方连续1的个数。如…0110,连续1个数为2(偶数),11正好配对(0不可能与后方的1配对),所以偶数时为true;当…01110,连续1个数为3(奇数),0不可能与后方1配对,那么0后面的11配对,然后10配对,所以此时为false。
    在这里插入图片描述

  1. 寻找数组的中心索引(724)
    在这里插入图片描述
    在这里插入图片描述
      这道题我一开始的思路是左右设两个指针,然后往中间移动。移动的过程中取和为左边减去右边,当和小于等于0,说明右边大,此时左移,大于0的时候,右移。当移动到中间时,如果和为0,那么就返回索引,否则就返回-1。但是我忽略了一个问题,就是数组中可能有负数。如果全是负数,那么会导致整体和一直小于0,显然此时一直左移是不对的。所以这道题需要先求出整体的和,然后再计算左侧的总和。
    在这里插入图片描述

  1. 使用最小花费爬楼梯(746)
    在这里插入图片描述
    在这里插入图片描述
      这道题使用的是动态规划的方法。cost[i]的更新动态的依赖前面cost的值。这道题代码虽然不多,但是很经典。
    在这里插入图片描述

  1. 至少是其他数字两倍的最大数(747)
    在这里插入图片描述
    在这里插入图片描述

  1. 托普利茨矩阵(766)
    在这里插入图片描述
    在这里插入图片描述
      BF算法,没什么好说的。。。
    在这里插入图片描述
      第二种方法借助一个map。
    在这里插入图片描述

  1. 较大分组的位置
    在这里插入图片描述
    在这里插入图片描述
      这道题的思路还是挺明确的,如下图。注意需要设立两个指针,一个是当前字母的开头(j),另一个是当前字母向前遍历用的(i)。
    在这里插入图片描述

  1. 翻转的图像(832)
    在这里插入图片描述
      按照题意,直接写出下列代码,用到了js的reverse()内置函数。
    在这里插入图片描述
     &emsp:第二种方法是在遍历数组中每行的时候,设立两个指针,一个指向头,一个指向尾。观察题目变换规律,可以发现:当数组中每行里的元素,正向和反向对应位置的元素如下相同,那么最后的结果一定会与当前元素相反,如果对应位置的元素不同,那么最后结果一定和当前相同。如[1,0,0,0]翻转的结果是[1,1,1,0]。
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值