算法(五)

利用递归来实现栈的倒序

//这个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;
    }
}
点赞