当前位置: 首页 > news >正文

LeetCode406☞根据身高重建队列

关联LeetCode题号406

本题特点
  • 贪心算法
  • 关于出现两个维度一起考虑的情况,(本题是身高和排行两个维度)其技巧都是确定一边然后贪心另一边,两边一起考虑,就会顾此失彼。类似LeetCode135☞分糖果

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

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

  • 一开始先按照排行维度考虑排序,发现身高和排行都不能确定
  • 再考虑按照身高维度排序,如果身高相同,就按照排行从小到大排序,这样就会得到一个身高按照从大小的排列顺序,
  • 题目要求,每个元素前面都是身高大,所以只要根据排行的位置进行插入(头插法)即可,因为后面身高都是小于前面的,向前插入永远不会出现,该元素前有比该元素还小的的元素
python写法
class Solution:
    def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:
        # 先按照h维度的身高顺序从高到低排序。确定第一个维度
        # lambda返回的是一个元组:当-x[0](维度h)相同时,再根据x[1](维度k)从小到大排序

        people.sort(key=lambda x: (-x[0], x[1]))
        que = []
	
	# 根据每个元素的第二个维度k,贪心算法,进行插入
        # people已经排序过了:同一高度时k值小的排前面。
        for p in people:
            que.insert(p[1], p)
        return que

people.sort(key=lambda x: (-x[0], x[1]))

#按照第一个元素的从大到小排序,如果第一个元素相同,则按照第二个元素从小到大排序

Java写法
package leetcode;

import org.junit.jupiter.api.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;

/**
 * File Description: QueueReconstructionByHeight_406
 * Author: Your Name
 * Date: 2024/12/25
 */
public class QueueReconstructionByHeight_406 {
    public int[][] reconstructQueue(int[][] people) {
        Arrays.sort(people, (a, b)->{
            if (a[0] == b[0]) return a[1] - b[1];
            return b[0] - a[0];
        });

        ArrayList<int[]> que = new ArrayList<>();
        for (int[] p: people){
            que.add(p[1], p);
        }
        int[][] q = new int[people.length][];
        return que.toArray(q);
    }

    @Test
    public void TestReconstructQueue(){
        int[][] q = {{7,0}, {4,4},{7,1},{5,0},{6,1},{5,2}};
        int[][] res = reconstructQueue(q);
        System.out.println(Arrays.deepToString(res));
    }

}
1. lambda表达式☞类的静态方法

sort(Comparator) , (a,b)->a-b 表示从小到大排序,b-a表示从大到小

Arrays.sort(people, (a, b)->{

if (a[0] == b[0]) return a[1] - b[1];

return b[0] - a[0];

})
2. ArrayList转化为Arrays

ArrayList的对象方法toArray(arr) 优先将列表元素存到数组arr,否则,将为此分配相同运行时类型的新数组。

匿名类方法写成

que.toArray(new int[people.length][])
3. 将Arrays转化成String输出具体元素值

一维数组使用Arrays.toString(arr),若二维数组使用该方法,输出子层元素值

二维数组使用Arrays.deepToString(arr)

相关文章:

  • 挂号网站制作百度推广技巧方法
  • 招聘网站建设的目的郴州网站建设
  • 做网页和做网站的区别建站 seo课程
  • 电子商务网站规划建设与管理超级软文
  • 专业网站建设推荐西安疫情最新数据消息中高风险地区
  • 北京网站空间信息推广服务
  • DDoS防护:从基础认知到实战防御的全方位指南
  • Jmeter 插件【性能测试监控搭建】
  • c语言练习一
  • 【数据分享】1999—2023年地级市市政公用事业和邮政、电信业发展情况相关指标(Shp/Excel格式)
  • 【11408学习记录】英语语法精讲:主从复合句核心解析与纪要写作实战指南 | 附每日一句长难句拆解
  • 基于SpringBoot+Vue的在线云拍卖行系统【提供源码+答辩PPT+参考文档+项目部署】
  • docker 修改镜像源教程
  • Gitea的安装和配置以及应用
  • react动态路由
  • kotlin,Android,jetpack compose,日期时间设置
  • 状态机的基本使用
  • 天文学数据集记录 | 智能体知识库| AI大模型训练
  • 利用持久变量绕过长度限制 + unicode特性绕过waf-- xyctf 出题人已疯12 复现
  • VS Code下开发FPGA——FPGA开发体验提升__下
  • 5. 深度剖析:Spring AI项目架构与分层体系全解读
  • 3D珠宝渲染用什么软件比较好?渲染100邀请码1a12
  • 【学习笔记】MeshCat: 基于three.js的远程可控3D可视化工具
  • Python 字典和集合(子类化UserDict)
  • Java spring mybatis面试题(200道),八股文
  • 深入浅出卡尔曼滤波:从理论推导到C++实战