leetcode周赛153-5182删除一次得到子数组最大和

题目描述:

给你一个整数数组,返回它的某个 非空 子数组(连续元素)在执行一次可选的删除操作后,所能得到的最大元素总和。

换句话说,你可以从原数组中选出一个子数组,并可以决定要不要从中删除一个元素(只能删一次哦),(删除后)子数组中至少应当有一个元素,然后该子数组(剩下)的元素总和是所有子数组之中最大的。

注意,删除一个元素后,子数组 不能为空。

示例 1:

输入:arr = [1,-2,0,3]
输出:4
解释:我们可以选出 [1, -2, 0, 3],然后删掉 -2,这样得到 [1, 0, 3],和最大。

示例 2:

输入:arr = [1,-2,-2,3]
输出:3
解释:我们直接选出 [3],这就是最大和。

示例 3:

输入:arr = [-1,-1,-1,-1]
输出:-1
解释:最后得到的子数组不能为空,所以我们不能选择 [-1] 并从中删去 -1 来得到 0。
     我们应该直接选择 [-1],或者选择 [-1, -1] 再从中删去一个 -1。

提示:

  • 1 <= arr.length <= 10^5
  • -10^4 <= arr[i] <= 10^4

注意:本算法为0(n*n) leetcode 会超时,通过30/32用例

 1 /**
 2  * @Project
 3  * @Author zhaozhen
 4  * @Email [email protected]
 5  * @Date 2019/9/8
 6  */
 7 public class leetcode5182 {
 8     public int maximumSum(int[] arr) {
 9 
10         //判断是否全部小于0
11         int max = continueMaxOfNums(arr);
12         if(max <= 0){
13             return max;
14         }
15 
16         int current = max;
17         for(int i = 0;i < arr.length;i++){
18             if(arr[i] >= 0) continue;
19             int[] temp = arr.clone();
20             temp[i] = 0;
21             current = continueMaxOfNums(temp);
22             max = Math.max(max,current);
23         }
24         return max;
25     }
26 
27 
28     /**
29      * 最大连续字串
30      * @param nums
31      * @return
32      */
33     public int continueMaxOfNums(int[] nums){
34 
35 
36         int current = 0;
37         int max = 0;
38 
39         int nums_max = nums[0];
40         int i = 0;
41         for(; i < nums.length;i++){
42             if(nums[i] > nums_max){
43                 nums_max = nums[i];
44             }
45             if(nums[i] > 0){
46                 break;
47             }
48         }
49         if(nums_max <= 0){
50             return nums_max;
51         }
52 
53         for(; i < nums.length;i++){
54             if(nums[i] < 0){
55                 if(current > max){
56                     max = current;
57                 }
58                 if(current + nums[i] < 0){
59                     current = 0;
60                 }else{
61                     current += nums[i];
62                 }
63             }else{
64                 current += nums[i];
65             }
66         }
67         if(current > max){
68             max = current;
69         }
70 
71         return max;
72     }
73 
74     public static void main(String[] args) {
75         leetcode5182 leetcode5182 = new leetcode5182();
76         leetcode5182.maximumSum(new int[]{1,-2,0,3});
77     }
78 }

 

转载于:https://www.cnblogs.com/oldhands/p/11485776.html

你可能感兴趣的:(leetcode周赛153-5182删除一次得到子数组最大和)