[解题报告]《算法零基础100讲》(第17讲) 线性枚举(一)

目录

零、写在前面

一、主要知识点

        1.n个数的最小值

        2.qsort函数(补充知识点)

        3.求次大值的扫描一遍的方式(补充知识点)

二、课后习题 

485. 最大连续 1 的个数

主要思想

结果分析

1464. 数组中两元素的最大乘积

主要思想

结果分析

153. 寻找旋转排序数组中的最小值

主要思想

结果分析

 153. 寻找旋转排序数组中的最小值

主要思想

结果分析

628. 三个数的最大乘积

主要思想

结果分析

三、今日总结


零、写在前面

         这是打卡的第十七天,今天题目比较简单,我补充了两个知识点,主要知识点在
《算法零基础100讲》(第17讲) 线性枚举(一) - 最值算法_英雄哪里出来-CSDN博客遇事不决就枚举https://blog.csdn.net/WhereIsHeroFrom/article/details/121174370

一、主要知识点

        1.n个数的最小值

        主要利用到的思想就是两两比较,就可以得到最终的最小值。

        m_{i}=\left\{\begin{matrix}a_{i} \\ Min(m_{i-1},a_{i}) \end{matrix}\right.

int Min(int a, int b) {                 // 返回较小值
    return a < b ? a : b;
}

int findMin(int* nums, int numsSize){
    int i;
    int min = 100000001;                // 初始化最大值为最小
    for(i = 0; i < numsSize; ++i)
        min = Min(min, nums[i]);        // 迭代求解
    return min;
}

        2.qsort函数(补充知识点)

       c语言自带的一个函数,叫做qsotr可以帮助我们完成排序,再求最大值就会很容易。

void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))

        一共有四个参数,数组指针,数组大小,数组内变量大小,比较函数指针。看下面示例。

int cmp(int *a,int *b){        //比较函数
    return *b > *a;            //从大到小
}

qsort(nums,numsSize,sizeof(int),&cmp);//排序算法 

        3.求次大值的扫描一遍的方式(补充知识点)

       我们求最小值其实是通过扫描一遍数组不断比较得到的。假如我们在同时希望能得到次大值该怎么做的?其实最大值是不断更新的,如果我们把max上一次更新的值保存下来是不是就可以得到了?但是一开始就遇到最大值咋办呢?我们在剩下的元素找到最大值就行了不是么?看看代码理解一下

    for(int i = 0;i < numsSize;i++){
        if(nums[i] > max) max2 = max,max = nums[i];
        else if(nums[i] > max2) max2 = nums[i];
    }

二、课后习题 

485. 最大连续 1 的个数

485. 最大连续 1 的个数https://leetcode-cn.com/problems/max-consecutive-ones/

数数最多多少个1连续。

主要思想

从前到后扫描,用变量计数,更新结果就好了。。看代码

int findMaxConsecutiveOnes(int* nums, int numsSize){
    int ans = 0,i = 0;
    while(i < numsSize){
        int count = 0;                 //计数这次连续1的个数
        while(i < numsSize && nums[i++] == 1 ) count++;
        if(count > ans) ans = count;    //更新计数
    }
    return ans;
}

结果分析

还是可以的。满意了,下一个


1464. 数组中两元素的最大乘积

1464. 数组中两元素的最大乘积https://leetcode-cn.com/problems/maximum-product-of-two-elements-in-an-array/

主要思想

 这难道不是找到最大的两个数相乘不就完了?用我补充知识点。

int maxProduct(int* nums, int numsSize){
    int ans = 0, max = 0,max2 = 0;
    for(int i = 0;i < numsSize;i++){
        if(nums[i] > max) max2 = max,max = nums[i];//更新最大值和次大值
        else if(nums[i] > max2) max2 = nums[i];    //如果一开始就是最大值,更新次大值
    }
    return (max - 1) * (max2 - 1);
}

结果分析

还有谁???


153. 寻找旋转排序数组中的最小值

153. 寻找旋转排序数组中的最小值https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array/

主要思想

 看着复杂,,,从前到后扫一遍完事。。。

int findMin(int* nums, int numsSize){
    int ans = 50000;
    for(int i = 0;i < numsSize;i++)
        if(ans >nums[i]) ans = nums[i];
    return ans;
}

结果分析

 可以二分,但是感觉没必要。。。


 153. 寻找旋转排序数组中的最小值

153. 寻找旋转排序数组中的最小值https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array/

主要思想

 看着复杂,,,从前到后扫一遍完事。。。

int findMin(int* nums, int numsSize){
    int ans = 50000;
    for(int i = 0;i < numsSize;i++)
        if(ans >nums[i]) ans = nums[i];
    return ans;
}

结果分析

可以了


414. 第三大的数

414. 第三大的数icon-default.png?t=LA46https://leetcode-cn.com/problems/third-maximum-number/

主要思想

这道题其实直接进行排序再进行计算排名就好了。

int cmp(int *a,int *b){
    return *b > *a;
}

int thirdMax(int* nums, int numsSize){
    qsort(nums,numsSize,sizeof(int),&cmp); //排序
    int i = 1,mingci = 1;    
    while(i < numsSize)                  //计算排名       
        if(nums[i++] != nums[i - 2]){
            mingci++;                //不相等排名加
            if(mingci == 3) break;    //到第三名就退出
        }
    return mingci == 3 ? nums[i - 1]:nums[0];
}

结果分析

凑合


628. 三个数的最大乘积

628. 三个数的最大乘积https://leetcode-cn.com/problems/maximum-product-of-three-numbers/

主要思想

这道题把。。它有负数。。这就很难受。

最大值分为两种情况。一种是最大的三个数乘积,另外就是最大和最小的两个乘积。看看结果比较输出就好了。

int maximumProduct(int* nums, int numsSize){
    int max1 = -1000, max2 = -1000,max3 = -1000,min = 1000, min2 = 1000;
    for(int i = 0;i < numsSize;i++){
        if(nums[i] >= max1) max3 = max2,max2 = max1,max1 = nums[i];//最大值
        else if(nums[i] > max2) max3 = max2 ,max2 = nums[i];        //次大值
        else if(nums[i] > max3) max3 = nums[i];                    //第三大
        if(nums[i] <= min) min2 = min,min = nums[i];            //最小值
        else if(nums[i] < min2) min2 = nums[i];                   //第二最小?
    }
    int a = max1 * max2 * max3;                    
    int b = max1 * min * min2;
    return a > b ? a : b;          //返回两种情况中较大的
}

结果分析

凑合


三、今日总结

今天的难度不高,但是还挺好玩的。继续刷题去了。。。。

猜你喜欢

转载自blog.csdn.net/qq_17593855/article/details/121179585