摘要: 题目1.左旋数组中的查找(附:字符串左旋方法 的题目2)解法:将这个问题可以分解成子问题。要是带查找值落在单调有序区,那就直接二分查找了,落在左旋数组区,就递归查找。也可以把它简化成一个递归,就用fun,不用bs是一样的。题目2.左旋数组中的最小值解法:这题比上一个还简单,左旋数组的最小值一定出现在非单调部分,所以每次递归一半就行了。需要注意的就是递归终止条件,当数组最后剩下两个数的时候,这就是最小规模了,输出较小的数就行了。还有一点就是边界值 mid 也要放到下一次递归中,防止出现4,5,1,2,3 这种情况。#include <stdlib.h> int bs(int* a,i 阅读全文
posted @ 2012-10-01 20:00 23lalala 阅读(196) 评论(0) 推荐(0) 编辑
摘要: #include <stdlib.h>int intval(const char* str){ if(str==NULL){ return -1; } char* p = str; int result=0; int flag = 1; char c; while(c = *p++){ if(c=='-'){ flag = -1; } if(c>'0'&&c<'9'){ result = result*10+c-'0'; }... 阅读全文
posted @ 2012-10-01 11:01 23lalala 阅读(156) 评论(0) 推荐(0) 编辑
摘要: 合并排序扩展题目1.求数组中反序对的个数解法:将数组进行合并排序,只要P2指针向后移动,反序个数就sum += mid-p1+1个。如图,将2加入结果,<3,2> <5,2>都是反序的。2.荷兰国旗问题o(n)时间,o(1)空间,将0,1,2三个数排好序。解法:排好序的数组分为三个区,最左边是0,最右边是2,其余的都在中间。利用这个思想,维护三个变量begin,current,end其中在begin左边的都是0,在end右边的都是2。current一直遍历到current=end。具体步骤:1、current遍历,整个数组序列,current指1不动,2、current 阅读全文
posted @ 2012-10-01 10:25 23lalala 阅读(141) 评论(0) 推荐(0) 编辑