前言
主要列举一些经典的算法思路
参数解析
这里说明下c语言的话在解题的时候会给出一些参数,如果不能真确的理解这些参数的意义,那么题目中参数赋值就没意义了。
题目
给定一个由 ‘0’ 和 ‘1’ 组成的2维矩阵,返回该矩阵中最大的由 ‘1’ 组成的正方形的面积。输入的矩阵是字符形式而非数字形式。
输入:
[[1,0,1,0,0],[1,0,1,1,1],[1,1,1,1,1],[1,0,0,1,0]]
复制
返回值:
4
题目解析:
意思输入一个二维的矩阵,求1围成的面积
如下所示,注意这里的1 0 均为字符。
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
然后他给的这个函数原型是这样的
int solve(char** matrix, int matrixRowLen, int* matrixColLen ) {
// write code here
}
函数解析
- matrix 二维指针毋庸置疑,因为传入是是一个二维数组嘛,
- matrixRowLen这个代表的是我二维数组有多少行,
- matrixColLen 这其实代表一个数组每个数组的元素代表这个行有多少列
这里可能有的人就不理解了,我们撇开这道题目来说
我举个例子
char *arr[6] ={
“1234”,
“12333”,
“25”
}
我们对应这个函数来说
int solve(char** matrix, int matrixRowLen, int* matrixColLen ) {
- matrix 其实就是arr的地址
- matrixRowLen其实就是3行
- matrixColLen 其实是另一个数组他的值是{4,5,2}
- 只不过上面的比较特殊matrixColLen 的元素都是5
最长子串
子串是连续的子集,子序列不要求字母的连续性
题解
- 这种题目一般就是使用双指正一头一尾,不停滑动。
- 头部出现相同的字母
直接移除第一位即可,比如abc abc - 中间出现相同的字母(每添加一个字母就要和前面的所有字母对比一下)
就需要在来一个循环判断是否中间有重复的, abcd c abdef 这种 - 注意特殊情况要在开始就拦截
int lengthOfLongestSubstring(char * s){
int len = strlen(s);
int start,end,i,max;
start=end=max=0; //必须
if(len=0){
return 0; //必须
}
while(s[end] != '\0') {
i= start;
while(i<end){
if(s[i] == s[end]) {
start = i+1; //如果
}
i++;
}
end++;
max = max > (end - start) ? max : (end - start);
}
return max;
}