算法总结

最小栈的实现
解法:
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;  
}  

转自博客:
http://blog.csdn.net/xjh093/article/details/53316339

https://mp.weixin.qq.com/s?__biz=MzI1MTIzMzI2MA==&mid=2650560448&idx=1&sn=b4ca3d01a438fac78be4077f270974ca&chksm=f1fee143c6896855179eff005164be47c7c662d4c8badf571a79c4acd9e2aca9fd84839ca093&scene=21#wechat_redirect

你可能感兴趣的:(算法总结)