首页 > 编程语言 > 代码随想录算法训练营-贪心算法-4|406. 根据身高重建队列、452. 用最少数量的箭引爆气球

代码随想录算法训练营-贪心算法-4|406. 根据身高重建队列、452. 用最少数量的箭引爆气球

时间:2023-09-18 11:34:12浏览次数:36  
标签:插入 List people 随想录 406 算法 points 维度 气球

406. 根据身高重建队列

1. 一定要想如何确定一个维度,然后再按照另一个维度重新排列。

2. 先确定身高的维度,降序排列。

3. 按照身高排序之后,优先按身高高的people的k来插入,后序插入节点也不会影响前面已经插入的节点,最终按照k的规则完成了队列。

4. 局部最优:优先按身高高的people的k来插入。插入操作过后的people满足队列属性。

5. 全局最优:最后都做完插入操作,整个队列满足题目队列属性。

6. 插入的过程:

  • 插入[7,0]:[[7,0]]
  • 插入[7,1]:[[7,0],[7,1]]
  • 插入[6,1]:[[7,0],[6,1],[7,1]]
  • 插入[5,0]:[[5,0],[7,0],[6,1],[7,1]]
  • 插入[5,2]:[[5,0],[7,0],[5,2],[6,1],[7,1]]
  • 插入[4,4]:[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]]
  • 时间复杂度:O(nlog n + n^2)
  • 空间复杂度:O(n)
# -x[0]表示降序,x[1]表示升序
 1 class Solution:
 2     def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:
 3         # 先按照h维度的身高顺序从高到低排序。确定第一个维度
 4         # lambda返回的是一个元组:当-x[0](维度h)相同时,再根据x[1](维度k)从小到大排序
 5         people.sort(key=lambda x: (-x[0], x[1]))
 6         que = []
 7     
 8     # 根据每个元素的第二个维度k,贪心算法,进行插入
 9         # people已经排序过了:同一高度时k值小的排前面。
10         for p in people:
11             que.insert(p[1], p)
12         return que

452. 用最少数量的箭引爆气球

局部最优:当气球出现重叠,一起射,所用弓箭最少。全局最优:把所有气球射爆所用弓箭最少。

  • 时间复杂度:O(nlog n),因为有一个快排。
  • 空间复杂度:O(1),有一个快排,最差情况(倒序)时,需要n次递归调用。因此确实需要O(n)的栈空间。
 1 class Solution:
 2     def findMinArrowShots(self, points: List[List[int]]) -> int:
 3         if len(points) == 0: return 0
 4         points.sort(key=lambda x: x[0])
 5         result = 1
 6         for i in range(1, len(points)):
 7             if points[i][0] > points[i - 1][1]: # 气球i和气球i-1不挨着,注意这里不是>=
 8                 result += 1     
 9             else:
10                 points[i][1] = min(points[i - 1][1], points[i][1]) # 更新重叠气球最小右边界
11         return result

 

标签:插入,List,people,随想录,406,算法,points,维度,气球
From: https://www.cnblogs.com/wuyijia/p/17710968.html

相关文章

  • 算法问题记录
    1. 故障量值跳变问题   原因:发生丢帧,数据取走不及时导致缓冲区中数据越积累越多。     解决方法:赶快把数据取走......
  • 计算机视觉算法中的视频摘要(Video Summarization)
    引言随着数字视频内容的爆炸式增长,如何高效地获取视频的关键信息成为了一个重要的问题。视频摘要(VideoSummarization)作为计算机视觉领域的一个重要研究方向,旨在通过自动化方法从长时间的视频中提取出关键的、代表性的内容,以便用户能够快速浏览和获取视频的核心信息。本文将介绍视......
  • 9.18算法
    题目如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个回文串。字母和数字都属于字母数字字符。给你一个字符串s,如果它是回文串,返回true;否则,返回false。示例1:输入:s="Aman,aplan,acana......
  • 算法训练day11 栈与队列 02 LeetCode20
    算法训练day11栈与队列02LeetCode20.1047.15020.有效的括号:题目:20.有效的括号-力扣(LeetCode)题解:代码随想录(programmercarl.com)classSolution{public:boolisValid(strings){stack<char>str;if(s.size()%2==1)......
  • 粒子群算法(Particle Swarm Optimization, PSO)
    ParticleSwarmOptimization算法原理参考:https://zhuanlan.zhihu.com/p/404198434Question使用PSO算法计算函数$f(x)=x_1^2+3x_2^2-x_1+2x_2-5$在\(x\in[-100,100]^2\)上的最小值CodeimportnumpyasnpfromtypingimportListParametersdim=......
  • 数据结构和算法的区别?——算法工程师必备基础知识
     基础部分:语言部分(Python、C++、Java)输入、输出、变量、容器等。算法和数据结构:数据结构用于存储数据,算法则是用于查找数据参考:https://www.bilibili.com/video/BV1bo4y1R7MB/......
  • m基于PN导频序列和cordic算法的基带数据帧频偏估计和补偿FPGA实现,包含testbench
    1.算法仿真效果本系统进行了Vivado2019.2平台的开发,测试结果如下局部放大之后:我们可以看到,带有频偏的基带信号o_I_fre和o_Q_fre得到了有效的频偏补偿,其补偿后的数据o_Ir和o_Qr和原始的基带数据基本一致。2.算法涉及理论知识概要基于PN导频序列和CORDIC算法的基带数据帧频偏......
  • 基于DNN深度学习网络的OFDM+QPSK信号检测算法matlab仿真
    1.算法运行效果图预览   2.算法运行软件版本matlab2022a  3.算法理论概述        正交频分复用(OFDM)是一种多载波调制技术,已经广泛应用于数字通信领域。OFDM信号检测是接收端的关键问题之一,目的是将接收到的OFDM信号恢复为原始数据。由于OFDM信号具有高带......
  • m基于PN导频序列和cordic算法的基带数据帧频偏估计和补偿FPGA实现,包含testbench
    1.算法仿真效果本系统进行了Vivado2019.2平台的开发,测试结果如下   局部放大之后:   我们可以看到,带有频偏的基带信号o_I_fre和o_Q_fre得到了有效的频偏补偿,其补偿后的数据o_Ir和o_Qr和原始的基带数据基本一致。 2.算法涉及理论知识概要        基于P......
  • 文心一言 VS 讯飞星火 VS chatgpt (94)-- 算法导论9.2 3题
    三、用go语言,给出RANDOMIZED-SELECT的一个基于循环的版本。文心一言:在循环中实现RANDOMIZED-SELECT的一个版本可以如下所示。这个版本使用Go语言编写,利用随机化来选择一个元素,并在循环中不断地调整选择的元素,直到找到目标元素。packagemainimport("fmt""m......