微软等公司数据结构面试题3

原创 2011年01月19日 00:01:00

 

3.求子数组的最大和(数组)
题目:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。

例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,
因此输出为该子数组的和18。


 

#include <iostream>

 

class Array

{

public:

Array(int a[],int length):m_array(a),m_length(length) {}

void Findbest();

void Print();

private:

int  *m_array;

int m_left;

int m_right;

int m_length;

int m_nearLeft;

int m_nearRight;

int m_max;

int m_nearMax;

};

void Array::Findbest()

{

m_left = 0;

m_right = -1;

m_nearLeft = 0;

m_nearRight = -1;

m_max = m_nearMax = 0 ;

for (int i = 0 ; i < m_length ; i++ )

{

if ( m_array[i] >= 0  ) {

if ( m_nearRight + 1 == i ) {

m_nearMax += m_array[i] ;

m_nearRight = i ;

else {

m_nearLeft = m_nearRight = i;

m_nearMax = m_array[i] ;

}  // else if  ( m_nearRight +1 == i )

if (m_right + 1 == i) {

m_right = i;

m_max += m_array[i];

}

else {

if ( m_max < m_nearMax ) {

m_max = m_nearMax ;

m_left = m_nearLeft ;

m_right = m_nearRight ;

}

} //else if (m_right +1 == i)

}  //end if ( m_array[i] >= 0  ) 

else {

if ( m_nearRight + 1 == i && m_nearMax + m_array[i] > 0 ) {

m_nearMax += m_array[i] ;

m_nearRight = i ;

}

else {

m_nearLeft = m_nearRight = 0;

}

}  

}  //end of for

 

 

}

 

void Array::Print()

{

std::cout<<"left="<<m_left+1<<"  right="<<m_right+1<<std::endl;

std::cout<<"Total is "<<m_max<<std::endl;

for(int i = m_left ; i <=m_right ; i++ ) {

std::cout<<m_array[i]<<" ";

}

std::cout<<std::endl;

}

 

int main()

{

int t[]={-1,-2,3,10,-4,7,2,-5};

Array a(t,8);

a.Findbest();

a.Print();

getchar();

return 0;

}

 

 

 

利用动态规划的思想:

当前a[i]的最大子数组等于 a[i-1]的最大子数组 + a[i]   a[i]>=0  a[i-1]的最大子数组右值下标为i-1

                                    max (a[i-1]的最大子数组  or a[i]最靠近右边大于零的子数组)  a[i]>=0 a[i-1]的最大子数组右值下标不为i-1

 

 

当 a[i] <0 时 仅需要对  a[i]最靠近右边大于零的子数组 进行处理即可:

当    a[i-1]最靠近右边大于零的子数组 + a[i] >= 0 时 子数组增加

否则对子数组清空     

 

 

上面的思路比较复杂 下面的判断简化,只需要用最近的记录的和和以前的最大值比较,如果记录的最近的和小于0,则重新记录

 

 

#include <iostream>

 

class Array

{

public:

Array(int a[],int length):m_array(a),m_length(length) {}

void Findbest();

void Print();

private:

int  *m_array;

int m_left;

int m_right;

int m_length;

int m_nearLeft;

int m_nearRight;

int m_max;

int m_nearMax;

};

void Array::Findbest()

{

m_left = 0;

m_right = -1;

m_nearLeft = 0;

m_nearRight = -1;

m_max = m_nearMax = 0 ;

for (int i = 0 ; i < m_length ; i++ )

{

 

m_nearMax += m_array[i];

m_nearRight++;

 

if (m_nearMax > 0)

{

 

if ( m_nearMax > m_max)

{

m_max = m_nearMax;

m_left = m_nearLeft;

m_right = m_nearRight;

}

 

}

else

{

m_nearMax = 0;

m_nearLeft =  i + 1 ;

m_nearRight = i;

}

 

}  //end of for

 

 

}

 

 

 

void Array::Print()

{

std::cout<<"left="<<m_left+1<<"  right="<<m_right+1<<std::endl;

std::cout<<"Total is "<<m_max<<std::endl;

for(int i = m_left ; i <=m_right ; i++ ) {

std::cout<<m_array[i]<<" ";

}

std::cout<<std::endl;

}

 

 

 

int main()

{

int t[]={-1,-2,3,10,-4,7,2,-5};

Array a(t,8);

a.Findbest();

a.Print();

getchar();

return 0;

}

 

微软等数据结构+算法面试100题全部答案集锦

微软等数据结构+算法面试100题全部答案集锦 作者:July、阿财。 时间:二零一一年十月十三日。 引言      无私分享造就开源的辉煌。      今是二零一一年十月十三...
  • GarfieldEr007
  • GarfieldEr007
  • 2015年10月06日 14:04
  • 5623

为什么很多大公司都面试算法和数据结构

参加过大公司的招聘,尤其是校园招聘的同学,很容易发现:很多大公司,都喜欢面试算法和数据结构。   以前,我对这个问题有点思考。最近,有个小雷粉,特意问到了这个问题。so,简单说几句,吐槽乐一乐。...
  • u014646358
  • u014646358
  • 2014年12月24日 22:50
  • 26914

微软等公司算法+数据结构面试100题

微软、百度等公司100题系列。 1.把二元查找树转变成排序的双向链表(树)  题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只...
  • dreamrealised
  • dreamrealised
  • 2013年06月30日 16:44
  • 1231

微软百度腾讯等公司面试题和经典数据结构算法归总 chm

  • 2014年03月07日 11:00
  • 25.89MB
  • 下载

众多名企(华为_阿卡_TCL_索尼_微软_百度_大唐)笔试面试题(C居多含C++及数据结构)改.doc

  • 2013年07月14日 21:12
  • 149KB
  • 下载

JAVA答案整理---->微软等公司数据结构、算法面试笔试题(v_JULY_v博主发布)

1.把二元查找树转变成排序的双向链表 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。     10    /     \ ...
  • SONG10101128
  • SONG10101128
  • 2013年06月27日 16:32
  • 952

经典面试题(四)附答案 算法+数据结构+代码 微软Microsoft、谷歌Google、百度、腾讯

from: http://blog.csdn.net/sj13051180/article/details/6765603 1金币概率问题(威盛笔试题) 题目:个房间里放着随机...
  • fivedoumi
  • fivedoumi
  • 2012年09月10日 00:37
  • 2259

经典面试题(三)附答案 算法+数据结构+代码 微软Microsoft、谷歌Google、百度、腾讯

1.判断单链表是否有环,要求空间尽量少(2011年MTK) 如何找出环的连接点在哪里? 如何知道环的长度?   很经典的题目。 1.判断是否有环。使用两个指针。一个每次前进1,另一个每次前进...
  • Jody1989
  • Jody1989
  • 2011年10月17日 17:10
  • 767

数据结构-从归并排序到数组的逆序对数(微软面试题)

归并排序 归并排序 与快速排序算法一样,归并排序也是基于分治法的。 就是将待排序的序列分成两个长度相同的序列,然后再对两个子序列拆分,一直到只剩下一个元素的子序列,为每个子序列排序,然后再将它们合...
  • qq_34312386
  • qq_34312386
  • 2017年03月13日 00:03
  • 572

经典面试题(一)附答案 算法+数据结构+代码 微软Microsoft、谷歌Google、百度、腾讯

from:http://blog.csdn.net/sj13051180/article/details/6727318 1.        有一个整数数组,请求出两两之差绝...
  • fivedoumi
  • fivedoumi
  • 2012年09月10日 00:34
  • 2050
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:微软等公司数据结构面试题3
举报原因:
原因补充:

(最多只允许输入30个字)