笔试算法题(06):最大连续子数组和 & 二叉树路径和值
出题:预先输入一个整型数组,数组中有正数也有负数;数组中连续一个或者多个整数组成一个子数组,每个子数组有一个和;求所有子数组中和的最大值,要求时间复杂度O(n);
分析:
- 时间复杂度为线性表明只允许一遍扫描,当然如果最终的最大值为0表明所有元素都是负数,可以用线性时间O(N)查找最大的元素。具体算法策略请见代码和注释;
- 子数组的起始元素肯定是非负数,如果添加的元素为正数则记录最大和值并且继续添加;如果添加的元素为负数,则判断新的和是否大于0,如果小于0则以下一个元素作为起始元素重新开始,如果大于0并且比最大和值小则不更新最大和值,并且继续添加元素;
- 当然还有分治的解法,将数组分成A和B两个部分,则子数组最大和有三种可能,来自A,来自B和来自A和B的跨界处,时间复杂度为O(NlogN);
- 如果数组为循环数组,则说明子数组最大和允许出现在array[n-1]和array[0]作为一部分的组合。这样题目分解为两个子题目,一个子题目就是 目标值没有跨过array[n-1]和array[0],其实也就是原来的题目;另一个子题目就是目标值为array[i]到array[n-1]和 array[0]到array[j]的组合,时间复杂度仍旧为O(N);
解题:
/**
* 子数组累加和必定是从非负数的元素开始
* 如果子数组和小于0则缺省最大值为0
* */
int MaxSubArray(int *array, int count) {
int max=;
int curMax=;
for(int i=;i<count;i++) {
curMax+=array[i];
/**
* 跳过负数元素,所以目标子数组必定以非负数元素开始
* */
if(curMax < ) {
curMax=;
continue;
}
/**
* 一旦遇到负数元素,除当前负数元素的其他元素的和作为
* 最大值;由于不能保证之后的元素不会让子数组和变得更大
* ,所以累加继续
* */
if(array[i]<) {
if(max<(curMax-array[i])) {
max=curMax-array[i];
}
} else {
if(max<curMax) {
max=curMax;
}
}
}
return max;
} int MaxDif(int *array, int length) {
/**
* 定义局部stack数组存储相邻元素差值
* 循环获取相邻元素差值
* */
int difarray[length-];
for(int i=;i<length-;i++) {
difarray[i]=array[i]-array[i+];
printf("\n%d",difarray[i]);
}
/**
* sum记录最大和值
* tempsum记录当前元素的和值
* 如果元素为+++++++,则从开始相加到最后
* 如果元素为-------,则sum保持为0
* 如果元素为++++---,则sum保持为前半正数
* 如果元素为----+++,则sum保持为后半正数
* 还有其他满足条件的情况
* */
int tempsum=, sum=;
for(int i=;i<length-;i++) {
tempsum+=difarray[i];
if(tempsum<)
tempsum=;
else if(tempsum>sum)
sum=tempsum;
}
return sum;
} int main() {
int array[]={,-,,,-,-,-};
printf("the max sub array sum: %d",MaxSubArray(array,));
return ;
}
出题:输入一个整数和一颗二元树(节点值为整数),从树的根节点开始往下访问每一个节点,直到叶子节点最终形成一条路径。打印出所有节点和与整数值相等路径;
分析:深度优先搜索,使用Stack结构记录路径;
解题:
/**
* 使用path记录路径
* */
void SpecialDfs(Node *current, MyStack *path, int sum, int target) {
path->push(current->value);
sum+=current->value;
bool isLeaf=true; if(current->left != NULL) {
SpecialDfs(current->left, path, sum, target);
isLeaf=false;
} if(current->right != NULL) {
SpecialDfs(current->right, path, sum, target);
isLeaf=false;
} if(isLeaf && sum == target) {
path->showStack();
}
path->pop(NULL);
}
笔试算法题(06):最大连续子数组和 & 二叉树路径和值的更多相关文章
- 算法笔记_043:最大连续子数组和(Java)
目录 1 问题描述 2 解决方案 2.1 蛮力枚举法 2.2 动态规划法 1 问题描述 给定一个整数数组,数组里可能有正数.负数和零.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和 ...
- 【IT笔试面试题整理】连续子数组的最大和
[试题描述]输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组. 求所有子数组的和的最大值.要求时间复杂度O(n). 思路:当我们加上一个正数时,和会增加:当我们加上一个 ...
- php算法题---连续子数组的最大和
php算法题---连续子数组的最大和 一.总结 一句话总结: 重要:一定要本机调试过了再提交代码,因为很容易出现考虑不周的情况,或者修改了之后没有考虑修改的这部分 利用空间来换时间,或者利用空间来换算 ...
- Demo003 最大连续子数组问题(《算法导论》4.1-5)
问题 问题描述 给定n个整数(可能为负数)组成的数组,要求一个数组连续下标和的最大值,数组的元素可正.可负.可为零. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的 ...
- 刷题-力扣-剑指 Offer 42. 连续子数组的最大和
剑指 Offer 42. 连续子数组的最大和 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/lian-xu-zi-shu-zu-de ...
- 编程算法 - 连续子数组的最大和 代码(C)
连续子数组的最大和 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一个整型数组, 数组里有正数也有负数. 数组中一个或连续的多个整数组成一 ...
- 《剑指offer》第四十二题(连续子数组的最大和)
// 面试题42:连续子数组的最大和 // 题目:输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整 // 数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n). #in ...
- 每日一题 - 剑指 Offer 42. 连续子数组的最大和
题目信息 时间: 2019-06-30 题目链接:Leetcode tag: 动态规划 难易程度:简单 题目描述: 输入一个整型数组,数组里有正数也有负数.数组中的一个或连续多个整数组成一个子数组.求 ...
- 个人实战演练全过程——No.1 最大连续子数组求和
之前的一次个人总结和一次单元测试入门学习是开启软件工程课程的前奏曲,也是热身,现在大家对于这门课程也有了初步的了解和认识,这次要开始真正的演奏了,要从头到尾完全靠自己的能力来解决一个问题,进行实战演练 ...
随机推荐
- ionic2 angular2 模板指令补充
向div中插入带有html标签的数据 [innerHTML]="item.content" 字符串截取指令 {{item.de ...
- mac下安装ngnix以及开启关闭重启
一.安装 执行如下命令 brew search nginx brew install nginx 安装完以后,可以在终端输出的信息里看到一些配置路径: /usr/local/etc/nginx/ngi ...
- [Swift]编程语言:文档修订历史
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- RabbitMQ学习之HelloWorld(1)
RabbitMQ就是一个消息代理(message broker),可以用来接收和发送消息. 消息队列有一些黑话,我们来看下: Producer : 发送message的程序 Queue : 可以用来存 ...
- spring 获取配置文件的值
Spring 获取配置文件的值 package com.hafiz.www.util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; ...
- Python函数缓存
函数缓存 (Function caching) 函数缓存允许我们将一个函数对于给定参数的返回值缓存起来.当一个I/O密集的函数被频繁使用相同的参数调用的时候,函数缓存可以节约时间.在Python 3. ...
- mysql主从同步异常原因及恢复
mysql主从同步异常原因及恢复 前言 mysql数据库做主从复制,不仅可以为数据库的数据做实时备份,保证数据的完整性,还能做为读写分离,提升数据库的整体性能.但是,mysql主从复制经常会因为某些原 ...
- CMake学习笔记三:cmake 常用指令
1 基本指令 1,ADD_DEFINITIONS 向 C/C++编译器添加-D 定义,比如: DD_DEFINITIONS(-DENABLE_DEBUG -DABC),参数之间用空格分割. 如果你的代 ...
- Kruskal算法 分类: c/c++ 算法 2014-10-01 17:09 540人阅读 评论(0) 收藏
Kruskal算法计算最小生成树,只与边有关,时间复杂度O(eloge) 步骤: 1.将边按权值递增排序 2.依次取出边加入最小生成树中并保证无环,判断是否成环可利用并查集. 例:http://ac. ...
- 转 ORA-00054 的解决方法
统有一个不用的索引,想删除这个索引, SQL> drop index GPSTIME_GLOBAL_INDEX 2 /drop index GPSTIME_GLOBAL_INDEX ...