菜鸟的每日力扣系列——用贪心简化“最长上升子序列”问题
2023-02-18 16:23:57 时间
力扣334. 递增的三元子序列
如何在只做一次遍历就得到结果呢?因为结果只有三个元素,而且是按列表下标序递增变大,那么我的思路是用一个变量去存一次遍历中列表的最小值,如果遇到比它小的就做替换;这次遍历中如果遇到比现有的最小值大的,就把它存成次小值;如果之后还有比次小值更大的,说明这个满足题意的三元组一定存在。上述过程也是唯一一种存在该三元组的情况,其他则都返回False。
from typing import List
def increasing_triplet(nums: List[int]):
min_num, sec_num = float('inf'), float('inf')
for i in nums:
min_num = min(i, min_num)
if i > min_num:
sec_num = min(i, sec_num)
if i > sec_num:
return True
return False
nums = [5, 4, 3, 2, 1]
print(increasing_triplet(nums))
# False
力扣747. 至少是其他数字两倍的最大数
与上一题类似,结果是要大于元素其它至少2倍的元素,在一次遍历中找到最大值和次大值进行比较即可。由于要返回下标,使用enumerate()方法将下标和元素一起遍历。假设较大的元素是max_num,次大的元素是sec_num,一次遍历中,如果元素大于较大元素,那么把它和它的下标存下来;继续遍历如果大于次大元素,则对sec_num更新。如果最终得到的max_num >= 2 * sec_num,则返回较大值的下标,否则为-1。
from typing import List
def dominant_index(nums: List[int]):
max_num = sec_num = index = -1
for i, num in enumerate(nums):
if num > max_num:
sec_num, max_num, index = max_num, num, i
elif num > sec_num:
sec_num = num
print("num_ele=", sec_num, "num_res=", max_num)
return index if max_num >= 2 * sec_num else -1
nums = [3, 6, 1, 0]
print(dominant_index(nums)) # 1
END
相关文章
- PE格式:导入表与IAT内存修正
- PE格式:手工实现IAT导入表注入劫持
- HR必会的薪酬数据建模分析逻辑
- 软件测试|selenium xpath定位
- PE格式:手工实现各种脱壳后的修复
- 关于人力资源数据化转型落地的一些思考
- 如何最低成本获取行业薪酬数据
- 人力资源数据分析 就应该这么学
- 人力资源各模数据关联建模,实现全维度的数据分析
- HR年底必看 - 如何获取行业相关人效数据指标
- 人力资源模块的降本增效
- 软件测试|selenium css定位
- 驱动开发:内核监控进程与线程创建
- FPS游戏:封装外部D3D透视模块
- hydra 密码爆破工具入门
- 人力资源薪酬数据分析报告
- Metasploit 生成带SSL加密载荷
- 薪酬数据分析中的职级体系构建
- 一种新奇的反向Shell实现思路
- 驱动开发:内核MDL读写进程内存