70. 爬楼梯 - 力扣(LeetCode)
题目:
假设你正在爬楼梯。需要
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;}
}
209. 长度最小的子数组 - 力扣(LeetCode)
题目描述:
给定一个含有 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;}
}