leetcode 二分法 最大值最小化/最小值最大化
一、(leetcode 410)分割数组的最大值
题目描述:
给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组。设计一个算法使得这 m 个子数组各自和的最大值最小。
代码如下:
class Solution {public:int splitArray(vector<int>& nums, int m) {long left=nums[0],right=0;for(auto i:nums){right+=i;left=left>i?left:i;}while(right>left){long mid=left+(right-left)/2;long temp=0;int cnt=1;for(auto i:nums){temp+=i;if(temp>mid){temp=i;cnt++;}}if(cnt>m){left=mid+1;}else{right=mid;}}return left;}
};
二、(LeetCode 875)爱吃香蕉的珂珂
题目描述:
珂珂喜欢吃香蕉。这里有 N 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 H 小时后回来。
珂珂可以决定她吃香蕉的速度 K (单位:根/小时)。每个小时,她将会选择一堆香蕉,从中吃掉 K 根。如果这堆香蕉少于 K 根,她将吃掉这堆的所有香蕉,然后这一小时内不会再吃更多的香蕉。
珂珂喜欢慢慢吃,但仍然想在警卫回来前吃掉所有的香蕉。
返回她可以在 H 小时内吃掉所有香蕉的最小速度 K(K 为整数)。
代码如下:
class Solution {public:int minEatingSpeed(vector<int>& piles, int H) {int left=1;//最小每小时吃一根int right=0;//最大每小时吃数组中的最大值for(int num:piles){right=max(right,num);}while(left<right){int mid=left+(right-left)/2;int cnt=0;for(int num:piles){if(num%mid==0){cnt+=num/mid;}else{cnt+=num/mid+1;}}if(cnt>H){left=mid+1;}else{right=mid;}}return left;}
};
三、(LeetCode 1011)在D天内送达包裹的能力
题目描述:
传送带上的包裹必须在 D 天内从一个港口运送到另一个港口。
传送带上的第 i 个包裹的重量为 weights[i]。每一天,我们都会按给出重量的顺序往传送带上装载包裹。我们装载的重量不会超过船的最大运载重量。
返回能在 D 天内将传送带上的所有包裹送达的船的最低运载能力。
代码如下:
class Solution {public:int shipWithinDays(vector<int>& weights, int D) {int left=0;int right=0;for(int num:weights){left=max(left,num);right+=num;}while(left<right){int mid=left+(right-left)/2;int temp=0;int cnt=0;for(int num:weights){if(temp+num>mid){cnt++;temp=0;}temp+=num;}cnt++;if(cnt>D){left=mid+1;}else{right=mid;}}return left;}
};
四、(LeetCode 1482)制作m束花所需的最少天数
题目描述:
给你一个整数数组 bloomDay,以及两个整数 m 和 k 。
现需要制作 m 束花。制作花束时,需要使用花园中 相邻的 k 朵花 。
花园中有 n 朵花,第 i 朵花会在 bloomDay[i] 时盛开,恰好 可以用于 一束 花中。
请你返回从花园中摘 m 束花需要等待的最少的天数。如果不能摘到 m 束花则返回 -1 。
代码如下:
class Solution {public:int minDays(vector<int>& bloomDay, int m, int k) {if(m*k>bloomDay.size()) return -1;int left=0;int right=0;for(int num:bloomDay){right=max(right,num);}while(left<right){int mid=left+(right-left)/2;int cnt=count(bloomDay,mid,k);if(cnt<m){left=mid+1;}else{right=mid;}}return left;}int count(vector<int>nums,int day,int k){int res=0;int temp=0;for(int num:nums){if(num<=day){temp++;}else{temp=0;}if(temp==k){res++;temp=0;}}return res;}
};
五、(LeetCode 1552)两球之间的磁力
题目描述:
在代号为 C-137 的地球上,Rick 发现如果他将两个球放在他新发明的篮子里,它们之间会形成特殊形式的磁力。Rick 有 n 个空的篮子,第 i 个篮子的位置在 position[i] ,Morty 想把 m 个球放到这些篮子里,使得任意两球间 最小磁力 最大。
已知两个球如果分别位于 x 和 y ,那么它们之间的磁力为 |x - y| 。
给你一个整数数组 position 和一个整数 m ,请你返回最大化的最小磁力。
代码如下:
class Solution {public:int count(vector<int>position,int mid){int cnt=1;int pre=position[0];for(int i=1;i<position.size();i++){if(position[i]-pre>mid){cnt++;pre=position[i];}}return cnt;}int maxDistance(vector<int>& position, int m) {sort(position.begin(),position.end());int left=INT_MAX;for(int i=1;i<position.size();i++){left=min(left,position[i]-position[i-1]);}int right=position.back()-position[0];while(left<right){int mid=left+(right-left)/2;if(count(position,mid)>=m){left=mid+1;}else{right=mid;}}return left;}
};
六、(LeetCode 1631) 最小体力消耗路径
题目描述:
你准备参加一场远足活动。给你一个二维 rows x columns 的地图 heights ,其中 heights[row][col] 表示格子 (row, col) 的高度。一开始你在最左上角的格子 (0, 0) ,且你希望去最右下角的格子 (rows-1, columns-1) (注意下标从 0 开始编号)。你每次可以往 上,下,左,右 四个方向之一移动,你想要找到耗费 体力 最小的一条路径。
一条路径耗费的 体力值 是路径上相邻格子之间 高度差绝对值 的 最大值 决定的。
请你返回从左上角走到右下角的最小 体力消耗值 。
思路:
只用dfs,会超时
因此用二分法+dfs
代码如下:
超时代码如下:
class Solution {int res=INT_MAX;int row=0;int col=0;vector<vector<int>>dir={{1,0},{0,1},{-1,0},{0,-1}};
public:int minimumEffortPath(vector<vector<int>>& heights) {row=heights.size();col=heights[0].size();vector<vector<bool>> visited(row,vector<bool>(col,false));visited[0][0]=true;dfs(heights,0,0,INT_MIN,visited);return res;}void dfs(vector<vector<int>>& heights,int x,int y,int m,vector<vector<bool>>& visited){if(x==row-1&&y==col-1){res=min(res,m);return;}for(int k=0;k<dir.size();k++){int i=x+dir[k][0];int j=y+dir[k][1];if(i>=0&&i<row&&j>=0&&j<col&&!visited[i][j]){int n=max(m,abs(heights[i][j]-heights[x][y]));visited[i][j]=true;dfs(heights,i,j,n,visited);visited[i][j]=false;}}}
};
二分法+dfs代码如下:
class Solution {int row=0;int col=0;vector<vector<int>>dir={{1,0},{0,1},{-1,0},{0,-1}};
public:int minimumEffortPath(vector<vector<int>>& heights) {row=heights.size();col=heights[0].size();int left=0,right=1e6,mid;while(left<right){mid=left+(right-left)/2;vector<vector<bool>> visited(row,vector<bool>(col,false));if(dfs(heights,0,0,mid,visited)){right=mid;}else{left=mid+1;}}return left;}bool dfs(vector<vector<int>>& heights,int x,int y,int m,vector<vector<bool>>& visited){if(x==row-1&&y==col-1){return true;}visited[x][y]=true;for(int k=0;k<dir.size();k++){int i=x+dir[k][0];int j=y+dir[k][1];if(i>=0&&i<row&&j>=0&&j<col&&!visited[i][j]&&abs(heights[i][j]-heights[x][y])<=m){if(dfs(heights,i,j,m,visited)){return true;}}}return false;}
};
leetcode 二分法 最大值最小化/最小值最大化相关推荐
- 在程序中设置最小化、最大化、关闭按钮
下面程序ControlBoxTest演示了最小化.最大化.关闭按钮的设置方法及效果. (1)打开VS2008,新建一个Windows窗体应用程序,并命名为ControlBoxTest. (2) ...
- C# Winform实现捕获窗体最小化、最大化、关闭按钮事件的方法,可通过重写WndProc来实现
本文实例讲述了C# Winform实现捕获窗体最小化.最大化.关闭按钮事件的方法,主要是通过重写WndProc来实现的.分享给大家供大家参考.具体方法如下: 主要功能代码如下: ? 1 2 3 4 5 ...
- Monthly Expense POJ - 3273(二分最大值最小化)
Farmer John is an astounding accounting wizard and has realized he might run out of money to run the ...
- UG\NX二次开发 获取UG窗口句柄。实现操作UG窗口最小化、最大化、关闭功能
文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: 获取UG窗口句柄.实现操作UG窗口最小化.最大化.关闭功能 代码: int doWo ...
- Qt 自定义标题栏,最小化、最大化、关闭窗口,双击最大化,鼠标拖动等效果实现
文章目录 前言 效果 代码 .pro文件 widget.h widget.cpp widget.ui title.h title.cpp title.ui 前言 本次实验内容为Qt自定义标题栏,最小化 ...
- linux系统浏览器最小化,调整Firefox火狐浏览器的最小化、最大化、关闭按钮键大小...
在Deepin Linux系统中的Firefox火狐浏览器三大按钮有些小,即最小化.最大化.关闭按钮键小,除了修改主题外,还可以自行修改用户css文件,其实Firefox火狐是支持用户通过css文件对 ...
- Electron无边框窗口(最小化、最大化、关闭、拖动)以及动态改变窗口大小
文章目录 一.目标原型 1. 目标 2. 原型设计 3. 原型初步实现 二.无边框窗口 1. 要点 2. 改造 三.可拖拽区 1. 要点 2. 改造 四.最小化.最大化.关闭 1. 要点 2. 改造 ...
- 监听浏览器最小化与最大化时,执行的动作。
本周做项目时,实现页面内容滚动的一个功能时, 发现在chrome与FF浏览器最小化后,当再次最大化时,滚动出现错位的现象.鉴于此,就去查了下http://html5test.com/ 中是否有相关的支 ...
- C#窗体皮肤制作(二):创建窗体库项目以及最小化、最大化、关闭按钮的实现
很高兴有朋友关注这篇博客,同时也十分抱歉让关注的朋友久等了,隔上一篇博客也有3个月没有更新,主要是由于3月份辞职,4月份初离职到期离开了北京高德,来到了上海张江.目前新工作也处于熟悉当中,希望大家能体 ...
最新文章
- php学习_第6章_PHP的语言结构
- java自动化测试报告_Java自动化测试框架-10 - TestNG之测试结果篇(详细教程)
- Play! Framework 系列(二):play 的项目结构
- citrix POC环境准备
- N多校2018d4t7Maximum Mode
- 2008R2Win7管理八DNS新功能及常规管理
- 6位行政区划代码与4位银行地区代码对应表
- 斗鱼直播实时数据爬取
- 浅谈两点分布,二项分布,伽马分布,指数分布,泊松分布,卡方分布,t分布,F分布,均匀分布,正态分布,β分布,狄利克雷分布--概率分布家族的伦理关系
- QLCDNumber制作的超简单计时器,按下空格键暂停。
- (亲测n次)极其简单的ubuntu,Windows iso 安装方式(双系统或者单系统)
- 代码:matlab求QR分解,QL分解,LQ分解和RQ分解。
- OUC2022秋软件工程第14小组作业
- java+selenium自动化抓取51la数据
- 【mysql优化实战】第一章 建表
- 什么是百度快照?百度快照分析及SEO优化基础工作
- 数据湖:流计算处理框架Flink概述
- 学会结构化思维,成为大牛唾手可得
- errdisabled 障碍处理
- Mac通过MAMP集成安装连接MySQL
热门文章
- Codeforces Round #533(Div. 2) A.Salem and Sticks
- [UOJ] #261 天天爱跑步
- c++的内存管理(raii->shart_ptr->垃圾回收)
- 记忆法——《认知天性》
- 小白题解 Codeforces 794B Cutting Carrot
- C语言实现房贷计算器
- Keepalived+LVS+MariaDB Galera Cluster10.0高可用负载均衡多主复制
- 电路设计学习一:DAC/ADC原理
- java ssi_快速部署SSI框架
- QuickIndex 通讯录快速检索