线性枚举(一)

题目一:

int findMaxConsecutiveOnes(int* nums, int numsSize)
{
    int cnt1=0;
    int cnt2=0;
    for(int i=0;i<numsSize;i++)    
    {
        if(nums[i]==1)
             cnt1++;
        if(cnt1>cnt2)
        {
            cnt2=cnt1;
        }
        if(nums[i]!=1)
            cnt1=0;
    }
    return cnt2;
}

 题目2:

 方法一:排序

int change(void*num1,void*num2)
{
    return *(int*)num1-*(int*)num2;
}
int maxProduct(int* nums, int numsSize)
{
    qsort(nums,numsSize,sizeof(int),change);//change代表了元素的间隔
    return (nums[numsSize-2]-1)*(nums[numsSize-1]-1);
}

方法二:线性枚举

int maxProduct(int* nums, int numsSize)
{
    int max=nums[0];
    int smax=nums[1];
    for(int i=1;i<numsSize;i++)
    {
        if(nums[i]>max)
        {
            smax=max;
            max=nums[i];
        }
        else if(nums[i]==max)
        {
            smax=nums[i];
        }
        else if(nums[i]>smax&&nums[i]<max)
            smax=nums[i];
    }
    int ret=(max-1)*(smax-1);
    return ret;
}

题目3:

int change(void*num1,void*num2)
{
    return *(int*)num1-*(int*)num2;
}
int findMin(int* nums, int numsSize)
{
    qsort(nums,numsSize,sizeof(int),change);
    return nums[0];
}

题目4:

//二分查找
int findMin(int* nums, int numsSize)
{
    int right=numsSize-1;
    int left=0;
    while(left<right)
    {
        int mid=(right+left)/2;
        if(nums[mid]>nums[right])
        {
            left=mid+1;
        }
        else if(nums[mid]<nums[right])
            right=mid;
        else if(nums[mid]==nums[right])
            right-=1;
    }
    return nums[left];
}

 题目5:

int thirdMax(int* nums, int numsSize)
{
    long long first=LONG_MIN;
    long long second=LONG_MIN;
    long long third=LONG_MIN;
    if(numsSize==2)
    {
        return nums[0]>nums[1]?nums[0]:nums[1];
    }
    else if(numsSize==1)
        return nums[0];
    else if(numsSize>2)
    {
        for(int i=0;i<numsSize;i++)
        {
        if(nums[i]>first)
        {
            third=second;
            second=first;
            first=nums[i];
        }
        else if(nums[i]<first&&nums[i]>second)
        {
            third=second;
            second=nums[i];
        }
        else if(nums[i]<second&&nums[i]>third)
        {
            third=nums[i];
        }
        }
    }
    if(third==LONG_MIN)
        return first;
    return third;
}

 题目6:

int maximumProduct(int* nums, int numsSize)
{
    int sfirst=INT_MAX;
    int ssecond=INT_MAX;
    int first=INT_MIN;
    int second=INT_MIN;
    int third=INT_MIN;
         for(int i=0;i<numsSize;i++)
         {
            if(nums[i]<=sfirst)
            {
                ssecond=sfirst;
                sfirst=nums[i];
            }
            else if(nums[i]>sfirst&&nums[i]<=ssecond)
                ssecond=nums[i];
            if(nums[i]>=first)
            {
            third=second;
            second=first;
            first=nums[i];
            }
            else if(nums[i]<first&&nums[i]>=second)
            {
            third=second;
            second=nums[i];
            }
            else if(nums[i]<second&&nums[i]>=third)
            {
            third=nums[i];
            }
        }
        return first*second*third>first*ssecond*sfirst?first*second*third:first*sfirst*ssecond;
}

  • 11
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

影中人lx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值