力扣之按身高排序

题目描述

给你一个字符串数组 names ,和一个由 互不相同 的正整数组成的数组 heights 。两个数组的长度均为 n 。

对于每个下标 inames[i] 和 heights[i] 表示第 i 个人的名字和身高。

请按身高 降序 顺序返回对应的名字数组 names 。

示例 1:

输入: names = ["Mary","John","Emma"], heights = [180,165,170]
输出: ["Mary","Emma","John"]
解释: Mary 最高,接着是 Emma 和 John 。

示例 2:

输入: names = ["Alice","Bob","Bob"], heights = [155,185,150]
输出: ["Bob","Alice","Bob"]
解释: 第一个 Bob 最高,然后是 Alice 和第二个 Bob 。
力扣原题目地址:https://leetcode.cn/problems/...

思路解法

分析

  • 题目中有两块信息,分别是对应的身高数组和姓名数组,不过最终要求的结果却是,按照身高数组的排序返回对应的姓名数组。
  • 一想到排序,我们首先要想到js中的sort(function(a-b){})排序方法。不过平常使用这个api的时候,我们常常是用做一维数组的排序。
  • 实际上二维数组也可以使用这个api的,为什么会提到二维数组呢?
  • 因为单个的信息包含两个变量:姓名和身高。所以使用二维数组最合适

思路步骤

  1. 创建一个二维数组,二维数组中的每一项又是一个小数组,一个个的小数组中都存放两个值,某人的名字和身高。
  2. 然后根据身高排序
  3. 将排好序的二维数组遍历,取出其中的名字即可

代码

使用Map集合转二维数组

function sortPeople(names, heights) { // 注意heights数组没有重复项(names数组可能有重复项)
        // 两个对应数组,同等长度,取谁的长度都行
        let n = names.length
        // 首先将名字身高组合成一个map集合
        let map = new Map()
        for (let i = 0; i < n; i++) {
                map.set(heights[i], names[i]) // 取谁,value就是谁
        }
        // 然后将map集合转换成二维数组,并调用原生js的api排序
        let sort2WeiArr = [...map].sort(function (a, b) {
                return b[0] - a[0] // 记不清a-b还是b-a没关系,打印看下就行了
        })
        // 排好序的二维数组再遍历,取出名字项即可
        let result = sort2WeiArr.map((item) => {
                return item[1]
        })
        return result
}
const res = sortPeople(names, heights)
console.log('排序结果', res)

tips: Map集合转二维数组:[...Map] 这样写就解构转二维数组了

提交结果图

力扣之按身高排序_第1张图片

原地转二维数组

这个就是不使用Map集合了,直接原地转,赋值替代,将原来的一维数组转成二维数组,如下代码:

function sortPeople(names, heights) {
        let n = names.length
        for (let i = 0; i < n; i++) {
                // 原地转二维数组,当然也可以定义一个数组来转,不过耗费内存
                // 如:newArr[i] = [heights[i], names[i]] 
                heights[i] = [heights[i], names[i]] // 原地摇身一变,一维成二维的了
        }
        // 二维数组排好序
        let sort2WeiArr = heights.sort(function (a, b) {
                return b[0] - a[0]
        })
        // 排好序的二维数组再遍历,取出名字项即可
        let result = sort2WeiArr.map((item) => {
                return item[1]
        })
        return result
}
const res = sortPeople(names, heights)
console.log('排序结果', res)

提交结果图

力扣之按身高排序_第2张图片

对比上述两张结果图,发现第二种方式优于第一种方式

总结

本道题目,复习巩固了以下知识:

  • map集合转二维数组的写法
  • 二维数组使用sort方法排序
  • 一位数组原地转成二维数组

提醒:有的道友可能会这样写,这样写性能就不好了

// 好的方式
let n = names.length
let map = new Map()
for (let i = 0; i < n; i++) {
     map.set(heights[i], names[i]) // 取谁,value就是谁
}

// 不好的方式
let map = new Map()
for (let i = 0; i < names.length; i++) {
    for (let j = 0; j < heights.length; j++) {
        if(i == j){
             map.set(heights[i], names[i]) 
        }
    }
}

// 原因不赘述,大家都懂

你可能感兴趣的:(leetcode算法排序)