diff --git a/Week_01/jqb/P11ContainerWithMostWater.java b/Week_01/jqb/P11ContainerWithMostWater.java new file mode 100644 index 0000000000000000000000000000000000000000..036114c6cf55008f3b9673f893a747156a01fbf3 --- /dev/null +++ b/Week_01/jqb/P11ContainerWithMostWater.java @@ -0,0 +1,93 @@ +//给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, +//ai) 和 (i, 0) 。找出其中的两条线,使得它们与 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 +// +// +// 示例 3: +// +// +//输入:height = [4,3,2,1,4] +//输出:16 +// +// +// 示例 4: +// +// +//输入:height = [1,2,1] +//输出:2 +// +// +// +// +// 提示: +// +// +// n = height.length +// 2 <= n <= 3 * 104 +// 0 <= height[i] <= 3 * 104 +// +// Related Topics 数组 双指针 +// 👍 2061 👎 0 + +package homework.algorithm.Week_01.jqb; + +//Java:盛最多水的容器 +public class P11ContainerWithMostWater { + public static void main(String[] args) { + Solution solution = new P11ContainerWithMostWater().new Solution(); + // TO TEST + int[] a = new int[]{1, 8, 6, 2, 5, 4, 8, 3, 7}; + int area = solution.maxArea2(a); + System.out.println(area); + } + + //leetcode submit region begin(Prohibit modification and deletion) + + class Solution { + //方法1;暴力循环,嵌套循环然后比较面积大小 + public int maxArea1(int[] height) { + int max = 0; + + for (int i = 0; i < height.length - 1; i++) { + for (int j = i + 1; j < height.length; j++) { + int area = (j - i) * Math.min(height[i], height[j]); + max = Math.max(area, max); + } + + } + return max; + } + + //方法2:双指针法,左右边界i,j,同时向中间收敛,左右夹逼 + public int maxArea2(int[] height) { + int max = 0; + for (int i = 0, j = height.length - 1; i < j; ) { + int minHeight = height[i] < height[j] ? height[i++] : height[j--]; + int area = (j - i + 1) * minHeight; + max = Math.max(area, max); + } + return max; + } + } +//leetcode submit region end(Prohibit modification and deletion) + + +} diff --git a/Week_01/jqb/P70ClimbingStairs.java b/Week_01/jqb/P70ClimbingStairs.java new file mode 100644 index 0000000000000000000000000000000000000000..4a1fea5d9ee7a27ad1ac26878370b8e025d0d791 --- /dev/null +++ b/Week_01/jqb/P70ClimbingStairs.java @@ -0,0 +1,68 @@ +//假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 +// +// 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? +// +// 注意:给定 n 是一个正整数。 +// +// 示例 1: +// +// 输入: 2 +//输出: 2 +//解释: 有两种方法可以爬到楼顶。 +//1. 1 阶 + 1 阶 +//2. 2 阶 +// +// 示例 2: +// +// 输入: 3 +//输出: 3 +//解释: 有三种方法可以爬到楼顶。 +//1. 1 阶 + 1 阶 + 1 阶 +//2. 1 阶 + 2 阶 +//3. 2 阶 + 1 阶 +// +// Related Topics 动态规划 +// 👍 1391 👎 0 + +package homework.algorithm.Week_01.jqb; + +//Java:爬楼梯 +public class P70ClimbingStairs { + public static void main(String[] args) { + Solution solution = new P70ClimbingStairs().new Solution(); + // TO TEST + int n = 4; + System.out.println(solution.climbStairs(n)); + } + + //leetcode submit region begin(Prohibit modification and deletion) + class Solution { + //解决算法问题思路: 找 最近重复子问题,然后通过if else ,for while 这类loop 或者 递归(recursion)来解决 + //本题分析: + //1、一级台阶,一步就可跨过,所以是1种方法 + //2、二级台阶,一步跨两级,或者 一步上一级, 所以是2种方法 + //3、三级台阶,一步上一级;先上一级,再上两级;或者先上两级,再上一级,所以是3种方法 + //4、四级台阶,共5中方法 + // 一步上一级; + // 先上一级,再上两级,再上一级; + // 先上一级,再上一级,再上两级; + // 先上两级,再上一级,再上一级; + // 先上两级,再上两级; + //结论: 以此类推,上到第n级台阶,相当于将上到第(n-1)级台阶的方法 加上 第(n-2)级台阶的方法相加即可,公式为:f(n) = f(n-1) + f(n-2). 斐波那契数列 fibonacci + + public int climbStairs(int n) { + if (n <= 2) { + return n; + } + int f1 = 1, f2 = 2, f3 = 3; + for (int i = 3; i < n; i++) { + f1 = f2; + f2 = f3; + f3 = f1 + f2; + } + return f3; + } + } +//leetcode submit region end(Prohibit modification and deletion) + +}