利用递归来实现栈的倒序
//这个i定义在函数外面,防止每次递归调用将i的值初始化为0
int i = 0;
public int[] reverseStackRecursively(int[] stack, int top) {
// write code here
if(top>0)
{
int a = stack[top-1];
i++;
stack = reverseStackRecursively(stack,top-1);
i--;
stack[i] = a;
}
return stack;
}
桶排序的应用
给定一个未排序数组,返回排序后相邻的元素的差的最大值。要求o(logn)
使用桶排序,其实是通过空间换时间。就是开辟一块很大的空间,a[A[i]]=A[i]。这样一趟扫描下来数组就是有序的了
public int findMaxDivision(int[] A, int n) {
// write code here
int[] a=new int[65535];
for(int i=0;i<A.length;i++)
{
a[A[i]]=A[i];
}
int pre=0;
int result=0;
for(int i=0;i<65535;i++)
{
if(a[i]-pre>result&&pre!=0)
{
result=a[i]-pre;
}
if(a[i]!=0)
{
pre=a[i];
}
}
return result;
}
数组相关
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。
定义一个在数组指定范围内找最大值的函数,for循环通过两个指针即可圈定要查找的范围
public class Solution {
public ArrayList<Integer> maxInWindows(int [] num, int size)
{
ArrayList<Integer> result=new ArrayList<>();
if(size<=0||num==null)
{
return result;
}
int start=0;
int end=size-1;
while (end<num.length)
{
result.add(findMax(num,start,end));
start++;
end++;
}
return result;
}
public int findMax(int[] num,int start,int end)
{
int result=0;
for(int i=start;i<=end;i++)
{
if(num[i]>result)
{
result=num[i];
}
}
return result;
}
}