学习二分查找
题目:给定一个包含 [0, n]
中 n
个数的数组 nums
,找出 [0, n]
这个范围内没有出现在数组中的那个数。(leetcode 268)
方法一:选择排序
先将数组中的数据进行排序(这里使用选择排序)。排序之后数组元素就会和下标相等,我们一个一个找,不相等的时候就可以找到丢失的数字。
int missingNumber(int* nums, int numsSize){
int begin = 0;
int t;
for(int i = 1;i < numsSize;i++){
int min = nums[begin];
t = begin;
for(int j = begin + 1;j < numsSize;j++){
if(min > nums[j]){
min = nums[j];
t = j;
}
}
nums[t] = nums[begin];
nums[begin] = min;
begin++;
}
for(int i = 0;i < numsSize;i++){
if(i != nums[i]){
return i;
}
}
return numsSize;
}
方法二:使用qsort()函数
思路和方法一一样,但是排序是通过函数qsort()来实现的。
#include <stdlib.h>
int cmp_int(const void* elem1, const void* elem2)
{
return *(int*)elem1-*(int*)elem2;
}
int missingNumber(int* nums, int numsSize){
qsort(nums,numsSize,sizeof(int),cmp_int);
for(int i = 0;i < numsSize;i++){
if(i != nums[i]){
return i;
}
}
return numsSize;
}
方法三(二分查找):
#include <stdlib.h>
int cmp_int(const void* elem1, const void* elem2)
{
return *(int*)elem1-*(int*)elem2;
}
int missingNumber(int* nums, int numsSize){
qsort(nums,numsSize,sizeof(int),cmp_int);
int left ,right;
int n = numsSize;
while(numsSize >= 0){
left = 0;
right = n - 1;
while(left < right){
int mid = (right + left + 1) / 2;
if(nums[mid] <= numsSize){
left = mid;
}else{
right = mid - 1;
}
}
if(nums[left] != numsSize){
break;
}
numsSize--;
}
return numsSize;
}