zoukankan      html  css  js  c++  java
  • LeetCode53——Java之最大子序和

    以后我要养成写博客的习惯,所以呢,先开始多记录吧。

    题目:最大子序和

    给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

    示例:

    输入: [-2,1,-3,4,-1,2,1,-5,4],
    输出: 6
    解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
    初看题需要注意的点:这个最大和是连续的子数组。附加题:复杂度要求O(n)。
    思路一(复杂度为o(n^2),不完美):从第一个数开始,让它依次和后面的数值相加,例如:a,a+b,a+b+c,a+b+c+d……,下一个轮回是:b,b+c,b+c+d……,依次类推,每次加的时候都比较一下最大值,把最大的值保留下来。
    具体操作:
     1 class Solution {
     2     public int maxSubArray(int[] nums) {
     3            int sum=0;
     4             for(int i=0;i<nums.length;i++){
     5                 int tempsum=0;
     6                 for(int j=i;j<nums.length;j++){
     7                     tempsum+=nums[j];
     8                     if(tempsum>sum){ 
     9                         sum=tempsum;
    10                     }
    11                 }
    12            }
    13          if(sum==0){
    14              for(int i=0;i<nums.length;i++){
    15                  for(int j=i+1;j<nums.length;j++){
    16                      if(nums[i]>nums[j]){
    17                       int temp=nums[i];
    18                       nums[i]=nums[j];
    19                       nums[j]=temp;
    20                      }                                       
    21                  }
    22              }
    23                  int len=nums.length;
    24                  sum=nums[len-1];
    25                  return sum;
    26         }else{
    27               return sum;
    28          }      
    29     }
    30 }
    优化思路一的算法,达到同样的效果:
     1 class Solution {
     2     public int maxSubArray(int[] nums) {
     3         int sum=nums[0];
     4          for(int i=0;i<nums.length;i++){
     5               int tempsum=0;
     6                for(int j=i;j<nums.length;j++){
     7                    tempsum+=nums[j];
     8                    sum=Math.max(tempsum,sum);
     9                }
    10           }
    11         return sum;
    12     }
    13 }

    思路二(复杂度为O(n)):审题看到“最大和”这几个字,就要想,既然要 求最大,那得把每种可能性都算出来,不全算出来,程序怎么敢断言现在的就是最大的呢?所以呢,肯定要有遍历这种方法,其次,要找两个数,一个数来用存当前的最大值(用sum表示),另一个数用来存之前的最大值(用res表示),然后拿着这两个数进行比较,择其大者而留之(最终结果放在res中)。

     1 class Solution {
     2     public int maxSubArray(int[] nums) {
     3         int res = nums[0];
     4         int sum = 0;
     5         for (int num : nums) {
     6             if (sum > 0){
     7                 sum += num;
     8             }                
     9             else{
    10                sum = num; 
    11             }                
    12             res = Math.max(res, sum);
    13         }
    14         return res;
    15     }
    16 }

     



  • 相关阅读:
    CentOS下添加sudo用户
    CentOS查看你是否有USB 3.0端口
    CentOS查看操作系统信息(重要)
    JStack分析cpu消耗过高问题
    Java内存管理和垃圾回收
    kafka学习之-深入研究原理
    kafka学习之-文件存储机制
    kafka学习之-配置详解
    Hbase学习之javaApI封装
    linux中top命令
  • 原文地址:https://www.cnblogs.com/xiayanjiao/p/10246957.html
Copyright © 2011-2022 走看看