目录
本人实力有限可能对一些地方解释和理解的不够清晰,可以自己尝试读代码,或者评论区指出错误,望海涵!
感谢大佬们的一键三连! 感谢大佬们的一键三连! 感谢大佬们的一键三连!
选择题:
题一:
题二:
题三:
题四:
题五:
编程题:
题一:至少是其他数字两倍的最大数
747. 至少是其他数字两倍的最大数 - 力扣(LeetCode)
思路一:
排序查找法:
第一步:将原数组拷贝一份,然后直接将数组按升序排序;
第二步:判断倒数第一位是不是倒数第二位的两倍,不是:直接返回;是:记录最后一位的值;
第三步:然后遍历原数组找到下标返回。
//比较函数升序
int my_cmp(const void* p1,const void* p2)
{
return *(int*)p1 - *(int*)p2;
}
int dominantIndex(int* nums, int numsSize)
{
if(numsSize == 1)
{
return -1;
}
int num[1000] = {0};
//拷贝一份到num中
memcpy(num,nums,sizeof(nums[0])*numsSize);
//将num数组的元素升序排序
qsort(num,numsSize,sizeof(nums[0]),my_cmp);
//比较后两个是否满足题目条件
if(num[numsSize-1] >= num[numsSize-2]*2)
{
//记录最大元素
int count = num[numsSize-1];
//查找最大元素
for(int i = 0;i < numsSize;i++)
{
if(nums[i] == count)
{
return i;
}
}
}
return -1;
}
思路二:
下标比较法:
第一步:分别从用来找次小值a= -1 ,用来找最大值b= 0 下标开始遍历数组;
第二步:如果当前遍历过程中的值比下标“ b ”的值大,那么a记录b和b记录当前最大值,当当前遍历值比b下标值小或者下标不在数组中,就将当前遍历值给a,通过循环达到a为次小值,b为最大值;
第三步:然后判断是否为两倍,是输出b,不是则输出“-1”。
int dominantIndex(int* nums, int numsSize)
{
if(numsSize == 1)
return 0;
int a = -1
int b = 0;
for(int i = 1; i < numsSize; i++)
{
if (nums[i] > nums[b])
{
a = b; b = i;
}
else if (a == -1 || nums[i] > nums[a])
{
a = i;
}
}
return nums[b] >= nums[a] * 2 ? b : -1;
}
题二:两个数组的交集
349. 两个数组的交集 - 力扣(LeetCode)
思路一:
第一步:首先分别将两个数组按升序排列,开辟足够容纳交集大小的数组tmp;
第二步:同时遍历两个数组:只要任意一个数组遍历结束,就结束,当数组值相同时,第一次放数据或者不重复,则将数据存放到tmp数组中,否则:数组1值比数组2值小,数组1下标增加,反之数组2下标增加,循环操作,直到一个数组遍历结束;
第三步:然后返回tmp数组。
//升序排列
int my_cmp(const void* p1,const void* p2)
{
return *(int*)p1 - *(int*)p2;
}
int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize)
{
//分别将两个数组按升序排列
qsort(nums1,nums1Size,sizeof(nums1[0]),my_cmp);
qsort(nums2,nums2Size,sizeof(nums1[0]),my_cmp);
//开辟足够容纳交集大小的数组
int* tmp = (int*)malloc(sizeof(nums1[0])*(nums1Size + nums2Size));
*returnSize = 0;
//遍历两个数组的下标
int s1 = 0;
int s2 = 0;
//只要任意一个数组遍历结束,就结束
while(s1 < nums1Size && s2 < nums2Size)
{
//数组值相同
if(nums1[s1] == nums2[s2])
{
//保证唯一性
if(!(*returnSize) || tmp[(*returnSize)-1] != nums1[s1])
{
tmp[(*returnSize)++] = nums1[s1];
}
s1++;
s2++;
}
//数组1值比数组2值小,数组1下标增加,反正数组2下标增加
else if(nums1[s1] < nums2[s2])
{
s1++;
}
else
{
s2++;
}
}
return tmp;
}
本人实力有限可能对一些地方解释和理解的不够清晰,可以自己尝试读代码,或者评论区指出错误,望海涵!
感谢大佬们的一键三连! 感谢大佬们的一键三连! 感谢大佬们的一键三连!