[解题报告]《算法零基础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



凑合


三、今日总结


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


相关文章
|
6月前
|
算法 Java Serverless
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-444 算法训练 求和问题
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-444 算法训练 求和问题
56 1
|
6月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-439 算法训练 简单字符变换
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-439 算法训练 简单字符变换
54 1
|
4天前
|
算法 C# 索引
C#线性查找算法
C#线性查找算法!
|
2月前
|
机器学习/深度学习 算法 Java
[算法与数据结构] 谈谈线性查找法~
该文章详细介绍了线性查找法的基本概念与实现方法,通过Java代码示例解释了如何在一个数组中查找特定元素,并分析了该算法的时间复杂度。
|
1月前
|
算法 Java 程序员
【算法每日一练及解题思路】有n级台阶,一次只能上1级或2级,共有多少种走法?
本文深入解析了“爬楼梯问题”,探讨了递归与迭代两种解法,并提供了Java代码实现。通过分析问题本质,帮助读者理解动态规划技巧,提高解决实际编程问题的能力。关键词:Java, 算法, 动态规划, 爬楼梯问题, 递归, 迭代。
65 0
|
1月前
|
算法 C++
【算法解题思想】动态规划+深度优先搜索(C/C++)
【算法解题思想】动态规划+深度优先搜索(C/C++)
|
1月前
|
人工智能 算法 BI
【算法】 线性DP(C/C++)
【算法】 线性DP(C/C++)
|
3月前
|
算法 5G vr&ar
基于1bitDAC的MU-MIMO的非线性预编码算法matlab性能仿真
在现代无线通信中,1-bit DAC的非线性预编码技术应用于MU-MIMO系统,旨在降低成本与能耗。本文采用MATLAB 2022a版本,深入探讨此技术,并通过算法运行效果图展示性能。核心代码支持中文注释与操作指导。理论部分包括信号量化、符号最大化准则,并对比ZF、WF、MRT及ADMM等算法,揭示了在1-bit量化条件下如何优化预编码以提升系统性能。
|
5月前
|
算法 C语言
数据结构和算法学习记录——栈和队列习题-用队列实现栈、用栈实现队列(核心思路、解题过程、完整题解)二
数据结构和算法学习记录——栈和队列习题-用队列实现栈、用栈实现队列(核心思路、解题过程、完整题解)二
42 2
|
5月前
|
存储 算法 NoSQL
数据结构和算法——哈希查找冲突处理方法(开放地址法-线性探测、平方探测、双散列探测、再散列,分离链接法)
数据结构和算法——哈希查找冲突处理方法(开放地址法-线性探测、平方探测、双散列探测、再散列,分离链接法)
133 1