最小栈的实现
解法:
1.设原有的栈叫做栈A,此时创建一个额外的栈B,用于辅助原栈A。
2.当第一个元素进入栈A的时候,让新元素的下标进入栈B。这个唯一的元素是栈A的当前最小值。(考虑到栈中元素可能不是类对象,所以B栈存储的是A栈元素的下标)
3.每当新元素进入栈A时,比较新元素和栈A当前最小值的大小,如果小于栈A当前最小值,则让新元素的下标进入栈B,此时栈B的栈顶元素就是栈A当前最小值的下标。
4.每当栈A有元素出栈时,如果出栈元素是栈A当前最小值,则让栈B的栈顶元素也出栈。此时栈B余下的栈顶元素所指向的,是栈A当中原本第二小的元素,代替刚才的出栈元素成为了栈A的当前最小值。(备胎转正)
5.当调用getMin方法的时候,直接返回栈B的栈顶所指向的栈A对应元素即可。
摘自:https://mp.weixin.qq.com/s?__biz=MzI1MTIzMzI2MA==&mid=2650560419&idx=1&sn=535073d4d69cf7fc45074ccb8c25ba1e&chksm=f1fee120c68968367597137515f21ef8d7a8ab68c9f4fce051dae5f2631afdc48ec11a30dd0e&scene=21#wechat_redirect
最小队列的实现
位运算妙用
判断一个正数是否是2的乘方。要求性能尽可能高。
思路一:从int temp = 1开始,每次循环比较是否与number相等,不相等就让temp增大一倍(temp = temp*2),如此循环比较,直到相等为止。
这个方法的时间复杂度是O(LogN)。
思路二:寻找是2的乘方的数,的规律。
N N-1
2 -> 10b 1b
4 -> 100b 11b
8 -> 1000b 111b
16 -> 10000b 1111b
最高位都是1。
所以,N&(N-1) = 0。时间复杂度为O(1)。
那么,求一个正整数转成二进制后,有多少个1?
当然,也应该与位运算有关了。
一个数N,N&1 要么是0,要么是1。
所以,结果为1时,说明最低位是1。为0时,说明最低位不是1。
因此,每次&后,都右移一位,再次&,直到N右移为0时,结束循环。
NSInteger value = 111;
NSInteger count = 0;
while (value) {
NSLog(@"%ld",value&1);
int x = value&1;
if (x == 1) count++;
value = value>>1;
}
网友评论