前言
这些题目来自于leetcode上发布的一篇讨论有没有人一起从零开始刷力扣与官方推出的力扣刷题攻略,这两篇题单大同小异,都是我认为不错的leetcode入门题单。
本文旨在记录自己的刷题历程,希望早日将这些刷透,烂熟于心。
485.Max Consecutive Ones 最大连续 1 的个数
原题链接:
https://leetcode.cn/problems/max-consecutive-ones/description/
题目描述:
给定一个二进制数组 nums
, 计算其中最大连续 1
的个数
二进制数组:数组中元素只有0或1
方法一:计数器法
分别定义两个变量:max_ones
、current_ones
,max_ones
用于统计最大连续1
的个数,current_ones
用于统计当前连续1
的个数,在遇到1
的时候同时更新最大连续1
的个数,在遇到0
的时候将计数器归零。
代码实现:
1 | class Solution: |
时间复杂度:$$O(n)$$(仅遍历一次数组)
空间复杂度:$$O(1)$$(仅使用辅助变量)
方法二:滑动窗口
对数组遍历一次,遍历时保存遇到的最后一个
0
的位置index
如果遍历到
i
位置的数字是0
,那么更新index
为当前位置i
如果遍历到
i
位置的数字是1
,那么当前区间内共有i - index
个连续的1
记录遍历过程中所有连续的
1
的长度的最大值
代码实现:
1 | class Solution: |
时间复杂度:$$O(n)$$(仅遍历一次数组)
空间复杂度:$$O(1)$$(仅使用辅助变量)
495.Teemo Attacking 提莫攻击
原题链接:
https://leetcode.cn/problems/teemo-attacking/
题目描述:
给了一个递增的放毒时间序列以及每次放毒持续时间长度,求出总的中毒时间。
方法一:计算间隔
如果timeSeries
为空,则返回0
使用total_duration
统计中毒时间,每遍历一个元素计算相邻两个元素之间的时间间隔diff
diff < duration
,说明在diff
这段时间内仍处于中毒状态,持续时间为diff
diff > duration
,说明在diff
这段时间内只有duration
时间段处于中毒状态,持续时间为duration
最后一个攻击时间的duration
直接相加即可
代码实现:
1 | class Solution: |
414. Third Maximum Number 第三大的数
原题链接:
https://leetcode.cn/problems/third-maximum-number/
题目大意:
给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。
方法一:有限变量+遍历
若要返回第三大的数,则仅需要三个变量就可以表示第一大,第二大,第三大的数
遍历数组中的每一个数字,依照条件更新第一大,第二大,第三大的数
代码实现:
1 | class Solution: |
时间复杂度:$$O(n)$$(仅遍历一次数组)
空间复杂度:$$O(1)$$(仅使用辅助变量)
方法二:有序集合
使用SortedList
,将nums
中的元素逐个插入集合中
代码实现:
1 | from sortedcontainers import SortedList |
时间复杂度:$$O(n)$$(仅遍历一次数组)
空间复杂度:$$O(n)$$(创建集合)
628. Maximum Product of Three Numbers 三个数的最大乘积
原题链接:
https://leetcode.cn/problems/maximum-product-of-three-numbers/
题目大意:
给你一个整型数组 nums
,在数组中找出由三个数组成的最大乘积,并输出这个乘积。
方法一:排序暴力解
将原数组排序,对比后三位乘积和前两位与最后一位乘积,返回最大的那个数值
排序完成之后,前两位可能为负数
代码实现:
1 | class Solution: |
时间复杂度:$$O(nlogn)$$(排序)
空间复杂度:$$O(1)$$(额外变量)
方法二:有限变量+遍历
原理同上题方法一,定义五个变量
min_1
:第一小值,min_2
:第二小值,max_1
:第一大值,max_2
:第二大值,max_3
:第三大值
每遇到一个元素,更新五个变量中的值
代码实现:
1 | class Solution: |