算法 - 加一和爬楼梯

142 阅读2分钟

这是我参与更文挑战的第3天,活动详情查看: 更文挑战

加一

给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外,这个整数不会以零开头。

输入:digits = [1,2,3]
输出:[1,2,4]
解释:输入数组表示数字 123

看似很简单,但是如果把进位的情况也考虑进来就很难了,最重要是找到进位规律。

  public int[] plusOne(int[] digits) {

        for (int i = digits.length - 1; i >= 0; i--) {
            if (digits[i] == 9) { //逢9+1 要进位
                digits[i] = 0;
            } else {
                digits[i]++; //当前为没有进位,直接返回
                return digits;
            }
        }
        //如果循环结束后,还是上面没有返回,那么就可能输入的是 9999这种情况

        digits = new int[digits.length + 1];
        digits[0] = 1;
        return digits;
    }

复杂度分析:

  • 时间复杂度:O(n)O(n),遍历一次数组长度。
  • 空间复杂度:O(n)O(n),全部进位的情况下,开辟了一个新的数组。

爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。

输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1.  1 阶 + 12.  2

已知爬 第f(n)阶有n种爬法,爬上到n阶可以是f(n-1)再上一阶,也可以是f(n-2)再上两阶到f(n),所以不难得出 f(n)=f(n1)+f(n2)f(n) =f(n-1)+f(n-2).

    public int climbStairs(int n) {
        if (n <=2){
            return n;
        }
        //上上级有多少种爬法
        int prevprev = 1;
        //上级有多少种爬法
        int prev = 2;
        
        int result = 0;

        for (int i = 2; i < n; i++) {
            result = prev + prevprev;
            prevprev = prev;
            prev = result;
        }

        return result;

    }

复杂度分析:

  • 时间复杂度:O(n)O(n),遍历一次n的长度。
  • 空间复杂度:O(1)O(1)