2022-3-4剑指offer day22
题1:
JZ85 连续子数组的最大和(二)
描述
输入一个长度为n的整型数组array,数组中的一个或连续多个整数组成一个子数组,找到一个具有最大和的连续子数组。
1.子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等等,但是[1,3,7]不是子数组
2.如果存在多个最大和的连续子数组,那么返回其中长度最长的,该题数据保证这个最长的只存在一个
3.该题定义的子数组的最小长度为1,不存在为空的子数组,即不存在[]是某个数组的子数组
4.返回的数组不计入空间复杂度计算
数据范围:
1<=n<=10^51<=n<=105
-100 <= a[i] <= 100−100<=a[i]<=100
要求:时间复杂度O(n)O(n),空间复杂度O(n)O(n)
进阶:时间复杂度O(n)O(n),空间复杂度O(1)O(1)
1 import java.util.*; 2 3 4 public class Solution { 5 /** 6 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 7 * 8 * 9 * @param array int整型一维数组 10 * @return int整型一维数组 11 */ 12 public int[] FindGreatestSumOfSubArray (int[] array) { 13 // write code here 14 int dp=array[0]; 15 int len=1; 16 int idx=0,max=array[0]; 17 int maxlen=1; 18 for (int i=1;i<array.length;i++) { 19 if (dp+array[i]<array[i]) { 20 dp=array[i]; 21 len=1; 22 }else { 23 dp=dp+array[i]; 24 len++; 25 } 26 if (dp>=max) { 27 max=dp; 28 idx=i; 29 maxlen=len; 30 } 31 } 32 int[] ans=new int[maxlen]; 33 for (int i=ans.length-1;i>=0;i--){ 34 ans[i]=array[idx-(maxlen-i-1)]; 35 } 36 return ans; 37 } 38 }
思路:动态规划,记录最大值的索引以及最大长度,因为dp[i]只与dp[i-1]有关,所以可以dp数组压缩为常数。
题2:
JZ69 跳台阶
描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个 n 级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
数据范围:1 \leq n \leq 401≤n≤40
要求:时间复杂度:O(n)O(n) ,空间复杂度: O(1)O(1)
1 public class Solution { 2 public int jumpFloor(int target) { 3 int f1=1,f2=2; 4 if (target==1) return f1; 5 if (target==2) return f2; 6 int ans=0; 7 for (int i=2;i<target;i++) { 8 ans=f1+f2; 9 f1=f2; 10 f2=ans; 11 } 12 return ans; 13 } 14 }
思路:dp_n=dp_n-1+dp_n-2;