文章目录
- 前言
- 数组:数组的遍历
- 485.最大连续的一个数
- 495.提莫攻击
- 414.第三大的数
- 628.三个数的最大乘积
- 数组:统计数组中的元素
- 645.错误的集合
- 697.数组的度
- 484.找到所有数组中消失的数组
- 442.数组中重复的数据
- 41.缺失的第一个正数
- 274.H指数
前言
我根据这里的表单开始刷力扣
数组:数组的遍历
485.最大连续的一个数
用的方法是先将数组转换成字符串,再以0分割,找到最大的字符的长度即是解。比较简单。
495.提莫攻击
做了一个小时也没做出来,参照一个题解,写了一下
用的是双指针,用[1,2,3,7] 2范例画图可以想象一下。
记录上一次攻击和最后一次攻击的时间点
如果在中毒时间之内就攻击了就重制最后一次攻击时间点
如果之外,总时间就加上最后一次攻击+持续时间(中毒结束时间点)-上一次攻击(中毒开始时间点)
最后再加上最后一击的中毒时间就结束了。
414.第三大的数
比较简单,先用集合去重,再排序。
628.三个数的最大乘积
思路是
如果大于等于6个数时,因为可能有负数的存在,就找出最前面和最后面三个数,然后暴力枚举所有可能性,排列组合一共C6_3种可能,找出最大的。
小于6直接排列组合,找出最大的。
难点是可能有0的出现和负数的出现,,于是直接暴力枚举了。
排列组合的方法,我写的我自己创的。
数组:统计数组中的元素
645.错误的集合
这个一开始想复杂也写复杂了,后来发现,用正确的集合-丢失的集合=丢失数
重复的集合-丢失的集合=重复数。
主要题目没看透,说是从1开始的整数,那我就用了小学学到的公式,正确的集合总和 = (首项加末项)*项数//2 。总和忘了有内置函数sum()
下面这个写法写的就很简单。道理类似。
697.数组的度
思路比较笨,仅供参考,主要是先找到数组的度,是多少,然后将nums里和数组的度一样的数存到列表里,比方说[1,2,2,3,1]度是2 ,1和2 一样有两个,存到新的列表里,然后遍历找到nums中的第一个1和最后一个1的nums的切片后的长度,存到新列表里(2也是这样),最后返回最小的那个长度值。
最后速度不容乐观。
有1个28ms的范例
官方解答:
先存三个数分别为nums的每个数的个数它第一个位置和最后一个位置。
然后遍历比较找到度,和每个度对应的长度,再比较决出最小的长度。这个速度28ms。
484.找到所有数组中消失的数组
一开始用两个for查找,超出时间限制了,后来用字典存有{应有的数:个数}
如果个数为0 说明缺少了,再用列表append。
没有想到集合可以做差集,直接用正确的集合-缺少的集合
还找到一种思路是这样的
博主用的c++写的。用python 仿写了一下是这样。
442.数组中重复的数据
我直接复制了上一个的代码,通过了
还有一种思路是这样的,
如果有这个数就让该数的变为相反数,如果出现第二次,此时就为负的,存下这个值。假设我们是不少的[1,2,3,4],那么每次执行我都只会进去第一个if,只有一个数出现了两次,才会进入else。
41.缺失的第一个正数
想快一小时没有思路,看了一个题解,想法是这样的,先排序,使k = 1,如果有比k大的数就返回它,如果相等就使k加1。看着很简单,自己却没有想到,最小的正整数就是从1开始的。
274.H指数
我的思路是先判断他最大的数是否是0,如果是则直接返回0,否则,h等于总共的大于等于h的篇数(靠后的几位),如果列表中第一个值就大于h了就说明是此h,否则继续往后遍历下标。
看到的范例,先倒序排序,枚举,h类似于下标, 直到值和h相等时(数到最后一个值大于h时),说明有h个论文被发表h次。