leetcode_163缺失的空间
给定一个排序的整数数组 nums ,其中元素的范围在 闭区间 [lower, upper] 当中,返回不包含在数组中的缺失区间。
示例:
输入: nums = [0, 1, 3, 50, 75], lower = 0 和 upper = 99,
输出: ["2", "4->49", "51->74", "76->99"]
char ** findMissingRanges(int* nums, int numsSize, int lower, int upper, int* returnSize){ char** ans = malloc(sizeof(char*) * (numsSize + 1)); for (int i = 0; i < numsSize + 1; i++) { ans[i] = malloc(sizeof(char) * 100); } *returnSize = 0; if (numsSize == 0) { if (upper == lower) { sprintf(ans[(*returnSize)++], "%d\0", upper); } else { sprintf(ans[(*returnSize)++], "%d->%d\0", lower, upper); } return ans; } else { if (nums[0] - lower == 1) { sprintf(ans[(*returnSize)++], "%d\0", lower); } if (nums[0] - lower > 1) { sprintf(ans[(*returnSize)++], "%d->%d\0", lower, nums[0] - 1); } for (int i = 0; i < numsSize - 1; i++) { if (nums[i + 1] - nums[i] == 2) { sprintf(ans[(*returnSize)++], "%d\0", nums[i] + 1); } if (nums[i + 1] - nums[i] > 2) { sprintf(ans[(*returnSize)++], "%d->%d\0", nums[i] + 1, nums[i + 1] - 1); } } if (upper - nums[numsSize - 1] == 1) { sprintf(ans[(*returnSize)++], "%d\0", upper); } if (upper - nums[numsSize - 1] > 1) { sprintf(ans[(*returnSize)++], "%d->%d\0", nums[numsSize - 1] + 1, upper); } return ans; } } 解题思路 1、考虑数组为空情况 2、考虑lower和数组头部比较 3、考虑中间数组元素之间比较 4、考虑upper和数组尾部比较 5、考虑整形运算越界情况 代码 /** * Note: The returned array must be malloced, assume caller calls free(). */ //考虑整形越界问题 char ** findMissingRanges(int* nums, int numsSize, int lower, int upper, int* returnSize){ char** res =(char**)calloc(numsSize+2,sizeof(char*)); for(int i=0;i< numsSize+2; i++){ res[i] =(char*)calloc(24, sizeof(char)); } int count = 0; //考虑数组为空情况 if(numsSize == 0){ if(lower == upper) { sprintf(res[count++],"%d",lower); }else { sprintf(res[count++],"%d->%d",lower,upper); } *returnSize = count; return res; } //头部 if((long)nums[0]-1 == lower) { sprintf(res[count++],"%d",lower); }else if((long)nums[0]-2 >= lower) { sprintf(res[count++],"%d->%d",lower,nums[0]-1); } //中间 for(int i=1;i){ if((long)nums[i]-2 == nums[i-1]) { sprintf(res[count++],"%d",nums[i-1]+1); }else if((long)nums[i]-2 > nums[i-1]) { sprintf(res[count++],"%d->%d",nums[i-1]+1,nums[i]-1); } } //尾部 if(nums[numsSize-1] == (long)upper - 1) { sprintf(res[count++],"%d",upper); }else if((long)upper-2 >= nums[numsSize-1]) { sprintf(res[count++],"%d->%d",nums[numsSize-1]+1,upper); } *returnSize = count; return res; }