Leetcode(Python):对矩阵做要求的操作

Median of Two sorted arrays

这个题就是把两个矩阵用extend连接起来,然后对array排序之后判断矩阵元素个数是偶数还是奇数然后分开计算median(中位数)。
这里写图片描述

Product of array self

这个代码相当于顺逆两个方向缩进来,正好可以把所有的数字(处理自己本身)都乘一遍,第一个循环是从头开始的,output列表中0位存的是1,第一位存的是处了第一位以外,第一位前面的数字相乘所得到的结果,第二位存的是除了第二位以外,第二位前面的数字相乘得到的结果,依次类推,最后一位存的是除了最后一位以外,前面所有数字相乘得到的结果。
基于上述这个说法,第二次循环肯定要从尾部开始,因为第一次循环中output内的数据都是从头开始的乘积,并没有考虑后面。因此第二次循环从尾部开始,且最后的output矩阵,只要从后往前乘以除了当前位置以外,后面的数字就ok啦,对于前面的
output最后一位,只要乘以1,
output的倒数第二位,只要乘以nums的最后一位,
output的倒数第三位,只要乘以nums的最后两位
因此只要一个先后顺序,先用一次output,之后就是output和nums位置对应起来了,而且都是从尾部循环到最开始
这里写图片描述

Find Pivot Index

找出某个矩阵某一个索引左右两边数值和相等,返回这个索引,若没有这种情况则返回-1。下面给出两种解决方案,第一种构建两个矩阵,矩阵1保存每个索引之前的数的和,矩阵2保存每个索引之后矩阵的和,最终判断。第二种方法把所有的数的和相加,先使left等于0,每次判断下总的和减去当前数值,并判断left是否等于right,然后让left加上减去的数值,直到循环结束。
这里写图片描述

Maximum product subarray

求出给出矩阵中连乘结果最大的结果,该问题的方法是循环整个矩阵,在循环过程中保留已经循环部分的最大值和最小值,至于为什么要保存最小值原因是当遇到当前循环的数值小于零时,当前的最大最小值要进行互换,最后输出最大的result
这里写图片描述

Maximum subarray

这道题和上面那道题是一样的,而且是简化版,不需要考虑遇到负数的时候最大最小值会互换,所以这里不用再保存最小值,只要计算[当前值]和[当前值加了之前的max之后的值],保留较大的值,最后取出最大值即可。
这里写图片描述

Maximum product of three numbers

这个问题可以利用很简单的手段解决,问题是从列表中选出3个数使得其乘积最大,考虑到只有两种情况会使得乘积最大第一三个最大的正数相乘,第二一个最大的正数乘以两个最小的负数,基于此本道题可解决如下:
这里写图片描述

Subarray Product Less Than K

这道题目可以利用pointer来解决,首先对整个矩阵进行循环,如下代码所示,首先product在每次循环中都会乘以当前的num,所以只要不发生大于k的情况,product就会一直乘下去,当乘下去的过程中出现大于k的情况,就把最前面的left去掉看看是否还会大于k,因为这种情况下最前面的那个left就没用了,所以让left加一。而最后的result的计算:举例说明当left为1,i为4的时候,说明了从当i从3增加到4 的时候,如下图所示这种时候result就会增加i-left+1中连续的情况。
这里写图片描述
这里写图片描述

Subarray Sum Equals K

这个问题的核心在于,第一点在每次循环中把当前次的列表元素加到某个变量中,第二点是要构建一个字典,通过一个例子来说明该字典的作用,若输入矩阵为【1,2,-1,-1,3,1】要求的K等于1。则这个字典的值需要保存的是从头开始能够被去掉的个数。{1:1},{1:1,3:1},{1:1,3:1,2:1},{1:2,3:1,2:1}如上述所示,如果当前的总的total减去k等于上述字典中的某一个键时,那么最后能够组成可能结果的就是当前键对应的值,将该值加到最后的结果中。原因是若total-k的值属于该字典的键,而该字典的键的含义是原始矩阵可以从头去掉几个元素使得总和为去掉该键的数值大小(数值大小说的是键本身而不是键对应的值)
这里写图片描述

Continuous Subarray Sum

这个问题说的是,矩阵中是否有连续n个和k的子列表,有返回True,没有返回False.首先解决该问题的核心在于,先循环整个列表,并记录当前索引i,之前的列表数值之和除以k所得的余数,当索引变成i+somei后,这个之前的列表数值之和除以k所得的余数要是和之前这个索引i所得的一致,这说明 i+somei对于的列表值减去i对应的列表值最后得到的数值正好可以整除k。当然由于是要求最少连续两个所以要判断一下这个somei是否大于1。而且上述的手段就说明了我要把每个i(索引)对应的余数构建一个字典方便后续查找,字典的键为余数,值为索引。这个问题还需要考虑k=0的情况,当k等于0时不用再取余数了,因为只需要判断是否存在连续的两个零,而这个可以更上面的方法结合在一起,也是构建那个字典,不过是之前是余数相等,现在可以把余数变量算成前面索引的和,和相等的话说明出现了0 ,并计算这个两个和相等的之间somei是否大于1,(可以这么算的原因是因为矩阵都是大于0的)
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yuanCruise

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值