算法面试 | 40天刷完LeetCode 精选 TOP 面试题(3/40)

个人主页:天海奈奈的博客
刷题专栏: 题库 - 力扣 (LeetCode) 全球极客挚爱的技术成长平台面试top
刷题网站:  力扣 让我们一起加油~

目录

70. 爬楼梯

69. x 的平方根 

66. 加一

11. 盛最多水的容器


 做项目鸽了两天,今天补上。说实话我字符串类是真菜。。。哭了半天想不出来。

70. 爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

示例 1:

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

输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶
 

这个题我们做之前可以写下来看一下有没有规律,

 case 1: result = 1; break;
    case 2: result = 2; break;
    case 3: result = 3; break;
    case 4: result = 5; break;
    case 5: result = 8; break;
    case 6: result = 13; break;
    case 7: result = 21; break;
    case 8: result = 34; break;
    case 9: result = 55; break;
    case 10: result = 89; break;
    case 11: result = 144; break;
    case 12: result = 233; break;
    case 13: result = 377; break;
    case 14: result = 610; break;
    case 15: result = 987; break;
    case 16: result = 1597; break;
    case 17: result = 2584; break;
    case 18: result = 4181; break;
    case 19: result = 6765; break;
    case 20: result = 10946; break;
    case 21: result = 17711; break;
    case 22: result = 28657; break;
    case 23: result = 46368; break;
    case 24: result = 75025; break;
    case 25: result = 121393; break;
    case 26: result = 196418; break;
    case 27: result = 317811; break;
    case 28: result = 514229; break;
    case 29: result = 832040; break;
    case 30: result = 1346269; break;
    case 31: result = 2178309; break;
    case 32: result = 3524578; break;
    case 33: result = 5702887; break;
    case 34: result = 9227465; break;
    case 35: result = 14930352; break;
    case 36: result = 24157817; break;
    case 37: result = 39088169; break;
    case 38: result = 63245986; break;
    case 39: result = 102334155; break;
    case 40: result = 165580141; break;
    case 41: result = 267914296; break;
    case 42: result = 433494437; break;
    case 43: result = 701408733; break;
    case 44: result = 1134903170; break;
    case 45: result = 1836311903; break;
    

声明一下,这是我复制评论区大佬的,用来看出规律。可以看出,从第三阶开始下一阶就是前两阶的和,那我们直接加知道前两阶后直接加就好

 代码实现

class Solution {
    public int climbStairs(int n) {
//只有一个台阶
        if(n == 1){return 1;}
        //只有两个台阶
        if(n == 2){return 2;}
        int a = 1,b = 2,temp;
        for(int i = 3;i <= n;i++){
            temp = a;
            a = b;
            b = temp + b;
        }
        return b;
    }
}

69. x 的平方根 

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。

由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。

注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。

示例 1:

输入:x = 4
输出:2
示例 2:

输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。

 考虑使用二分查找法,因为它只用求到整数,那我们二分查找的条件用“max-min<1”这种形式的就行,理解个这个思想就可以看代码了。

class Solution {
    public int mySqrt(int x) {
        if(x <1)return 0;
        if(x == 1)return 1;
        int max = x,min = 0;
        while(max - min >1){
            int m = (max + min)/2;
            if(x / m < m){
                max = m; 
            }else{
                min = m;
            }
        }
        return min;
    }
}

66. 加一

给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。

你可以假设除了整数 0 之外,这个整数不会以零开头。

示例 1:

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

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

输入:digits = [0]
输出:[1]

我们就把他看成是一道加法题,加法没有九就直接加,遇到9就变成零并进一位,把这种思想带到这道题里面,从后往前遍历,遇到9变成0下一位加一,如果还是九就继续,如果全是9就新建一个数组长度比原数组多一位,第一位设为1就好。

代码实现

class Solution {
    public int[] plusOne(int[] digits) {
        for(int i = digits.length -1 ;i >= 0; i--){
            if(digits[i] != 9){
                digits[i] ++;
                return digits;
            }
            digits[i] = 0;
        }
        int l = digits.length;
        int[] answer = new int[l+1];
        answer[0] = 1;
        return answer;
    }
}

11. 盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

说明:你不能倾斜容器。

示例 1:

输入:[1,8,6,2,5,4,8,3,7]
输出:49 
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
示例 2:

输入:height = [1,1]
输出:1

这个题乍一看可以用双重for循环遍历得到每次的面积再取最大就行,毕竟是个中等题,暴力肯定是不行的。那我们就稍微东西啊脑筋,使用双指针。他要面积最大,我们一个指针从前往后一个指针从后往前,移动指针时就根据那个指针比较短就移动哪个,来保证我们始终都在保证有最长挡板。我们不能保证移动完了肯定面积变大那就移动一次计算一次面积。

代码实现

class Solution {
    public int maxArea(int[] height) {
        //双指针,i往右,j往左
        int i = 0;
        int j = height.length-1;
        //s为每次移动后的面积 max为最大面积
        int s = 0,max = 0;
        while(i<j){
            s = Math.min(height[j],height[i])*(j-i);
            if(height[j]<=height[i]){
                j--;
            }else{
                i++;
            }
           if(max<s)max = s;
        }
    return max;
        }
    }

猜你喜欢

转载自blog.csdn.net/weixin_57169969/article/details/126774821
今日推荐