leetcode 11-20

版权声明:随意转载,注明链接地址即可 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、最接近的三数之和

猜你喜欢

转载自blog.csdn.net/weixin_38812277/article/details/84727146