求数组最大平均值的连续子序列、最大和的连续子序列

算法是我最头疼的问题,经常被问到就懵逼,但是后来一想就能想起来,也是没那么能难,人啊就是要多总结,人类的进步就是因为人把知识记载了下来,后来的人有了前人的经验教训,总会成长,慢慢成长。在岁月的长河中,知识达到了沉淀,孕育了很多伟大的民族文化。。。

实在编不下去了,赶紧进入正题,同学啊,在你看到题目的时候也是一脸懵逼,如果是的话,那就对了,证明你没看过类似的算法,看到题目有种似懂非懂的感觉,光是理解题目就是很费劲,没错,因为这个题就是考的脑筋急转弯?啥,不明白啊,等我说完你就知道了。。。

还在扯什么啊,怎么还不进入正题呢?很多人肯定要骂我了,其实 我是留给大家思考的时间,因为大家再看这段废话的时候大脑却在想着我的问题,为什么我·会这么说,哈哈 我看过最强大脑,去年这个的时候,我因为最强大脑,花了一个月的时间专门去训练了记忆力,你还别说,还真有效果。我先练习的定桩,110数字桩,懂的同学知道我在说什么,不懂的同学我也不会在这说了,给你个传送门,好吧开始进入正题吧。

package zong.xiao.mi.demosource.java;

/**
 * Created by mi on 2017/4/5.
 */

public class 最大平均值的连续子序列 {


  public static int[] array = {-2, 3, -5, 4, 1, -1, 2};

  public static void main(String[] arguments) {
    maxAverage(array);
    maxSum(array);
  }



  /**
   * 求数组的最大平均值的连续子序列(连续子序列:元素个数大于等于2)
   * 
   * @return
   */
  public static int[] maxAverage(int[] array) {

    int length = array.length;
    int sum;
    float currentAvg = 0;// 当前的平均值
    int markI = 0;// 标记连续子序列的起始下标
    int markJ = 0;// 标记连续子序列的结束下标
    for (int i = 0; i < length; i++) {
      sum = 0;// 重置sum
      for (int j = i; j < length; j++) {
        sum = sum + array[j];// 累积求和
        float avg = (float) sum / (j - i + 1);
        if (avg > currentAvg && i != j) {// 如果起始下标等于结束下标,就是表明是单个元素,此块要排除
          markJ = j;
          markI = i;
          currentAvg = avg;
        }
      }
    }
    int arr[] = new int[markJ - markI + 1];
    System.arraycopy(array, markI, arr, 0, markJ - markI + 1);

    System.out.println("最大平均值==" + currentAvg + "-在数组中的起始位置==" + markI + "-数组中的结束位置==" + markJ);
    return arr;
  }

  /**
   * 最大和的连续子序列
   * 时间复杂度O(N^2)
   * @param array
   * @return
   */
  public static int[] maxSum(int array[]) {
    if (array == null || array.length == 0) return null;
    int length = array.length;
    int sum = 0;
    int currentSum = 0;
    int markStart = 0;
    int markEnd = 0;

    for (int i = 0; i < length; i++) {
      sum = 0;
      for (int j = i; j < length; j++) {
        sum += array[j];
        if (sum > currentSum) {
          markStart = i;
          markEnd = j;
          currentSum = sum;
        }
      }
    }
    int[] copy = new int[markEnd - markStart + 1];
    System.arraycopy(array, markStart, copy, 0, markEnd - markStart + 1);
    System.out
        .println("最大和==" + currentSum + "-在数组中的起始位置==" + markStart + "-数组中的结束位置==" + markEnd);
    return copy;
  }
}



多么简单粗暴,代码自己看吧,注释都在上面。
补充求和的第二种方法,性能更优。

/**
   * 最大和的连续子序列第二种方法
   *
   * 时间复杂度O(N)
   * 
   * @param array
   * @return
   */
  public static int[] maxSum2(int array[]) {

    int temp = 0;
    int currentMax = 0;
    int length = array.length;
    int start = 0;// 标记开始位置
    int end = 0;// 标记结束位置

    for (int i = 0; i < length; i++) {
      if (temp + array[i] > 0) {
        temp = temp + array[i];
      } else {
        temp = 0;
        start = i + 1;
      }

      if (temp > currentMax) {
        end = i;
        currentMax = temp;
      }
    }
    System.out.println(currentMax + "start==" + start + "end==" + end);
    return null;
  }

第二个算法的时间复杂度最好,只用了一遍遍历

说个注意的点,什么是连续子序列,我认为啊这个连续子序列的元素的个数要大于两个才能算连续子序列。如果没有这个限制会怎么样?
如果没有这个限制,上边数组中的最大连续子序列 我不用算就知道是4 ,我不相信哪个子序列的平均值会大于4,为什么,因为任何一个数,加上比自己小的数,再求平均值,肯定没有这个数大。如果有这个限制,那就从所有含有两个元素的子序列里面找。因为三个数的平均值肯定没有两个的数的平均值大。如果这几个元素都是一样大小值的 你就别给我扯淡了。。

最大平均值的连续子序列: 求出数组所有的连续子序列,对每个连续子序列求平均值,找最大的一个。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,049评论 25 707
  • 题目描述 给定n个数的数组,找到所有长度大于等于k的连续子数组中平均值最大的那个。返回那个最大的平均值。 1 <=...
    HITMiner阅读 3,955评论 0 1
  • +++++++++
    牧童遥指2000阅读 1,101评论 0 2
  • 前言 其实读完斯坦福的这本《互联网大规模数据挖掘》,让我感觉到,什么是人工智能?人工智能就是更高层次的数据挖掘。机...
    我偏笑_NSNirvana阅读 12,397评论 1 23
  • 像我这样懒散,且又没有责任感的人,最大的愿望,便是不用工作,也不用理会俗世的那些繁文礼节,每天只是把自己收拾的干干...
    成誠师兄阅读 185评论 0 0