算法题练习

55 阅读2分钟

给定n个表示高程地图的非负整数,其中 每个酒吧的宽度为1,计算它能够捕获多少水 下雨了. 例如,给定 [0,1,0,2,1,0,1,3,2,1,2,1],返回6。


    public static int trap(int[] a){
        final int n=a.length;
        int[] left_peak=new int[n];
        int[] right_peak=new int[n];
        for (int i = 0; i <n ; i++) {
            left_peak[i]=Math.max(left_peak[i-1],a[i-1]);
        }
        for (int i = n-2; i >=0 ; --i) {
            right_peak[i]=Math.max(right_peak[i+1],a[i+1]);
        }
        int sum=0;
        for (int i = 0; i <n ; i++) {
            int height=Math.min(left_peak[i],right_peak[i]);
            if(height>a[i]){
                sum+=height-a[i];
            }
        }
        return sum;
    }

    public static int trapTwo(int[] a){
        final int n=a.length;
        int peak_index=0;
        for (int i = 0; i <n ; i++) {
            if(a[i]>a[peak_index])peak_index=i;
        }
        int water=0;
        for (int i = 0,left_peak=0; i <peak_index ; i++) {
            if(a[i]>left_peak)left_peak=a[i];
            else water+=left_peak-a[i];
        }
        for (int i = n-1,right_peak=0; i >peak_index ; i--) {
            if(a[i]>right_peak)right_peak=a[i];
            else water+=right_peak-a[i];
        }
        return water;
    }

给你一个代表图像的n × n二维矩阵。 将图像旋转90度 (顺时针)。 追问: 你能做到这一点吗?


    public static void rotate(final int[][] matrix){
        final int n=matrix.length;
        for (int i = 0; i <n ; i++) {
            for (int j = 0; j <n-1 ; j++) {
                swap(matrix,i,j,n-1-j,n-1-i);
            }
        }
        for (int i = 0; i <n/2 ; i++) {
            for (int j = 0; j <n ; j++) {
                swap(matrix,i,j,n-1-i,j);
            }
        }
    }

    private static void swap(int[][] matrix, int i, int j, int i1, int i2) {
        int tmp=matrix[i][j];
        matrix[i][j]=matrix[i1][i2];
        matrix[i1][i2]=tmp;
    }

给定一个表示为数字数组的数字,再加上一个数字。


    public static int[] plusOne(int[] digits){
        return add(digits,1);
    }
    private static int[] add(int[] digits, int i) {
        int c=i;
        for (int j = digits.length-1; j >=0 ; j--) {
            digits[j]+=c;
            c=digits[i]/10;
            digits[i]%=10;
        }
        if(c>0){
            int[] tmp=new int[digits.length+1];
            System.arraycopy(digits,0,tmp,1,digits.length);
            tmp[0]=c;
            return tmp;
        }else{
            return digits;
        }
    }

你在爬楼梯。它需要n步才能到达顶部。 每次你可以爬1或2步。有多少不同的方式可以 你爬到山顶了?


    public static int climbStairs(int n){
        int prev=0;
        int cur=1;
        for (int i = 1; i <=n; i++) {
            int tmp=cur;
            cur+=prev;
            prev=tmp;
        }
        return cur;
    }