第一題:至少是兩倍其他數字的最大數
第一題:
思路一:
1.需要我們返回最大數值的下標,所以先循環(huán)遍歷我們的這個數組記錄一下最大的數值和下標位置。
2.使用qsort排序(總是存在唯一的最大整數)
3所以排序之后的數組的倒數第二個元素就是除了最后一個元素在數組中最大的。
4.只需要判斷這個數的兩倍是否小于等于最大的數值。
5.注意題目的特殊情況是數組中只存在一個元素的時候,這個時候默認他就是最大的直接返回下標0.
int cmp(void* p1,void*p2)
{
return ((*(int*)p1))-((*(int*)p2));
}
int dominantIndex(int* nums, int numsSize){
if(numsSize==1)
return 0;
int MAX=0;
int tmp=0;
for(int i=0;i<numsSize;i++)
{
if(nums[i]>MAX)
{
MAX=nums[i];
tmp=i;
}
}
qsort(nums,numsSize,sizeof(nums[0]),cmp);
if(2*nums[numsSize-2]<=MAX)
{
return tmp;
}
return -1;
}
總結:這個方法的時間復雜度O(log^n+1)n
思路二:
1.可以使用雙指針的方法在一次循環(huán)遍歷中就找到最大的數和次大的數值。
2.定義MAX和MAX_2用來保存。
3.存在最大的數值已經不能更改了,數組后面還存在次大的數值。需要MAX_2去循環(huán)遍歷。
int dominantIndex(int* nums, int numsSize){
if(numsSize==1)
return 0;
int MAX=0;
int MAX_2=0;
int tmp=0;
for(int i=0;i<numsSize;i++)
{
if(nums[i]>MAX)
{
MAX_2=MAX;
MAX=nums[i];
tmp=i;
}
else
{
//一個數組需要走完的
if(nums[i]>MAX_2)
MAX_2=nums[i];
}
}
if(MAX_2*2<=MAX)
{
return tmp;
}
return -1;
}
第二題:兩個數組的交集
第二題:
思路一:
1.動態(tài)開辟一個數組去保存我們的相同的值,定義一個變量k控制這個數組的變化。
2.使用雙for循環(huán)一對多的比較是否相等,相當就保存到數組里面。但是有這樣的一個情況。
3.比較的過程中一個元素已經在之前放進這個數組里面了這個數值是不可以添加進來的。只有第一次進入不需要判斷是否和之前的相等。文章來源:http://www.zghlxwxcb.cn/news/detail-609377.html
int pp(int* ret,int n,int k)
{
int flag=-1;
int i=0;
while(k--)
{
if(*(ret+i)==n)
{
flag=0;
break;
}
else
{
flag=1;
}
i++;
}
return flag;
}
int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) {
int k = 0;
int n1 = nums1Size;
int n2 = nums2Size;
int p1 = 0;
int p2 = 0;
int* ret = (int*)malloc((sizeof(int)) * (n1 + n2));
for(int i=0;i<n1;i++)
{
for(int j=0;j<n2;j++)
{
if(nums1[i]==nums2[j])
{
if(k==0)
{
*ret=nums2[j];
k++;
break;
}
else
{
if(pp(ret,nums2[j],k))
{
*(ret+k)=nums2[j];
k++;
break;
}
}
}
}
}
(*returnSize) = k;
return ret;
}
總結:時間復雜度是O(n^2)文章來源地址http://www.zghlxwxcb.cn/news/detail-609377.html
到了這里,關于C語言每日一題:5.至少是其他數字的兩倍+兩個數組的交集。的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!