根据身高重建队列

406. 根据身高重建队列

题目

假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。

请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。

示例 1:

输入:people = [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]
输出:[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]]
解释:
编号为 0 的人身高为 5 ,没有身高更高或者相同的人排在他前面。
编号为 1 的人身高为 7 ,没有身高更高或者相同的人排在他前面。
编号为 2 的人身高为 5 ,有 2 个身高更高或者相同的人排在他前面,即编号为 0 和 1 的人。
编号为 3 的人身高为 6 ,有 1 个身高更高或者相同的人排在他前面,即编号为 1 的人。
编号为 4 的人身高为 4 ,有 4 个身高更高或者相同的人排在他前面,即编号为 0、1、2、3 的人。
编号为 5 的人身高为 7 ,有 1 个身高更高或者相同的人排在他前面,即编号为 1 的人。
因此 [[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]] 是重新构造后的队列。
示例 2:

输入:people = [[6,0],[5,0],[4,0],[3,2],[2,2],[1,4]]
输出:[[4,0],[5,0],[2,2],[3,2],[1,4],[6,0]]

思路

看到这类重构的题目,第一反应是先给数组排序。那么是按照身高从高到矮排序还是按照身高从矮到高排序呢?
1.如果按从矮到高排序,那么正向遍历数组的时候,在前面的身高中,找不到对应的比该身高高的数据,所以这样显然不对。
2.如果按从高到矮排序,那么如果高度一样,是按照前面有几个人正序还是倒序呢,显然是正序。
所以确定排序规则,如果身高一样,就按前面有几个人从小到大排序,如果身高不一样,那么按照从高到矮排序。

对于排序后的数组,正向遍历的时候,就相当于把当前元素插入到前i-1个元素中去,类似于插入排序,而且前面的身高都比当前身高高,所以该身高插入哪个位置倒不会影响前面的i-1个数据。那么该身高要插入到哪个准确的位置呢?
其实很显然,把它插入到第people[i][1]那个位置就好了,因为整个数组中,插入people[i][1]这个位置,那么前面就会有people[i][1]个身高比该身高大的数据。

code

class Solution {
    public int[][] reconstructQueue(int[][] people) {
        Arrays.sort(people,new Comparator<>(){
            public int compare(int[] o1,int []o2){
                if(o1[0]==o2[0]){
                    return o1[1]-o2[1];
                }
                return o2[0]-o1[0];
            }
        });
        Listlist=new ArrayList<>();
        for(int i=0;i

503. 下一个更大元素 II

题目

给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。

示例 1:

输入: [1,2,1]
输出: [2,-1,2]
解释: 第一个 1 的下一个更大的数是 2;
数字 2 找不到下一个更大的数;
第二个 1 的下一个最大的数需要循环搜索,结果也是 2。

思路

单调栈
考虑到有一个类似环形搜索,用取模法

code

class Solution {
    public int[] nextGreaterElements(int[] nums) {
        int n = nums.length;
        int[] res = new int[n];
        Arrays.fill(res,-1);
        Stack stack = new Stack<>();
        for(int i=0;i<2*n-1;i++){
            while(!stack.isEmpty() && nums[stack.peek()]

你可能感兴趣的:(根据身高重建队列)