《算法基础》线性枚举(一)——最值算法
目录
1、LeetCode——485. 最大连续 1 的个数
2、LeetCode——1464. 数组中两元素的最大乘积
3、LeetCode——153. 寻找旋转排序数组中的最小值
4、LeetCdoe——154. 寻找旋转排序数组中的最小值 II
5、LeetCode——414. 第三大的数
6、LeetCode——628. 三个数的最大乘积
1、LeetCode——485. 最大连续 1 的个数
给定一个二进制数组
nums
, 计算其中最大连续1
的个数。示例:
输入:nums = [1,1,0,1,1,1] 输出:3 解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3.提示:
1 <= nums.length <= 105
nums[i]
不是0
就是1
.
思路:循环遍历,当出现一个1的时候就计数加一,当出现0的时候,把当前的1的个数与之前最大的个数相比。
代码:
int findMaxConsecutiveOnes(int* nums, int numsSize){int max = 0;int count = 0;for(int i = 0; i < numsSize; i++){if(nums[i])count++;else{max = count > max ? count : max;count = 0;}}return max > count ? max : count;
}
2、LeetCode——1464. 数组中两元素的最大乘积
给你一个整数数组 nums,请你选择数组的两个不同下标 i 和 j,使 (nums[i]-1)*(nums[j]-1) 取得最大值。
请你计算并返回该式的最大值。
示例:
输入:nums = [3,4,5,2] 输出:12 解释:如果选择下标 i=1 和 j=2(下标从 0 开始),则可以获得最大值,(nums[1]-1)*(nums[2]-1) = (4-1)*(5-1) = 3*4 = 12 。提示:
2 <= nums.length <= 500
1 <= nums[i] <= 10^3
思路:直接排序数组,然后取最大两个值的乘积
代码:
int cmp(const void* a, const void* b){return *(int*)a - *(int*)b;
}
int maxProduct(int* nums, int numsSize){// 取最大两个数就行qsort(nums,numsSize,sizeof(int),cmp);return (nums[numsSize - 1] - 1) * (nums[numsSize - 2] - 1);
}
3、LeetCode——153. 寻找旋转排序数组中的最小值
已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到:
- 若旋转
4
次,则可以得到[4,5,6,7,0,1,2]
- 若旋转
7
次,则可以得到[0,1,2,4,5,6,7]
注意,数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]] 。
给你一个元素值 互不相同 的数组
nums
,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的 最小元素 。你必须设计一个时间复杂度为O(log n)
的算法解决此问题。示例:
输入:nums = [3,4,5,1,2] 输出:1 解释:原数组为 [1,2,3,4,5] ,旋转 3 次得到输入数组。提示:
n == nums.length
1 <= n <= 5000
-5000 <= nums[i] <= 5000
nums
中的所有整数 互不相同nums
原来是一个升序排序的数组,并进行了1
至n
次旋转
思路:
- 可以直接循环遍历数组,找出最小值
- 用二分法
代码:
int findMin(int* nums, int numsSize){// int min = nums[0];// for(int i = 0; i < numsSize; i++){// if(nums[i] < min) min = nums[i];// }// return min;int left = 0;int right = numsSize - 1;while(left < right){int mid = (left + right) / 2;if(nums[mid] < nums[right])right = mid;else left = mid + 1;}return nums[left];
}
4、LeetCdoe——154. 寻找旋转排序数组中的最小值 II
已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,4,4,5,6,7] 在变化后可能得到
- 若旋转
4
次,则可以得到[4,5,6,7,0,1,4]
- 若旋转
7
次,则可以得到[0,1,4,4,5,6,7]
注意,数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]] 。
给你一个可能存在 重复 元素值的数组
nums
,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的 最小元素 。你必须尽可能减少整个过程的操作步骤。示例:
输入:nums = [1,3,5] 输出:1提示:
n == nums.length
1 <= n <= 5000
-5000 <= nums[i] <= 5000
nums
原来是一个升序排序的数组,并进行了1
至n
次旋转
思路:跟上一题不一样的是,这道题的数组元素可能重复
- 还是使用一次循环遍历
- 二分法,因为元素有可能会相等,所以需要多判断一次
代码:
int findMin(int* nums, int numsSize){// int min = nums[0];// for(int i = 1; i < numsSize; i++){// min = min < nums[i] ? min : nums[i];// }// return min;int left = 0;int right = numsSize - 1;while(left <= right){int mid = (left+right)/2;if(nums[mid] < nums[right])right = mid;else if(nums[mid] > nums[right])left = mid + 1;else right--;}return nums[left];
}
5、LeetCode——414. 第三大的数
给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。
示例:
输入:[3, 2, 1] 输出:1 解释:第三大的数是 1 。示例:
输入:[1, 2] 输出:2 解释:第三大的数不存在, 所以返回最大的数 2提示:
1 <= nums.length <= 104
-231 <= nums[i] <= 231 - 1
思路:一次遍历,用三个变量来代表前三大的值,来进行模拟
代码:
int thirdMax(int* nums, int numsSize){long a = LONG_MIN;long b = LONG_MIN;long c = LONG_MIN;for(int i = 0; i < numsSize; i++){if(nums[i] > a){c = b;b = a;a = nums[i];}else if(a > nums[i] && nums[i] > b){c = b;b = nums[i];}else if(b > nums[i] && nums[i] > c){c = nums[i];}}return c == LONG_MIN ? a : c;
}
6、LeetCode——628. 三个数的最大乘积
给你一个整型数组
nums
,在数组中找出由三个数组成的最大乘积,并输出这个乘积。示例:
输入:nums = [1,2,3] 输出:6示例:
输入:nums = [-1,-2,-3] 输出:-6提示:
3 <= nums.length <= 104
-1000 <= nums[i] <= 1000
思路:将数组排序,然后计算最大的乘积,需要注意的是负数的相乘,直接考虑 最小的两个负数和最大的正数相乘的积 与 最大的三个正整数相乘的积 相比
代码:
int cmp(int* a, int* b){return *a - *b;
}
int max(int a, long b){return a > b ? a : b;
}
int maximumProduct(int* nums, int numsSize){qsort(nums, numsSize, sizeof(int), cmp);// 正数的最大三个数相乘,负数的最小两个数相乘再和最大的正数相乘return max(nums[numsSize-1] * nums[numsSize-2] * nums[numsSize-3],nums[numsSize-1] * nums[0] * nums[1]);
}
文首素材取自博客:《算法零基础100讲》(第17讲) 线性枚举(一) - 最值算法_英雄哪里出来的博客-CSDN博客
《算法基础》线性枚举(一)——最值算法相关推荐
- 【山无遮,海无拦】LeetCode题集 线性枚举之最值算法
目录 1464.数组中两元素的最大乘积 法一:线性扫描 法二:排序 485. 最大连续 1 的个数 法一:线性扫描 153. 寻找旋转排序数组中的最小值 法一:线性扫描 法二:二分法 154. 寻找旋 ...
- 数据结构和算法基础--线性表
数据结构和算法基础–线性表 数据结构 = 数据的逻辑结构+数据的存储结构+数据的运算 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-28ek7MfI-164242629 ...
- 【老生谈算法】matlab实现模糊K-均值算法——均值算法
模糊K-均值算法及其matlab实现 1.文档下载: 本算法已经整理成文档如下,有需要的朋友可以点击进行下载 序号 文档(点击下载) 本项目文档 [老生谈算法]模糊K-均值算法及其matlab实现.d ...
- 【算法基础】常用的数据结构与算法
学习了王争老师的数据结构与算法之美之后,比较有感触,他把我们常用的数据结构和算法都讲了一遍,而且讲的还不错.整理汇总一下作为笔记. 一.复杂度分析 非常重要.我们必须掌握,基本上要做到,简单代码能很快 ...
- 算法基础(枚举)--- 熄灯问题(C语言)
描述: 有一个由按钮组成的矩阵,其中每行有6个按钮,共5行,每个按钮的位置有一盏灯,当按下一个按钮后,该按钮以及周围位置(上边,下边,左边,右边)的灯都会改变状态. 如果灯原来是点亮的就会被熄灭,原来 ...
- 算法基础之枚举2:生理周期
生理周期 描述: 人生来就有三个生理周期,分别为体力.感情和智力周期,它们的周期长度为23 天. 28 天和33 天.每一个周期中有一天是高峰.在高峰这天,人会在相应的方面表现出色.例如,智力周期的高 ...
- 【算法基础】十大经典排序算法(动图)
算法分类 冒泡排序(重点) 选择排序 插入排序 归并排序(重点) 快速排序(重点) 堆排序(重点) 计数排序 基数排序 本文的重点排序方法在:冒泡排序,归并排序,快速排序,桶排序. 文末有学习资料免费 ...
- 【数据结构与算法基础】模式匹配问题与KMP算法
前言 数据结构,一门数据处理的艺术,精巧的结构在一个又一个算法下发挥着他们无与伦比的高效和精密之美,在为信息技术打下坚实地基的同时,也令无数开发者和探索者为之着迷. 也因如此,它作为博主大二上学期最重 ...
- 算法基础14 —— 图论入门之弗洛伊德算法(Floyed + Dijkstra + Bellman-Ford + SPFA)
入门概念 带权图:如下图所示,我们把边带有权值的图称为带权图 可以将边的权值理解为两点之间的距离 一张图中任意两点间会有不同的路径相连 最短路径:最短路径就是指连接两点的这些路径中最短的一条 Floy ...
- python程序设计与算法基础第二版课后答案_python算法与程序设计基础答案
python算法与程序设计基础答案 更多相关问题 [单选] 农产品质量安全法所称农产品,是指来源于农业的(),即在农业活动中获得的植物.动物.微生物及其产品. [单选] 设有关系Students(学号 ...
最新文章
- 加速数据中心变革,Xilinx推出软件定义、硬件加速型 Alveo SmartNIC
- 拆解多轴步进电机控制器
- 四张照片合成一张怎么弄_精美!多张照片组合成一张的拼贴画,每一幅都令人惊叹...
- textarea回车不换行 小程序_微信小程序商城到底值得不值得开通?
- 莱洛三角形和定宽曲线
- 为了多拿点补贴,马斯克甚至还当过“渣男”?
- 域名转让代码_互联网域名转让协议(中英)
- 【脑洞探究】等公交该站在哪儿比较合适?——关于减少吸入空气污染物(pm2.5 or 雾霾等)而选择合适等候公交车位置的探究
- HTML段落前面怎么加黑点,Word文档段落前面的那个小黑点,是怎么搞出来得呀?...
- 速学Sql Server从基础到进阶
- 基于Wemos的感应开盖垃圾桶
- [机房测试]数字谜题
- 抽奖动画 - lao虎机抽奖,手把手教你做一个抽奖机软件
- 上班拍抖音需谨慎!Tiktok「科技网红」因自拍泄密被苹果解雇
- CSS-justify-content 属性
- 一些经典的召回算法模型
- fileupload文件上传、下载教程
- 大四毕业生的牌局:谁输了就去骚扰女生宿舍(ZT)
- 大数据早报:亚马逊最大风力发电站投入使用 MongoDB上市首日股价飙涨34%(10.21)
- 雅马哈摩托车左曲轴箱盖工艺及夹具设计(说明书+CAD图纸+工序+开题报告)
热门文章
- 干货 | 手把手教你iOS自定义视频压缩
- matlab tif dpi,轻松解决杂志要求的300dpi分辨率、TIFF格式图片
- #PRBS# PRBS7高速串行总线的常用测试码型
- VMware 安装 Linux 系统
- [http]http转义和加解密方法
- php 获取手机设备的ID,获取苹果设备的UDID
- 垃圾小白羊leetcode刷题记录2
- OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000005c0000000, 5726797824, 0) failed;
- Linux文件目录sha256,在Linux系统中使用SHA256来校验下载的文件的方法
- 两军对垒问题及个人的思考