个人主页:天海奈奈的博客
刷题专栏: 题库 - 力扣 (LeetCode) 全球极客挚爱的技术成长平台面试top
刷题网站: 力扣 让我们一起加油~
目录
做项目鸽了两天,今天补上。说实话我字符串类是真菜。。。哭了半天想不出来。
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;
}
}