版权声明:随意转载,注明链接地址即可 https://blog.csdn.net/weixin_38812277/article/details/84727146
简洁笔记,只贴上少数难题和通不过的代码
11、盛水最多容器
方法1:暴力法,所有的可能性都算一遍,比较一次
方法2:一层循环,每次移动小的,为了找更大的
12、整数转罗马数字
把0-3999分好段,考虑临界情况,字符串加'\0’即可。从高位开始
13、罗马数字转整数
从低位开始,逆向
14、最长公共前缀
把临界情况单独拿出来,不进入循环,可以提高速度,所以leetcode的速度是所有测试集的运行时间。
15、三数之和:
错误代码:
做此题时出现的错误:
1、指向整型指针的指针:int** ,开辟足够多的指向满足条件数组的地址指针空间。
int** r = (int**)malloc(sizeof(int*)*(numsSize*(numsSize-1)*(numsSize-2)/6));
2、continue和break的使用
3、最后的代码如下,始终通不过。(有高手看到麻烦指出错误所在,报错上图:Line 31: store to null pointer of type 'int *')
/**
* Return an array of arrays of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
void sort(int* nums,int numsSize){
int i,temp ;
for(;numsSize-1;numsSize--){
for( i=0;i<numsSize-1;i++){
if(nums[i]>nums[i+1]){
temp = nums[i];
nums[i] = nums[i+1];
nums[i+1] = temp;
}
}
}
}
int** threeSum(int* nums, int numsSize, int* returnSize) {
int** r = (int**)calloc((numsSize*(numsSize-1)*(numsSize-2)/6),sizeof(int*));
int count=0;
int temp[3];
if(numsSize < 3){
*returnSize = 0;
return r;
}
sort(nums,numsSize);
int i,j,k,m;
for( i=0;i<numsSize-2;i++){
for( j=i+1,k=numsSize;j<k;){
if(nums[i]+nums[j]+nums[k] == 0){
r[count] = (int*)malloc(3*sizeof(int));
r[count][0] = nums[i];
r[count][1] = nums[j];
r[count][2] = nums[k];
count++;
j++;
}
if(nums[i]+nums[j]+nums[k] < 0) j++;
if(nums[i]+nums[j]+nums[k] > 0) k--;
while(nums[j]==nums[j+1] && j<k) j++;
}
while(nums[i]==nums[i+1] && i<numsSize-2) i++;
}
*returnSize = count;
return r;
}
16、最接近的三数之和