笔试算法题(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多维数组 面试的 ...
随机推荐
- 关于zookeeper的集群搭建
在所有机器上安装完zookeeper之后, 开始进行集群的搭建 1. 修改 ../zookeeper/conf/zoo.cfg 文件 tickTime=2000 dataDir=/usr/local/ ...
- .NET修改配置文件
首先说明,本文参考了这个帖子http://www.cnblogs.com/henw/archive/2012/01/31/2333783.html,进行了一些补充 简要说来两种方法,一是把config ...
- JS计算字符串实际长度
http://www.qttc.net/201207136.html // UTF8字符集实际长度计算 function getStrLeng(str){ var realLength = 0; va ...
- J20170524-hm
取りこぼし 意外地输给较自己实力弱的对手,爆出冷门,败给手下败将 振り分け 分配,整理 スキーマ 图解.模式.图式
- 景女神与她的托福(BFS+状压)
景女神与她的托福 Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other) Total Submis ...
- HDU3092:Least common multiple(素数筛选+完全背包)
题意 给出\(n\)和\(m\),将\(n\)拆成任意个数,求它们的最大的\(lcm\) 分析 1.可以证明\(n=p1^{s1}*p2^{s2}*...*pn^{sn}\)时\(lcm\)最大(其中 ...
- python 匿名函数 lambda
一.lambda使用语法: 关键字lambda表示匿名函数,冒号前面的x表示函数参数,冒号后面只能有一个表达式,不用写return,返回值就是该表达式的结果. >>> list(ma ...
- BZOJ 1001 [BeiJing2006]狼抓兔子 (UVA 1376 Animal Run)
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 24727 Solved: 6276[Submit][ ...
- 【SpringCloud构建微服务系列】学习断路器Hystrix
一.Hystrix简介 在微服务架构中经常包括多个服务层,比如A为B提供服务,B为C和D提供服务,如果A出故障了就会导致B也不可用,最终导致C和D也不可用,这就形成了雪崩效应. 所以为了应对这种情况, ...
- CMake学习笔记一:初识cmake
1 cmake简介 1.1 背景知识 cmake 是 kitware 公司以及一些开源开发者在开发几个工具套件(VTK)的过程中衍生品,最终形成体系,成为一个独立的开放源代码项目.项目的诞生时间是 2 ...