190. Reverse Bits
191. Number of 1 Bits
一个一个数就行了。比较简单。
136. Single Number
XOR的点在于,两个一样的数字a^a,结果是0. 且XOR是可以换位置的,所以把所有东西XOR在一起,剩下的就是单呗的。
137. Single Number II
四种方法:https://www.youtube.com/watch?v=cOFAmaMBVps
time complexity | space complexity | implementation | |
Hashmap | O(N):unorder_map, O(NlogN): map | O(N) | 把所有元素traverse一遍,存在map里,然后traverse map找到次数为1的 |
sort | O(NlogN)但是N<=2^32,所以logN小于32,所以sorting的方法比bit intuitive好 | 见下 | sort后从第二个元素开始,i每次加三,如果每次这个元素都和这个元素之前的一个一样那么就在cluster里,不一样那么之前那个元素就是single的。如果single在最开始或最后面,那么可以直接通过和前一个比找出来 |
bit intuitive | O(32*N) | O(1) | 每个bit都求个和,sum%3,把这些sum再加起来 |
bit non-intuitive | O(N) | O(1) | 很蹊跷,麻烦,懒得学 |
*sort
tends to be implemented as some variation of quick-sort, so that tends to be recursively implemented, so it would probably use O(log(n)) calls on average.
201. Bitwise AND of Numbers Range
很重要的观察:在一段区间内,前n个数字会是一样的,后m个数字会不一样,而这m个数字里一定有0,which means &出来都是0.
215. Kth Largest Element in an Array
max heap with greatest number on top: priority_queue<
int
> pq;
min heap: priority_queue <int, vector<int>, greater<int>> gq;
如果是minheap,那么一个一个往里放,遇到size大于k就pop,最后剩下的顶上的就是第n大的。
如果是max heap,那么从pq的constructor直接把所有元素放进去,pop(k-1)次,剩下的就是第k大的
Creating a heap takes O(n)
time while inserting into a heap (or priority queue) takes O(log(n))
time
另一种方法:用multiset 来做heap
multiset是maxheap有greater