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

简介: [解题报告]《算法零基础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个数的最小值


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


       image.png

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;
}


结果分析

image.png



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


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);
}


结果分析


image.png


还有谁???


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;
}

结果分析

image.png



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


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;

}

结果分析


image.png


可以了


414. 第三大的数


414. 第三大的数

https://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];
}


结果分析


image.png



凑合


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;          //返回两种情况中较大的
}

结果分析

image.png



凑合


三、今日总结


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


相关文章
|
4天前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-246 算法训练 猴子吃包子
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-246 算法训练 猴子吃包子
37 2
|
4天前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-48 算法训练 关联矩阵
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-48 算法训练 关联矩阵
38 0
|
4天前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-42 算法训练 送分啦
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-42 算法训练 送分啦
38 0
|
4天前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-8 算法训练 操作格子 线段树
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-8 算法训练 操作格子 线段树
29 0
|
4天前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-5 算法训练 最短路
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-5 算法训练 最短路
25 0
|
4天前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-3 算法训练 K好数
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-3 算法训练 K好数
32 0
|
4天前
|
算法 Java Serverless
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-444 算法训练 求和问题
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-444 算法训练 求和问题
34 1
|
4天前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-439 算法训练 简单字符变换
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-439 算法训练 简单字符变换
41 1
|
4天前
|
人工智能 算法 Java
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-7 算法训练 逆序对 平衡二叉树
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-7 算法训练 逆序对 平衡二叉树
36 0
|
4天前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-49 算法训练 寻找数组中最大值
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-49 算法训练 寻找数组中最大值
37 0