笔试算法题(26):顺时针打印矩阵 & 求数组中数对差的最大值
出题: 输入一个数字矩阵,要求从外向里顺时针打印每一个数字;
分析:
- 从外向里打印矩阵有多重方法实现,但最重要的是构建合适的状态机,这样才能控制多重不同的操作;
- 注意有四种打印模式(左右,上下,右左,下上),所以需要一个index变量控制每次循环时执行的打印模式;
- 注意水平打印和垂直打印分别需要两个变量控制打印元素,并且两组变量中的两个端点都是相互靠近的(hs和he,vs和he),每执行一种打印模式之前,需要更新当前打印模式中打印方向的其实坐标,因为它已经在上一种打印模式中打印过;
- 每一种打印模式执行之前需要检测hs>he或者vs>ve,如果成立则打印结束;
- 其他方法:递归法:每次都打印矩阵第一行,然后将剩余的元素逆时针旋转90度创建一个矩阵;贪吃蛇法:创建一个bool矩阵表示元素是否被打印,然后创建一个类似index的控制打印模式的变量,遇到false的元素就转到下一个打印模式;
解题:
/**
* 设置四个变量,两两一组分别表示水平和垂直方向的打印的起始点
* index表示四种打印方式中的一种(左右,上下,右左,下上)
* 当两两一组的变量中hs>he或者vs>ve的时候结束打印
* 注意每一种打印模式开始之前,需要更新起始点的坐标,因为
* 它已经在上一个打印模式中打印过
* */
void clockwisePrintMatrix(int *array, int x, int y) {
int hs=-, he=x-;
int vs=, ve=y-;
int index=; while(true) {
printf("hs=%d, he=%d, vs=%d, ve=%d\n",hs,he,vs,ve);
index%=;
if(index==) {
/**
* 左右打印模式:
*
* */
hs++;
if(hs>he) break;
for(int i=hs;i<=he;i++)
printf("%d, ",array[vs*x + i]);
printf("\n");
} else if(index==) {
/**
* 上下打印模式:
*
* */
vs++;
if(vs>ve) break;
for(int i=vs;i<=ve;i++)
printf("%d, ",array[i*y + he]);
printf("\n");
} else if(index==) {
/**
* 右左打印模式:
*
* */
he--;
if(hs>he) break;
for(int i=he;i>=hs;i--)
printf("%d, ",array[ve*x + i]);
printf("\n");
} else if(index==) {
/**
* 下上打印模式:
*
* */
ve--;
if(vs>ve) break;
for(int i=ve;i>=vs;i--)
printf("%d, ",array[i*y + hs]);
printf("\n");
}
index++;
}
} int main() {
int matrix[]={,,,,,,,,,,,,,,,,,,,,,,,,};
clockwisePrintMatrix(matrix, , );
return ;
}
出题:一个数组中,某一个数字减去它右边数字得到一个数对差,求所有数对差中的最大值;
分析:
- 数对差的解法可转换成求最大子数组和,或者转换成DP问题;
- 解法1:构建子数组最大和值
定义数
组:array[i]-array[i+1];array[i+1]-array[i+2];……;array[j-1]-array[j];所以
array[i]-array[j]的差就是前面所有相邻元素差的和,所以将原始数组转换成相邻元素的差组成的数组,而求原数组元素差的最大值转换成新数
组的子数组元素的最大和; - 解法2:动态规划解法:diff[i]存储array[i]与其左边数组最大元素的差值,得到diff[i]之后求diff[i+1],则需要知道 array[i+1]左边数组的最大元素,而有两种可能,计算diff[i]的时候得到的最大值,或者就是array[i]。所以只需一遍扫描就可以;
解题:
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 MaxDifDP(int *array, int length) {
/**
* difarray[i]用于存储array[i]左边的最大元素
* 与array[i]的差值,
* difarray[i+1]同理,但根据DP原理,左边的最大
* 元素可能是array[i]找到的最大元素,可能是
* array[i]本身,所以一遍扫描,DP复用
* */
int difarray[length-];
int max=array[];
for(int i=;i<length-;i++) {
if(array[i]>max)
max=array[i];
difarray[i]=max-array[i+];
}
int difmax=difarray[];
for(int i=;i<length-;i++) {
if(difarray[i]>difmax)
difmax=difarray[i];
}
return difmax;
}
int main() {
int array[]={,,,,-,,,};
printf("\nthe max diff is: %d",MaxDif(array,));
printf("\nthe max diff is: %d",MaxDifDP(array,));
return ;
}
笔试算法题(26):顺时针打印矩阵 & 求数组中数对差的最大值的更多相关文章
- php笔试算法题:顺时针打印矩阵坐标-蛇形算法
这几天参加面试,本来笔试比较简单,但是在面试的时候,技术面试官说让我现场写一个算法,顺时针打印矩阵的坐标,如图所示 顺序为,0,1,2,3,4,9,14,19,24,23,22,21,20,15,10 ...
- 《剑指offer》第二十九题(顺时针打印矩阵)
// 面试题29:顺时针打印矩阵 // 题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. #include <iostream> void PrintMatrixInC ...
- 《github一天一道算法题》:分治法求数组最大连续子序列和
看书.思考.写代码. /*************************************** * copyright@hustyangju * blog: http://blog.csdn. ...
- 笔试算法题(40):后缀数组 & 后缀树(Suffix Array & Suffix Tree)
议题:后缀数组(Suffix Array) 分析: 后缀树和后缀数组都是处理字符串的有效工具,前者较为常见,但后者更容易编程实现,空间耗用更少:后缀数组可用于解决最长公共子串问题,多模式匹配问题,最长 ...
- 剑指 Offer 29. 顺时针打印矩阵 + 蛇形矩阵 + 模拟 + 思维题
剑指 Offer 29. 顺时针打印矩阵 Offer_29 题目描述: 题解分析: 题目的初衷是将这道题当做一个简单题处理 这道题一开始想的太复杂了,其实可以参考迷宫广度优先搜索的过程,只不过在选定一 ...
- [PHP] 算法-顺时针打印矩阵的PHP实现
1.行数和列数取出来row,col,圈数就是 (较小值-1)/2+1 2.外层循环控制圈数,内层四个for循环,i 3.第一个for循环,从左到右,j=i;j<col-i;j++;j<; ...
- 【剑指offer】顺时针打印矩阵
转载请注明出处:http://blog.csdn.net/ns_code/article/details/26053049 剑指offer上的第20题,九度OJ上測试通过. 题目描写叙述: 输入一个矩 ...
- 剑指Offer(十九):顺时针打印矩阵
剑指Offer(十九):顺时针打印矩阵 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baid ...
- 剑指offer---1、顺时针打印矩阵
剑指offer---1.顺时针打印矩阵 一.总结 一句话总结: 谋而后动+多做:还是要谋而后动,但是怎么谋而后动,很有学问,做好的方式就是多做 问题就这些问题:解决了就好了,比如php多维数组 面试的 ...
随机推荐
- log4j没有作用,druid的日志信息还打印在控制台的解决办法
log4j没有实现类,需引入slf4j实现
- linux上用mplayer播放264文件
Linux上,264视频裸码流可用mplayer进行播放. 同时,可用-fps参数控制帧率. 参考:http://www.chinavideo.org/archiver/?tid-16088.html
- E20180218-hm-xa
更新: 2019/02/19 原来忘记分类,把此博文归入单词类 vocabulary n. (某一语言的) 词汇; (尤指外语教科书中附有释义的) 词汇表; grammar n. 语法; 语法书; ...
- spoj 839 OPTM - Optimal Marks&&bzoj 2400【最小割】
因为是异或运算,所以考虑对每一位操作.对于所有已知mark的点,mark的当前位为1则连接(s,i,inf),否则连(i,t,inf),然后其他的边按照原图连(u,v,1),(v,u,1),跑最大流求 ...
- 《Google软件测试之道》心得笔记1
Google软件测试介绍 把开发和测试融合在一起——开发和测试必须同时展开 开发人员自己要对自己写的代码负责,比专职的测试人员更适合做测试工作. 测试开发工程师SET 对于Google拥有很少量的测试 ...
- 转】MYSQL性能调优与架构设计之select count(*)的思考
原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/5/ 感谢! Posted: Feb 7, 2013 Tag ...
- Radis
http://www.redis.cn/ http://try.redis.io/ http://www.redisdoc.com/en/latest/ Redis 命令参考¶ 本文档是 Redis ...
- 微信打开网址添加在浏览器中打开提示 http://caibaojian.com/weixin-tip.html
原文链接:http://caibaojian.com/weixin-tip.html#t2 使用微信打开网址时,无法在微信内打开常用下载软件,手机APP等.网上流传的各种微信打开下载链接,微信已更新基 ...
- WPF学习08:MVVM 预备知识之COMMAND
WPF内建的COMMAND是GOF 提出的23种设计模式中,命令模式的实现. 本文是WPF学习07:MVVM 预备知识之数据绑定的后续,将说明实现COMMAND的三个重点:ICommand Comm ...
- AJPFX关于多态的应用
要求设计一个方法,要求此方法可以接受A类的任意子类对象,并调用方法,此时,如果不使用对象多态性,那代码肯定会类似如下 class A{ // 定义类A publi ...