力扣#1331
题目描述:给你一个整数数组 arr ,请你将数组中的每个元素替换为它们排序后的序号。
序号代表了一个元素有多大。序号编号的规则如下:
序号从 1 开始编号。
一个元素越大,那么序号越大。如果两个元素相等,那么它们的序号相同。
每个数字的序号都应该尽可能地小。
解题思路:这题主要是对数组的序号进行了一些操作,那么我们就可以用哈希表来进行这个操作,哈希表就是有key和value组成的,并且查找的时间复杂度只有O(1),另外这道题涉及了很多操作,比如首先是一个排序,肯定不能直接对愿数组进行操作,不然原数组里面就混杂值和下标了。所以我们得申请一个新的哈希表,用于存放数组的排序后的值,并且可以很方便的得到key的下标。排序的话,选择快排可以增加时间效率,虽然会使用递归进行操作,空间复杂度会增加。
补充
快速排序
思路:快速排序的思路就是不断找出一个关键值,进行数组交换操作,使得关键值左边的数普遍小于关键值,关键值右边的值普遍大于关键值,这样就可以将关键值放在正确的位置上面,不断进行这样的操作最后就可以到的一个有序数组。那么我们应该怎么选择关键值,一般是选择数组中的第一个数作为关键值,
首先,移动两个指针:使用两个指针分别指向本次操作的开头和结尾,左指针一直往右移动直到找到第一个比关键值大的数,右边的指针不断的左移,直到第一个比关键值小的值。
接着,交换值:把右指针的值放在开头的位置,左指针的值放在右指针的位置
重复进行上面两个步骤,直到两个指针指向同一个位置,最后将关键值放在两个指针指向的位置即可。
最后,使用递归对关键值左边的数组和关键值右边的数组进行操作即可。
HashMap
HashMap是java集合中的一种,用于存放key和value对,根据键值查询对应的value,两者可以使用不同数值类型,存入数据时是无序的,不支持多线程
HashMap的创建:
import java.util.HashMap;
Map<Integer, Integer> test = new Hashmap<>();
test.put(1,2);//加入元素
test.get(1);//根据键值输出value,时间复杂度为O(1)
test.clear();//清除
//还有很多常用的方法