75.
1.可以统计出数组中 0,1,2 的个数,再根据它们的数量,重写整个数组。
2.对数组进行两次遍历。指针ptr,在第一次遍历中,我们将数组中所有的 0 交换到数组的头部。在第二次遍历中,我们将数组中所有的 1交换到头部的 0 之后。此时,所有的 2 都出现在数组的尾部。
3.对数组进行一次遍历,用指针 p0 来交换 0,p1来交换 1,初始值都为 0。
如果找到了 1,那么将其与 nums[p1]进行交换,并将 p1 向后移动一个位置,
如果找到了 0,如果 p0<p1,那么需要先将 nums[i] 与 nums[p0]进行交换,再将 nums[i] 与 nums[p1]进行交换。
4.也可以使用指针 p0 来交换 0,p2来交换 2。p0的初始值仍然为 0,而 p2 的初始值为 n−1。
指针 p2 是从右向左移动的,因此当从左向右遍历整个数组时,如果遍历到的位置超过了 p2,那么就可以直接停止遍历了。
如果找到了 0,将其与 nums[p0] 进行交换,并将 p0 向后移动一个位置。
如果找到了 2,将 nums[i]与 nums[p2]进行交换之后,新的 nums[i]可能仍然是 2,也可能是 0。然而此时结束了交换,开始遍历下一个元素 nums[i+1],不会再考虑 nums[i] 了,这样我们就会得到错误的答案。因此,当找到 2 时,需要不断地将其与 nums[p2]进行交换,直到新的 nums[i]不为 2。
705.设计哈希集合
要解决的问题:
- 哈希函数:能够将集合中任意可能的元素映射到一个固定范围的整数值,并将该元素存储到整数值对应的地址上。
- 冲突处理:由于不同元素可能映射到相同的整数值,因此需要在整数值出现「冲突」时,需要进行冲突处理。
- 扩容:当哈希表元素过多时,冲突的概率将越来越大,而在哈希表中查询一个元素的效率也会越来越低。因此,需要开辟一块更大的空间,来缓解哈希表中发生的冲突。
一个最简单的哈希表实现:链地址法。
设哈希表的大小为 base,则可以设计一个简单的哈希函数:hash(x)=x mod base。
开辟一个大小为 base 的数组,数组的每个位置是一个链表。当计算出哈希值之后,就插入到对应位置的链表当中。
由于使用整数除法作为哈希函数,为了尽可能避免冲突,应当将 base 取为一个质数。在这里,我们取 base=769。
706.设计哈希映射