问题描述:给你一个整数数组 nums
。如果任一值在数组中出现 至少两次 ,返回 true
;如果数组中每个元素互不相同,返回 false
。
(来源:leetcode)
解法一:暴力解法,双重for循环,操作简单,但是性能太差
解法二:排序判断
bool containsDuplicate(int* nums, int numsSize){
if(!nums || numsSize < 2) return false;
int temp[numsSize], i, j = 0, num = 1;
temp[0] = nums[0];
for(i = 1; i < numsSize; i++){
while(j < num && nums[i] > temp[j]){
//j < num:控制插入范围
//nums[i]>temp[j]:控制准确的插入位置
j++;
}//while
//跳出while循环,说明已经找到插入位置,需要进一步判断
if(j >= num){
// j>=num说明之前nums[i]大于当前temp中所有数值,应该放到最后
temp[j] = nums[i];
num++;
j = 0;
}
else if(nums[i] == temp[j]) return true; //判断是否存在重复元素
else{ // 这里的情况是nums[i] < temp[j],说明找到了位于中间的某个插入位置,需要元素迁移
int k = num - 1;
while(k >= j){
temp[k+1] = temp[k];
k--;
}
temp[j] = nums[i];
num++;
j = 0;
}
}
return false;
}
//对于解法二来说,直接插入排序不如折半更好