栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

LeetCode——1331.数组序号转换

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LeetCode——1331.数组序号转换

通过万岁!!!

  • 题目:给你一个数组,然后让你找到每个数在这个数组中的排名,然后输出出来。如果两个数一样,则排名也一样,后面一个数的排名等于这个排名前面一个的排名+1即可。不是现实生活中跳过名字的那种情况。并且这里数小的话,排名就大。
  • 思路一:直接用一个treemap,然后key是这个数,value是这个数对应的下标,因为数会相同,所以value是一个list,然后遍历这个treemap遍历这个treemap,将value所对应的下标,改成一个排名值即可。
  • 思路二:还是上面的差不多,同样用一个map,但是不是treemap,而是普通的hashmap即可。key是数,value是这个数对应的排名。前提是,我们往map中加入内容的时候需要知道排名,所以可以先对数组进行排序。需要注意的是这里的排名不是排序以后数组的idx,而是map的size+1,因为会有相同数的情况。拿到map以后,我们遍历原数组,并从map中拿到排名即可。
  • 技巧:哈希表

java代码——思路一

class Solution {
    public int[] arrayRankTransform(int[] arr) {
        Map> treeMap = new TreeMap<>();// 值和值对应的下标
        for (int i = 0; i < arr.length; i++) {
            treeMap.putIfAbsent(arr[i], new ArrayList<>());
            treeMap.get(arr[i]).add(i);
        }
        int idx = 1;
        for (Map.Entry> node : treeMap.entrySet()) {
            List list = node.getValue();
            for (int i = 0; i < list.size(); i++) {
                arr[list.get(i)] = idx;
            }
            idx++;
        }
        return arr;
    }
}

java代码——思路二

class Solution {
    public int[] arrayRankTransform(int[] arr) {
        int[] sortArrs = arr.clone();
        Arrays.sort(sortArrs);
        Map map = new HashMap<>();// key是数,value是排名
        for (int num : sortArrs) {
            map.putIfAbsent(num, map.size() + 1);
        }
        for (int i = 0; i < arr.length; i++) {
            arr[i] = map.get(arr[i]);
        }
        return arr;
    }
}
  • 总结:这两个思路其实差不多,但是treemap的时候,每次加入,都会排序,时间复杂度会较高。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1032628.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号