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] <= 100100<=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 401n40
要求:时间复杂度: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;

posted on 2022-03-04 10:26  阿ming  阅读(20)  评论(0编辑  收藏  举报

导航