题目:
假设你正在爬楼梯。需要
n
阶你才能到达楼顶。每次你可以爬
1
或2
个台阶。你有多少种不同的方法可以爬到楼顶呢?
示例:
输入:n = 3 输出:3 解释:有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶2. 1 阶 + 2 阶
3. 2 阶 + 1 阶
思路:
爬楼梯分为的两种方式:
当楼梯阶数大于2时,第一种:第一步爬1阶;第二种:第一步爬2阶。爬过一阶后,可以当做又是第一步爬。
方法一:递归
class Solution {
Map<Integer,Integer> storeMap = new HashMap<>();
public int climbStairs(int n) {
if (n==1)return 1;
if (n==2)return 2;
if (null !=storeMap.get(n))
return storeMap.get(n);
else {
int res = climbStairs(n-1)+climbStairs(n-2);
storeMap.put(n,res);
return res;
}
}
}
方法二:循环 (递归转换)
class Solution {
public int climbStairs(int n) {
//循环
if(n==1)return 1;
if (n==2)return 2;
int p1 = 1;
int p2 = 2;
int res = 0;
for (int i = 3; i <= n; i++) {
res = p1+p2;
p1 = p2;
p2 = res;
}
return res;
}
}
题目描述:
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr],并返回其长度。如果不存在符合条件的子数组,返回 0 。
示例:
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3]是该条件下的长度最小的子数组。
思路:开始用的双循环暴力枚举,结果超时了,改用滑动窗口法。
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int res = Integer.MAX_VALUE;
int sum = 0;
int i = 0;
int j = 0;
while (i<nums.length){
sum+=nums[i++];
while (sum>=target){
res = Math.min(res,i-j);
sum -= nums[j++];
}
}
return res == Integer.MAX_VALUE?0:res;
}
}