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<Integer, List<Integer>> 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<Integer, List<Integer>> node : treeMap.entrySet()) {
            List<Integer> 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<Integer, Integer> 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的时候,每次加入,都会排序,时间复杂度会较高。

你可能感兴趣的:(leetcode,算法,java,哈希表)