[mock]8月8日
第一题是整数的方阵,求其中的子方阵,和最大。返回最大和以及子方阵宽度。因为做了topcoder的题,所以比较顺手,O(n^3)的复杂度。
pair<int,int> maxiSum(vector<vector<int> > &a) { //first is n second is sum
int N = a.size();
int retVal = INT_MIN;
int n = 1;
// fix two columns, i, j
for (int i = 0; i < N; i++) {
vector<int> sum(N);
for (int j = i; j < N; j++) {
// calc the sum per line
for (int k = 0; k < N; k++) {
sum[k] = sum[k] + a[k][j];
}
// calc the sum of the squere with i, j
int tmpSum = 0;
int w = j - i;
for (int m = 0; m < N; m++) {
if (m < w) {
tmpSum += sum[m];
} else if (m == w) {
tmpSum += sum[m];
if (tmpSum > retVal) {
retVal = tmpSum;
n = w + 1;
}
} else {
tmpSum += sum[m];
tmpSum -= sum[m - w - 1];
if (tmpSum > retVal) {
retVal = tmpSum;
n = w + 1;
}
}
}
}
}
return make_pair(n, retVal);
}
第二题,是有个0和1的矩阵,求里面每个位置到最近的0的距离(类似曼哈顿距离)。这个题一开始想动态规划什么的,都不合适,比较像洪泛,但如果从每个0或1出发,就效率很低,n^4和完全枚举是一样的。后来想到和之前topcoder的一道题挺像,可以先把0全部放到queue里面,然后逐步往外扩,便可求得。
void make(vector<vector<int> > &matrix) {
int N = matrix.size();
vector<vector<int> > dist;
vector<vector<bool> > visited;
dist.resize(N);
visited.resize(N);
for (int i = 0; i < N; i++) {
dist[i].resize(N);
visited[i].resize(N);
}
queue<pair<int, int> > que;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (matrix[i][j] == 0) {
dist[i][j] = 0;
visited[i][j] = true;
que.push(make_pair(i, j));
}
}
}
while (!que.empty()) {
pair<int, int> pp = que.front();
que.pop();
if (valid(pp.first - 1, pp.second, visited)) {
dist[pp.first - 1][pp.second] = dist[pp.first][pp.second] + 1;
que.push(make_pair(pp.first - 1, pp.second));
visited[][] = true;
}
if (valid(pp.first, pp.second - 1, visited)) {
}
if (valid(pp.first + 1, pp.second, visited)) {
}
if (valid(pp.first, pp.second + 1, visited)) {
}
}
// copy to matrix
matrix = dist;
}
bool valid(int i, int j, vector<vector<bool> > & visited) {
// return whether we need to process this elem
int N = visited.size();
if (i < 0 || j < 0 || i >= N || j >= N || visited[i][j]) {
return false;
}
return true;
}
遍历四个方向的代码其实应该更精简,类似如下:
dx[] = {-1,0,1,0}
dy[] = {0,1,0,-1}
x + dx[i]
y + dy[i]
第三题当时没有想出来,是求一个数组中子段和的绝对值最小值。比如如下数组,就是1+2+ -3的绝对值最小。
{1,2,-3,-100,3}
这个题目很自然会想到去用最大子段和的做法,但是(应该)不能类似动态规划降到O(n)。关键是,不满足最优子问题的特性。比如该数组中前三个元素的最优解是0,前两个元素的最优解是2,0没有用到之前最优解地方。
那么正确的做法是可以记录之前的前缀和,然后排序,就可以求得了。因为:|sum[i..j]| = |p[j] - p[i - 1]|,p是前缀和,那么排完序后,相邻的两个就能求得绝对值最小,只是要注意,i从0开始,那么p[-1]就是不包括0的情况,就是0,要在前缀和数组里加一个0.
本题的前缀和数组排序完了就是如下,里面两个0,一个开始之前p[-1],一个p[2],就能求出sum[0..2]=0,绝对值最小。
{-97, -94, 0, 0, 1, 3}
[mock]8月8日的更多相关文章
- [mock]10月11日
第二次mock.出的题是,假设有一个地区不能使用7,都用之后的数字代替,比如8代表7,18代表16(中间有7和17).那么给出一个这个地区的数X,求普通地区的数Y.首先是找规律,发现其实就是找给出的数 ...
- [mock]10月4日
第一次mock,CollabEdit开一个页面,开始做题.题目是,有方法pow(m,n),m和n都大于1,给出N,有顺序的打印出前N个pow(m,n)的结果.前一个是:4,8,9,16,... 然后在 ...
- [mock]7月25日
1. 将一个数组分成左右两部分,使得右边的某个连续子段和减去左边的某个连续字段和最小[7,8,9,|3,5,-1] sum right - sum left minimal 想到左右分一刀,O(n), ...
- [mock]12月27日
一开始介绍项目,最后的反馈是,还是说得不清楚,需要再准备准备. 然后两道题,第一题是有个数组,有2*n个数字,从1~n.比如n=3的数组,{1,2,2,3,1,3}.然后两两相同的数字删除,每次删除得 ...
- [mock]12月28日
假设我们有一个全局升序数组,这个数组长度unlimited现在我们有一个全局的指针和一个目标target值,target和指针你不可见.但是有以下几个操作bool istag();void gorig ...
- [mock]12月11日
给出一个二叉搜索树的先序遍历,要求重新构造出这个二叉搜索树.一开始给出了一个递归的算法,指出复杂度有更优的解法.然后想出来一个O(n)的算法,就是使用一个栈,然后依次判断新的节点比原来的大还是小,然后 ...
- 19.go语言基础学习(下)——2019年12月16日
2019年12月16日16:57:04 5.接口 2019年11月01日15:56:09 5.1 duck typing 1. 2. 接口 3.介绍 Go 语言的接口设计是非侵入式的,接口编写者无须知 ...
- 猖獗的假新闻:2017年1月1日起iOS的APP必须使用HTTPS
一.假新闻如此猖獗 刚才一位老同事 打电话问:我们公司还是用的HTTP,马上就到2017年了,提交AppStore会被拒绝,怎么办? 公司里已经有很多人问过这个问题,回答一下: HTTP还是可以正常提 ...
- 张小龙宣布微信小程序1月9日发布,并回答了大家最关心的8个问题
2016 年 12 月 28 日,张小龙在微信公开课 PRO 版的会场上,宣布了微信小程序的正式发布时间. 微信小程序将于 2017 年 1 月 9 号正式上线. 同时他解释称,小程序就像PC时代的网 ...
随机推荐
- 【Qt】Qt之设置QWidget背景色【转】
简述 QWidget是所有用户界面对象的基类,这意味着可以用同样的方法为其它子类控件改变背景颜色. Qt中窗口背景的设置,下面介绍三种方法. 使用QPalette 使用Style Sheet 绘图事件 ...
- silverlight将字符串转化为控件
silverlight的System.Windows.Markup命名空间下,提供了XamlReader.Load()方法可以将字符串转换为控件. 代码 StringBuilder sbGrid = ...
- SQL Server 2008中新增的变更数据捕获(CDC)和更改跟踪
来源:http://www.cnblogs.com/downmoon/archive/2012/04/10/2439462.html 本文主要介绍SQL Server中记录数据变更的四个方法:触发器 ...
- Windows下关于Composer使用时出现的问题及解决办法
问题一: Fatal error: Call to undefined method Composer\Package\CompletePackage::getTrans portOptions() ...
- 生动有趣的动画Toast--第三方开源--NiftyNotification
NiftyNotification在github上的项目主页是:https://github.com/sd6352051/NiftyNotificationNiftyNotification本身又依赖 ...
- 查找指定表的字段not null约束,并生成删除Sql
SElECT 'ALTER TABLE '+OBJECT_NAME(c.parent_obj)+' DROP CONSTRAINT '+ c.name FROM sys.sysconstraints ...
- c语言调试开关
上一篇转载的没看懂,参考别人的代码,自己又琢磨了一个调试技巧,挺好用,姑且就叫调试开关吧,欢迎指正!!! /*功能:调试开关 *描述:if条件成立,则打印调试信息,否则不打印() * */ #incl ...
- 【python】网络爬虫抓取图片
利用python抓取网络图片的步骤: 1.根据给定的网址获取网页源代码 2.利用正则表达式把源代码中的图片地址过滤出来 3.根据过滤出来的图片地址下载网络图片 今天我们用http://www.umei ...
- Java中List和ArrayList的区别
List:是一个有序的集合,可以包含重复的元素.提供了按索引访问的方式.它继承 Collection.List有两个重要的实现类:ArrayList 和 LinkedListArrayList:我们可 ...
- 环信ipv6适配
环信2.2.5及之后版本才适配了ipv6.可以自己搭配个ipv6环境,在ipv6环境下2.2.5以下版本无法登录.把整个sdk换成2.2.5版本项目需要改动的地方实在太多. 那么就部分换一下,适配ip ...