之前同学面试今日头条,碰到了破浪数问题
即在数组上升下降不定时,找到其中一个波峰
如{1,2,3, 1,0,-1, -3,1,3, 4,5,2, 1,0,2, 3,2,1}
找到3即可
最优为O(logn)解法
随手写了一下,马马虎虎能满足要求;望指正
public class test{
// static int[] array = new int[]{1,2,3, 1,0,-1, -3,1,3, 4,5,2, 1,0,2, 3,2,1};
// static int[] array = new int[]{1,2,3, 1,0,-1, -3,1};
static int[] array = new int[10];
public static int inner(int left, int right ){
System.out.println("left"+left+"right"+right);
if (left<=0 || right>=array.length-1 || right-left<0){
return -32767;
}
if (left == right || right-left == 1){
if(array[left]-array[left-1]>0 && array[right+1]-array[right]<0){
return Math.max(array[left], array[right]);
}else if (array[left]-array[left-1]==0 && array[right+1]-array[right]==0){
return Math.max(array[left], array[right]);
}
else{return -32767;}
}
if(array[left]-array[left-1]>0 && array[right+1]-array[right]<0){
right = left+(right-left+1)/2 ;
return inner(left, right);
}else if(array[right]-array[left-1]>0 && array[right+1]-array[right]>0){
int temp = right-left;
int returnValue = inner(right, right+temp);
if(returnValue == -32767){
returnValue = inner(left+1, right);
}
return returnValue;
}else if(array[left]-array[left-1]<0 && array[right+1]-array[right]<0){
int temp = right-left;
int returnValue = inner(left-temp, left);
if(returnValue == -32767){
returnValue = inner(left, right-1);
}
return returnValue;
// right++;
}
else if(array[left]-array[left-1]<0 && array[right+1]-array[right]>0){
right--;
// left++;
}else{
right--;
// left++;
}
return inner(left, right);
}
public static int fourth(){
}
public static void main(String[] args) {
for(int i : array)
System.out.println(i);
// O(log n)
// for(int i=0;i<array.length();i++){
int left = 1;
int right = array.length-2;
int result = 0;
result = inner(left, right);
System.out.println(result);
}
}
还有一道题是判断是否是平衡二叉树的
如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
源于剑指offer:
bool IsBalanced(BinaryTreeNode* pRoot, int* depth)
{
if(pRoot== NULL)
{
*depth = 0;
return true;
}
int nLeftDepth,nRightDepth;
bool bLeft= IsBalanced(pRoot->m_pLeft, &nLeftDepth);
bool bRight = IsBalanced(pRoot->m_pRight, &nRightDepth);
if (bLeft && bRight)
{
int diff = nRightDepth-nLeftDepth;
if (diff<=1 || diff>=-1)
{
*depth = 1+(nLeftDepth > nRightDepth ? nLeftDepth : nRightDepth);
return true;
}
}
return false;
}
bool IsBalanced(BinaryTreeNode* pRoot)
{
int depth = 0;
return IsBalanced(pRoot, &depth);
}