1、【二维有序数组查找】
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
方案肯定是要用O(n)级别的,如果是O(N^2),那么还就是暴力破解。这样根本就没有利用到题目的性质====》二维有序数组,所以还是老老实实想O(N)的算法吧!
即存在数组满足以下规律: ------> | | | ↓ 问怎么如何快速找到其中的一个元素?
存在问题:问题来了,如果从(0,0)出发,那么问题肯定是极度恶心的,因为根本不知道下一次是往下走还是往右边走。。。因为【两个方向都是增加的】
发现问题:这时候我们得知了问题点在于【从(0,0)出发,会使得无论往右还是往下都是增加。】那么是否存在某个点使得【一个方向增加一个方向减少】?
解决问题:使用(0,n-1)点或者(n-1,0)点,会发现一个方向是增加,一个方向是减少。如果值小了,那么就往增加方向查找,如果值大了,就往减少方向减少。这时候代码就十分的轻而易举写出来了。
代码:
bool Find(int target, vector<vector<int> > array) { int row = array.size(); int col = array[0].size(); for (int i = 0,j = col - 1; i < row && j >= 0;) { if (array[i][j] == target) { return true; } if (array[i][j] < target) { ++i; } else { --j; } } return false; }
2、【替换空格】
题目:请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
前提:传入的空间是长度足够大的。不然这题就没有啥意义了,简单的计算要申请多少内存,然后申请好了内存,从左到右慢慢拷贝就行了,时间复杂度和空间复杂度都是O(n)。
只有在传入的空间是足够大时候,才可以考虑能不能在O(1)空间复杂度和O(n)时间复杂度时候完成这个事情。
思路:从头开始拷贝也是巨复杂无比的,因为根本不知道拷贝去哪里,会不会覆盖了本身的字符串。。。
问题根源:在于选择了一个错误的方向,这时候我们可以想想能不能从后往前拷贝呢???如果可以,这样思路就变得很简单了。。。
代码:
int getSpaceNum(char *str){ int spaceNum = 0; if (NULL == str) { return spaceNum; } while(*str++ != '